从启动映像加载扇区在启动加载程序失败

问题描述:

我想建立自己的启动加载程序,然后加载然后从实模式切换到保护模式,加载GDT描述符,然后调用一些阶段2代码。由于我无法弄清楚调试我的程序的好方法,所以让事情顺利进行一直是一场艰苦的战斗。出于某种奇怪的原因,我的代码在将我的引导程序的第二个扇区读入内存时失败,地址为0x1000。我尝试使用int 0x13al = 0x01这是一个Get Status of Last Drive Operation interupt。它返回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寄存器。我甚至尝试设置dl0x00这将等于软驱A:和BOCHS(CPU模拟器)我将软盘驱动器A:设置为我的启动映像,但它仍然无法启动。 QEMU和BOCHS不会正确模拟代码有什么原因吗?我还没有尝试将它烧到USB上并从实时BIOS中启动它。我将发布我的完整代码here,以便您可以在必要时查看它。我很抱歉,如果我不够清楚,我是初学者在操作系统开发。非常感谢!

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

+0

我回答你的问题吗? – Stewart 2012-03-28 10:34:06

+0

@Stewart我正在重写我的引导装载程序,所以我可以测试它。只要我将新代码加入其中,我会尽快回复。别担心:) – user99545 2012-03-28 23:35:38

您正在错误地检查错误。 int 0x13 ah = 0例如通过设置进位标志来指示错误,而不是通过报告ah中的内容。而不是或者啊,如果使用jc err设置进位,你应该跳转。