You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:15:41