如何将控制从我的引导加载程序转移到位于硬盘驱动器中的应用程序

Posted

技术标签:

【中文标题】如何将控制从我的引导加载程序转移到位于硬盘驱动器中的应用程序【英文标题】:How to transfer the control from my boot loader to the application located in hard drive 【发布时间】:2013-11-24 23:40:17 【问题描述】:

我在 Windows 上使用 NASM 并在 VMware 上对其进行测试,并成功制作了我的引导加载程序。现在我希望我的引导加载程序将控制权转移到某个应用程序(比如我想模拟内核的工作),但是我想加载一些应用程序而不是内核?您能否给我一些提示,如何根据扇区、磁头等在 HDD 中定位文件,然后加载到 RAM 中?

我知道内核位于地址 2000h 也是一个中断 13h,它将硬盘信息加载到 RAM 中,但是如何找到确切的扇区,前往该文件?

【问题讨论】:

你可能会发现这个有用:wiki.osdev.org/… 【参考方案1】:

如果您可以访问Logical Block Addressing 扩展,则将扇区加载到内存中会容易得多。您仍将使用 INT 0x13 中断,但将 AH 设置为 0x42。您只需指定起始扇区索引和要加载的连续扇区数和位置。

在不实现文件系统的情况下,您必须将应用程序放置在距磁盘映像开头的某个已知偏移处。加载后,您只需跳转到加载扇区的地址即可。

弄错一个细节会导致模拟 CPU 出现三倍故障,因此请确保您手头有一个可用的 print string function。


Bios 会将引导加载程序从扇区 0 加载到 0x7c00。您可以简单地将您的应用程序放置在扇区大小的某个倍数上。假设扇区大小为 512 字节,那么它应该如下所示:

扇区 0(偏移量 0):引导加载程序 -> 0x7c00 扇区 1(偏移 512):应用程序 -> 0x7e00 或您选择的任何地址

如果您将应用程序加载到0x7e00,那么您只需执行jmp 0x0:0x7e00 即可运行它。

我不知道任何用于 Windows 的工具来创建磁盘映像,但如果您希望所有内容都在同一个文件中,您始终可以使用汇编程序正确填充偏移量。


由于我前段时间编写的引导加载程序中的代码,我不妨分享一些示例(NASM 语法):

BITS 16

ORG 0x7c00

entry:
    xor ax, ax      ; Explicitly set DS=0 
    mov ds, ax
    mov ss, ax      ; Set SS:SP out the way (below the bootloader) at 0x0000:0x7c00
    mov sp, 0x7c00

    mov ah, 0x42 ; set to lba extended read
    mov dl, 0x80 ; first hard drive
    mov si, dap  ; address of disk address package

    int 0x13     ; execute

    jc .load_failed ; do something on failure

    jmp 0x0:0x7e00 ; jump to the destination address


ALIGN 16

; this is the disk address package used by the lba extensions
dap:
db 0x10   ; size of this package
db 0x0    ; reserved
dw 0x1    ; number of sectors to load
dd 0x7e00 ; destination address
dq 0x1    ; sector index to load

; pad to assumed sector size. this will overwrite the partition table
TIMES 510 - ($ - $$) db 0

; boot signature
dw 0xaa55

; either write your app here or concatenate a separate .bin file

【讨论】:

如果我在 .iso(图像文件)上执行此操作,我该怎么办?我的意思是在我的第一个扇区的 iso 中,它们是引导加载程序,所以在我的下一个扇区中,我的应用程序的 .bin 文件?所以它在对应于那个iso文件的第二个扇区?那么,为了运行该应用程序,我必须执行哪些步骤? @user2984278 是的。我扩展了我的答案以使其更清楚。您需要使用 INT 0x13 AH=0x42 中断将存储应用程序的扇区加载到 1 MiB 标记以下的某个可用地址,假设您仍处于禁用 A20 线的实模式。 @user2984278 我添加了一个可以解释一切的示例。

以上是关于如何将控制从我的引导加载程序转移到位于硬盘驱动器中的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

详解CentOS 7的引导过程与服务器控制

操作系统--主引导程序控制权的转移

CentOS 7 引导过程与服务管理简介

从硬盘驱动器中永久删除文件

MBR的位置是不是位于C盘?

如何制作可引导的iso(不是cd或flash驱动器)来测试自己的引导加载程序?