QEMU引导扇区签名非0xAA55仍能启动Bootloader原因咨询
核心原因
你制作的是遵循El Torito规范的可引导ISO镜像,不是普通MBR格式的软盘/硬盘镜像,QEMU的引导流程根本不会校验你写在引导扇区末尾的2字节签名,所以哪怕把签名改成0x2233也能正常启动。
普通磁盘镜像的引导规则
- 对于直接把512字节引导扇区写在LBA 0位置的纯软盘、MBR分区表硬盘镜像,传统BIOS(包括QEMU默认使用的SeaBIOS实现)确实会强制校验第一个扇区最后2字节是否为标准引导签名0xAA55。如果校验不通过,BIOS会直接判定该介质不可引导,不会把扇区加载到
0x7C00地址执行。
ISO镜像的引导逻辑差异
你用的制作方法生成的是CD/DVD适用的El Torito标准可引导镜像,引导判定逻辑和普通磁盘完全不一样:
- 可引导标记不存在于引导扇区内部,而是写在ISO9660文件系统的卷描述符、专门的El Torito引导目录结构里。只要制作ISO的时候正确配置了引导入口、指定了对应的引导扇区文件,QEMU的BIOS识别到这个合法的引导标记后,就会直接把你指定的引导扇区加载到内存执行。
- 处理El Torito格式的引导项时,包括QEMU SeaBIOS在内的几乎所有PC BIOS实现都会跳过引导扇区末尾的
0xAA55签名校验。这是行业沿用多年的兼容逻辑:早期大量可引导光盘的引导扇区都没有写入这个签名,强制校验会导致海量旧光盘无法正常启动。
复现校验差异的测试方法
你可以通过两个简单测试验证这个逻辑:
- 把编译生成的512字节bootloader二进制文件直接作为软盘镜像启动,命令参考
qemu-system-i386 -fda boot.bin。这时候因为是纯软盘镜像,BIOS会执行签名校验,你写入的0x2233会直接导致启动失败,提示没有可引导介质。 - 保持引导扇区签名为
0x2233重新制作ISO,启动过程完全正常,和签名为0xAA55时的运行效果没有任何区别。
你当前使用的引导扇区代码如下:
org 0x7c00 ; BIOS默认将引导扇区加载到0x7C00地址 bits 16 ; 运行在16位实模式 Start: cli ; 屏蔽所有中断 hlt ; 让CPU停机 times 510 - ($-$$) db 0 ; 填充0将前510字节凑齐长度 dw 0x2233 ; 修改后的非标准引导签名
哪怕你把引导示例里的签名改掉,只要ISO的El Torito引导元数据配置正确,QEMU就可以正常识别为可引导介质,加载引导扇区后正常执行屏幕输出等逻辑。
内容的提问来源于stack exchange,提问作者user13675319
相关产品推荐
相关产品推荐

