我在汇编中编写一个bootloader,它似乎在qemu,bochs和virtualbox上工作正常 . 但是,它并没有在真实硬件上加载内核(似乎) .
引导程序通过将一个字符写入视频内存(用于调试)开始,然后从驱动器读取扇区2并远程跳转到内核 . 然后内核将一些字符写入视频内存 .
在一台真机上,我在屏幕上看到引导加载程序中的字符,然后它挂起(闪烁的插入符号) .
我试图将DS,ES,SI设置为零,我也在设置堆栈段 .
我正在使用bios int 13函数2读取驱动器的扇区2 . 我有点怀疑它与驱动器号有关 . 我都尝试使用在启动时传递给引导加载程序的驱动器号(在dl中),并手动将其设置为0x0,0x80和0x81 .
我注意到的一个奇怪的事情是我用来接近跳跃的标签,神奇地得到了正确的地址 . 使用objdump我看到例如:jmp 0x2,当使用gdb和qemu时,它说:jmp 0x7c02 . CS和所有其他段寄存器均为零 . 无论我在链接中使用-Ttext 0x0还是-Ttext 0x7c00,引导加载程序在所有模拟器上都能正常工作 . 当我与-Ttext 0x7c00链接时,objdump说jmp 0x7c02 .
编辑,bootloader看起来像这样:
.code16
.text
movw $0xb800, %ax
movw %ax, %ds
movw $0x0741, (0x0)
xorw %ax, %ax
movw %ax, %ds
movw %ax, %si
movw %ax, %es
movw $0x8000, %ax
movw %ax, %ss
movw $0, %sp
movb $2, %ah
movb $1, %al
movw $0x02, %cx
movb $0x00, %dh
movw $0x5000, %bx
movw %bx, %es
movw $0x0, %bx
int $0x13
ljmpw $0x5000, $0x0000
编辑,第二阶段:
.code16
.text
movw $0xb800, %ax
movw %ax, %ds
movw $0x0742, (0x2)
forever:
jmp forever
1 回答
如果您的硬件正在使用软盘模拟USB驱动器,那么在MBR中没有正确的BIOS Parameter Block (BPB)可能无法正常启动 . 许多BIOS将尝试在引导加载程序启动时检测BPB,甚至可以在引导加载程序加载到内存后使用适当的驱动器几何更新值 . 您的引导加载程序可能没有被检测为正确的可引导驱动器,或者它是,但BIOS在执行之前用驱动器几何信息覆盖了一些代码 .
以下添加了一个看起来像2.88MB软盘的BPB .