首页 > 解决方案 > 用于编写引导加载程序的 int 13h 的控制器错误 (20h)

问题描述

我目前正在编写引导加载程序,但无法取得任何进展。我的引导加载程序的工作是从模拟软盘加载一些代码(用 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 之后只有零。

标签: cassemblyx86bootloader

解决方案


推荐阅读