正常
很好,这次可以整理成一份非常标准、可用于面试的排查报告,把整个思路串起来会非常加分。
🧠 Bootloader INT 13h 读取内核问题排查报告
📌 一、问题现象
在 bootloader 阶段调用:
asm
int $0x13 ; AH=0x42 扩展读观察到:
AH = 0x1- 读取返回异常
- 怀疑磁盘读取失败
🔍 二、初步分析
关键判断逻辑:
asm
jc disk_read_failed ; CF=1 表示失败
cmpb $0, %ah ; AH!=0 表示错误👉 初步推测:
- BIOS 返回错误码(AH ≠ 0)
- 读取失败
🧪 三、进一步验证
通过 GDB 检查:
text
(gdb) i r ah
ah = 0x1👉 同时检查内存:
text
0x10000:
7F 45 4C 46 ...🎯 四、关键发现
✅ 内存数据正确
text
0x7F 'E' 'L' 'F'👉 说明:
✔ 磁盘读取实际上已经成功
❗ 矛盾点
- AH 显示为 0x1(错误)
- 但数据却成功读入
👉 说明:
❗ 问题不是当前这一次调用,而是寄存器或调用参数异常
🧠 五、问题定位过程
逐项检查 INT 13h 扩展读所需条件:
1️⃣ DAP 是否正确
检查:
text
size = 0x10 ✔
count = 0x08 ✔
buffer = 0x10000 ✔
LBA = 0x10 ✔👉 DAP 正确
2️⃣ DL 是否正确
👉 关键点:
text
DL = BIOS 硬盘号实际检查发现:
text
DL = 0x01 ❌🚨 六、根因分析
❌ 错误点:
text
DL = 0x01(错误)✅ 正确应为:
text
DL = 0x80(第一块硬盘)💥 导致问题:
BIOS 解释:
- DL=0x01 → 软盘设备
- 当前调用是硬盘扩展读取
👉 设备类型不匹配
➡️ BIOS 返回:
text
AH = 0x01🛠 七、修复方案
在调用 INT 13h 前增加:
asm
movb $0x80, %dl ; 指定硬盘✅ 修复后验证
- AH = 0
- CF = 0
- ELF header 成功读取
text
0x10000:
7F 45 4C 46 ...👉 读取完全正确
🧠 八、最终结论
本次问题根因:
❗ DL 未设置为 0x80,导致 BIOS 认为访问设备错误
🎯 九、经验总结(面试加分点)
1️⃣ INT 13h 使用要点
必须设置:
- DL(设备号)
- DAP(结构完整)
判断成功:
- 只看 CF,不依赖 AH
2️⃣ 常见坑
| 问题 | 现象 |
|---|---|
| DL 未设置 | AH=1 / 无法读取 |
| DAP 错误 | 读取异常 / 崩溃 |
| buffer 非法 | 数据错乱 |
| 忘记检查 CF | 误判成功 |
3️⃣ 调试经验
- AH 只是“结果之一”,不是最终判断依据
- CF 才是最终成功标志
- GDB 可能显示“非当前调用瞬间”的寄存器状态
🚀 十、下一步建议
你已经完成:
text
BIOS → INT13 → ELF header 读取