调试技巧
1. 确认磁盘读取成功
检查内存内容
用GDB查看内核加载位置(0x1000)是否有数据:
# 启动QEMU调试模式
qemu-system-x86_64 -drive format=raw,file=os-image.bin -s -S
# GDB中
(gdb) target remote :1234
(gdb) break *0x7C00
(gdb) continue
# 单步执行到disk_read之后
(gdb) x/16xb 0x1000 # 查看0x1000处的内容如果全是0,说明磁盘读取没有成功或磁盘映像中没有数据。
检查CF标志
(gdb) info registers eflags
INT 0x13 后,如果 CF=1 说明读取失败。
2. 常用调试断点
(gdb) break *0x7C00 # 引导扇区入口
(gdb) break disk_read # 磁盘读取函数入口
(gdb) break print_string # 打印函数入口
3. 查看磁盘映像内容
# 查看整个映像的大小
ls -la os-image.bin
# 查看引导扇区(前512字节)
xxd os-image.bin | head -32
# 查看第2个扇区开始的内容(内核区域)
xxd -s 512 -l 64 os-image.bin4. BIOS INT 0x13 返回值
AH = 状态码
0x00: 成功
0x01: 无效命令
0x02: 地址标记未找到
0x04: 扇区未找到
0x05: 重置失败
0x20: 控制器故障
0x80: 驱动器超时