Skip to content

很好,这次可以整理成一份非常标准、可用于面试的排查报告,把整个思路串起来会非常加分。


🧠 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 读取

035_multi_terminal-40-g5d72b8b · 5d72b8b · 2026-06-26