写入引导加载程序的int 13h的控制器错误(20h)

时间:2019-05-03 15:01:55

标签: c assembly x86 bootloader

我当前正在编写引导加载程序,无法取得任何进展。 我的引导程序的工作是从仿真软盘加载一些代码(用C编写)并执行。但是,使用int 13h的磁盘读取部件失败,错误代码为20h(控制器故障)。我找不到此错误确切含义的任何描述。

我已经看过许多教程,堆栈溢出问题和OS开发者Wiki,并且我检查了10次以上的代码以从磁盘读取数据,并尝试了一些使用更改参数的方法,但是我没有做任何事情现在进步。 也许问题不是代码,而是图像本身(我使用Qemu作为软盘运行)。我通过编译实际的引导加载程序代码(可以正常运行并运行到目前为止,因此签名等应该正确)来创建映像,然后附加已编译的C代码。我使用hexdump进行检查,并且代码位于签名后的地址0x200,因此应该是正确的。我怀疑读取一个扇区超出了实际的图像大小,因此我将文件填充为零。

这是汇编器部分:

// Number of sections
    mov $0x1, %al

    // 0x2 - Read sections
    mov $0x2, %ah

    // Section number (starting from 1)
    mov $0x2, %cl

    // Boot device and head (0)
    mov $0x0, %dx

    // Cylinder
    mov $0x0, %ch

    // Dest Address
    mov $0x7E00, %bx
    mov %bx, %es
    mov $0x0, %bx

    int $0x13
    jc .disk_error

这是我如何使用make构建和运行映像的方法:


os.bin: bootloader.bin kernel.bin
    cat bootloader.bin kernel.bin > os.bin
    dd if=/dev/zero bs=1 count=1024 >> os.bin

run: os.bin
    qemu-system-x86_64 -drive format=raw,file=os.bin

如果有用的话,我也可以发布hexdump。

预期结果: ah为0,al为1,未设置进位标志。在地址0x7E00处是我从软盘加载的代码。

实际结果: ah是20h,设置了进位标志。地址0x7E00之后只有零。

0 个答案:

没有答案