如何将汇编实模式源码制作成可在物理机启动的可引导U盘与光盘
实模式引导程序制作物理机可引导介质的实操方案
之前操作无法在物理机U盘启动的原因
- 通过mkisofs生成的ISO,是光盘专用的无软盘模拟引导结构,引导记录存储在ISO9660格式的隐藏引导域中,本身不具备裸磁盘设备所需的MBR分区表与可识别引导头,因此写盘工具会判定为非可引导镜像,物理机的磁盘引导逻辑也无法识别这类结构。
- Windows挂载ISO时看到的
Boot.cat是mkisofs自动生成的ISO结构校验目录,Floopy_I.flp就是打包进去的原始软盘镜像。这个结构仅在虚拟机中因为内置了光盘引导模拟逻辑可以正常启动,不兼容物理机直读U盘的引导规则。
物理机可引导光盘的制作流程
- 你之前生成的ISO本身已经兼容传统BIOS模式的物理机光盘启动,不要把ISO当成普通文件拷贝到光盘中,要使用刻录软件的“逐扇区镜像刻录”功能,将ISO完整写入空白CD/DVD光盘。
- 这种制作方式下,物理机BIOS会直接识别ISO9660结构中标记为
no-emul-boot的引导记录,加载运行编写的实模式程序,启动效果和Bochs、VMware中的运行表现完全一致。 - 注意:这类光盘仅支持传统BIOS启动,无法在纯UEFI模式的机器上引导,因为编写的是16位实模式程序,本身不具备UEFI引导所需的PE32格式入口,属于代码定位决定的正常限制。
物理机可引导U盘的制作流程
U盘是裸块存储设备,引导逻辑和光盘完全不同,不能直接写入光盘专用的ISO结构,可按两种方式制作:
裸扇区直写引导
- 编译生成的
boot.bin是带0xaa55魔数的合法512字节引导扇区,可直接裸写到U盘的第一个块设备位置:- 操作前务必备份U盘内所有数据,设备选择错误会清空对应存储盘的全部内容。
- Linux下执行命令(将
/dev/sdX替换为自身U盘对应的块设备标识):sudo dd if=boot.bin of=/dev/sdX bs=512 count=1 conv=notrunc - Windows下可通过专用dd工具、Rufus的裸写引导扇区功能完成相同操作。
- 启动原理:BIOS读取U盘第一个扇区,检测到合法的
0xaa55引导魔数后,直接加载运行实模式程序,和Bochs加载软盘镜像的逻辑高度一致。 - 这种方式制作的U盘仅支持传统BIOS启动,纯UEFI模式无法识别属于正常现象。
带标准分区表的引导U盘
- 如果需要让U盘被操作系统正常识别为带文件系统的存储设备,可先通过分区工具给U盘创建标准MBR分区表,划分一个标记为“活动”的主分区,格式化为FAT16/FAT32格式后,再将引导扇区内容写入该分区的起始扇区即可。
- Etcher、Rufus之前报错的核心原因:直接写入光盘ISO结构后,U盘的第一个扇区不存在合法MBR引导头,BIOS扫描引导设备时自然找不到可启动入口。
实际调试注意事项
- 物理机启动时,在BIOS启动菜单中要选择对应U盘/光盘的传统BIOS模式启动项,不要选择UEFI开头的同设备选项,否则会因为缺少UEFI引导入口启动失败。
- 当引导程序代码超过1个扇区大小后,需要单独补充适配U盘、光盘的扇区读取逻辑,不同存储介质的BIOS中断调用参数、设备识别规则和软盘存在差异,不能直接复用软盘的读写代码逻辑。
内容的提问来源于stack exchange,提问作者Paiku Han
相关产品推荐
相关产品推荐

