我在 Windows 上使用 NASM 并在 VMware 上对其进行测试,并成功制作了我的引导加载程序。现在我希望我的引导加载程序将控制权转移到某个应用程序(比如我想模拟内核的工作),但是我想加载一些应用程序而不是内核?你能给我一些提示,如何在扇区、磁头等方面定位硬盘中的文件,然后加载到内存中吗?
我知道内核位于地址 2000h 也是一个中断 13h,它将硬盘信息加载到 RAM 中,但是如何找到确切的扇区,指向该文件?
我在 Windows 上使用 NASM 并在 VMware 上对其进行测试,并成功制作了我的引导加载程序。现在我希望我的引导加载程序将控制权转移到某个应用程序(比如我想模拟内核的工作),但是我想加载一些应用程序而不是内核?你能给我一些提示,如何在扇区、磁头等方面定位硬盘中的文件,然后加载到内存中吗?
我知道内核位于地址 2000h 也是一个中断 13h,它将硬盘信息加载到 RAM 中,但是如何找到确切的扇区,指向该文件?
如果您可以访问逻辑块寻址扩展,则将扇区加载到内存中会容易得多。您仍将使用 INT 0x13 中断,但AH
设置为0x42
. 您只需指定起始扇区索引和要加载的连续扇区数和位置。
在不实现文件系统的情况下,您必须将应用程序放置在距磁盘映像开头的某个已知偏移处。加载后,您只需跳转到加载扇区的地址。
弄错一个细节会使模拟 CPU 出现三倍故障,因此请确保您手头有一个有效的打印字符串功能。
BIOS 会将引导加载程序从扇区 0 加载到0x7c00
. 您可以简单地将您的应用程序放置在扇区大小的某个倍数上。假设扇区大小为 512 字节,那么它应该如下所示:
0x7c00
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