Debian11下使用dd从bin文件制作的可引导ISO运行异常
问题原因
直接执行qemu-system-x86_64 boot.bin时,QEMU会把512字节的编译产物直接当作硬盘MBR,加载到物理地址0x7C00走传统MBR引导流程,所以你的代码能正常运行。
用dd直接把bin文件写入生成ISO的做法是错误的:CD/DVD遵循El Torito可引导规范,扇区大小为2048字节,引导记录不会放在镜像开头的512字节位置,VMware识别到ISO格式后会按光盘引导流程读数据,根本不会正确加载你写的引导代码,自然无法实现预期效果。
另外你写的原始引导代码缺少基础运行环境初始化,不同虚拟化平台、不同BIOS的初始寄存器状态不统一,直接跳转到功能调用很容易出现运行异常。
解决步骤
- 首先补全引导代码的初始化逻辑,明确加载基址、初始化段寄存器与栈,避免环境差异导致的运行错误。修正后的代码如下:
org 0x7C00 ; 指定引导扇区加载到内存的基址,保证地址计算正确 xor ax, ax mov ds, ax ; 初始化数据段寄存器为0 mov es, ax ; 初始化附加段寄存器为0 mov ss, ax mov sp, 0x7C00 ; 设置栈顶到引导扇区加载位置下方,避免栈覆盖代码 mov bl, 0x07 ; 指定文本显示属性为黑底浅灰字,兼容不同BIOS的0x10中断实现 cld ; 清方向标志位,保证后续字符串操作方向正确 input_loop: mov ah, 0x00 ; 调用BIOS键盘中断,阻塞读取按键输入 int 0x16 mov ah, 0x0E ; 调用BIOS电传输出功能,打印输入的字符 int 0x10 jmp input_loop ; 填充剩余空间到512字节,末尾写入MBR魔数 times 510 - ($-$$) db 0 dw 0xAA55
- 编译汇编代码,在Debian 11下直接安装nasm执行编译即可:
nasm -f bin boot.asm -o boot.bin
- 不要用dd直接生成ISO,使用系统源里自带的
xorriso工具生成符合El Torito规范的可引导光盘镜像,执行以下命令:
# 没装xorriso的话先执行apt install xorriso安装 xorriso -as mkisofs -b boot.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso .
上述参数中-no-emul-boot指定无模拟引导模式,BIOS会直接把引导内容加载到0x7C00执行,和MBR引导行为完全一致;-boot-load-size 4指定引导段长度为4个512字节扇区即2048字节,匹配光盘扇区大小要求,符合规范。
- 生成的boot.iso可以直接在VMware、QEMU等任意支持BIOS引导的虚拟化/物理环境中作为光盘镜像启动,键盘输入实时打印的功能可以正常运行。
补充说明
如果你一定要用dd生成镜像,那生成的本质是硬盘格式镜像而非ISO光盘镜像,不要把后缀命名为.iso,将后缀改为.img后作为虚拟硬盘挂载到虚拟机中也可以正常启动,但这种镜像不符合光盘规范,不推荐这么做。
内容的提问来源于stack exchange,提问作者tree77
相关产品推荐
相关产品推荐

