从引导映像加载扇区在引导加载程序中失败

时间:2012-03-26 02:27:16

标签: assembly kernel bootloader

我正在尝试构建自己的引导加载程序,然后加载然后从实模式切换到保护模式,加载GDT描述符然后调用某些第2阶段代码。由于我无法找到调试程序的好方法,因此将事情付诸实践是一场艰苦的战斗。由于某些奇怪的原因,我的代码无法将我的引导加载程序的第二个扇区读入0x1000地址的内存中。我尝试使用int 0x13 al = 0x01 Get Status of Last Drive Operation中断。它返回0x01,这意味着Invalid Command让我更加困惑。

    mov ah, 0      ;reset drive
    int 0x13
    or ah, ah      ;check for error
    jnz err        ;error handling function (prints ASCII A)

    mov ax, 0
    mov es, ax
    mov bx, 0x1000 ;read sector into 0000:0x1000

    mov ah, 0x02   ;read sector
    mov al, 1      ;# of sectors to read = 1
    mov ch, 0      ;Cylinder = 0
    mov cl, 0x02   ;Sector to read = 2 (second as first sector is this code)
    mov dh, 0      ;head = 0

                   ;dl should equal the drive number as BIOS automatically detects it
    int 0x13
    or ah, ah
    jnz err        ;check for error again (this is where the error occurs)

当计算机启动时,我被告知BIOS将驱动器号放入dl寄存器,因此我的所有中断都应该在正确的驱动器上执行。我甚至尝试将dl设置为0x00,这等于软盘驱动器A:,而在BOCHS(CPU模拟器)中我将软盘驱动器A:设置为我的启动映像并且仍然它不会启动。有没有理由说QEMU和BOCHS不能正确模拟代码?我还没有尝试将其刻录到USB并从实时BIOS启动它。我会发布完整的代码here ,以便您在必要时进行审核。如果我不够清楚,我很抱歉,我是OS开发的初学者。非常感谢!

编辑: 操作系统:Windows 7 x64(开发x32操作系统) 仿真:BOCHS运行由NASM编译器创建的boot.img。

1 个答案:

答案 0 :(得分:0)

您正在检查错误。 int 0x13 ah = 0例如通过设置进位标志表示错误,而不是通过报告啊。啊,jnz err,如果使用jc err设置进位,你应该跳跃。