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