1

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

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

4

1 回答 1

0

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

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

弄错一个细节会使模拟 CPU 出现三倍故障,因此请确保您手头有一个有效的打印字符串功能


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
于 2013-11-12T23:39:51.563 回答