c - 用于编写引导加载程序的 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 之后只有零。
解决方案
推荐阅读
- python - 如何在没有同时匹配索引和值的约束的情况下使用 DataFrame.isin?
- python - 有没有办法将频谱图反转回信号
- angular - 通过单击 href 链接重定向到页面
- javascript - 更新计数器时 Cassandra Node.js 驱动程序内存泄漏
- postgresql - Ansible 因 runuser 失败:找不到命令
- docker - 在没有交互模式的情况下使用 Docker Pipeline Plugin
- javascript - select_tag rails,提交前动态显示值
- c# - 如何防止 iOS 13 杀死后台应用程序?
- python-3.x - 如何运行计划的 AWS Lambda 函数,其中计划的时间是一个参数?
- r - 计算不同数据帧中出现的次数,并将行号作为字符串获取