调试技巧

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.bin

4. BIOS INT 0x13 返回值

AH = 状态码
  0x00: 成功
  0x01: 无效命令
  0x02: 地址标记未找到
  0x04: 扇区未找到
  0x05: 重置失败
  0x20: 控制器故障
  0x80: 驱动器超时