2.在 Linux 中使用系统自带工具反汇编 boot引导程序
在 Linux 中反汇编 boot.bin(16 位启动扇区)
boot.bin 是纯二进制格式(无 ELF 头)的 16 位 bootloader,因此反汇编时需要手动指定架构与格式。Linux 自带的 objdump 就能完成。
一、反汇编命令
对于 x86 16 位 bootloader:
1 | objdump -D -b binary -m i8086 boot.bin |
参数说明
- -D:反汇编全部内容(纯二进制无段信息,只能全部解析)
- -b binary:指定输入为原始二进制文件
- -m i8086:指定反汇编架构为 Intel 8086(16 位实模式)
二、反汇编结果解析
以打印 “Hi” 的启动扇区为例,常见结果如下(只截取核心部分):
1 | boot.bin: file format binary |
三、关键说明
1. 地址偏移
反汇编地址从 0x0000 开始,但 BIOS 实际会把 boot 扇区加载到:
1 | 0x7C00 |
因此真实内存地址 = 反汇编偏移 + 0x7C00。
2. 指令与源码对应
你可以通过反汇编结果验证机器码是否与源码匹配,例如:
1 | mov $0x0e, %ah |
反汇编显示:
1 | b4 0e |
这样可以检查拼装是否正确。
3. 启动标志(0xAA55)
最后两字节 0x55 0xAA 是启动扇区标志(小端存储),会被识别成某些指令:
1 | 55 = push %bp |
这些并不是代码,只是 BIOS 校验用的数据。
四、可选工具:ndisasm(NASM 提供)
如果安装了 nasm,可以使用它的反汇编工具:
1 | ndisasm -b 16 boot.bin |
ndisasm 对 16 位代码更友好,输出为 Intel 语法,更容易和源码对照。
总结
使用 objdump 或 ndisasm 可以轻松反汇编 bootloader,从而验证:
- 指令生成是否正确
- 填充是否到 512 字节
- 末尾是否为
0xAA55 - 代码逻辑是否符合预期
这是调试 bootloader 时非常重要的步骤。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
