如何制作写入NASM编写引导扇区的可引导U盘及启动失败问题排查
你遇到的问题大概率既不是笔记本硬件故障也不是U盘本身损坏,而是引导模式兼容、镜像写入方式、BIOS校验规则导致的软件配置问题,可按以下步骤排查:
1. 确认镜像写入方式正确
你执行的编译命令输出的是raw格式的二进制引导文件,命名为boot_sect.iso是错误命名,该文件并非标准ISO9660格式镜像:
nasm -fbin boot_sect.asm -o boot_sect.bin # 建议重命名为bin避免误解 qemu-system-x86_64 -drive format=raw,file=boot_sect.bin
写入U盘时必须直接写入整个U盘块设备:
- Linux下执行
dd if=boot_sect.bin of=/dev/sdX bs=512(注意/dev/sdX是你的U盘整个设备,不要写成分区如/dev/sdX1) - Windows下用Rufus写入时,要选择「DD镜像模式」,不能选默认的ISO模式,否则工具会判定不是合法ISO导致引导结构错误。
2. 调整BIOS启动配置
你的汇编代码是Legacy BIOS模式的引导扇区,不支持UEFI模式启动。大部分新笔记本默认开启UEFI安全启动,部分甚至默认关闭了Legacy/CSM兼容模式,你需要:
- 进笔记本BIOS关闭「安全启动(Secure Boot)」
- 开启「Legacy BIOS支持」/「CSM兼容模式」
- 启动项选择对应U盘的Legacy模式引导项,不要选UEFI模式的U盘启动项。
3. 补充合法MBR分区表过BIOS校验
你当前的代码只补了0xaa55引导结束签名,没有填充MBR偏移0x1BE到0x1FD位置的分区表,很多实机BIOS会校验该区域是否存在标记为0x80的可引导分区,如果没有就会判定该扇区为非法引导扇区,拒绝执行。可以修改汇编代码补充分区表:
mov ah , 0x0e mov al , `h` int 0x10 mov al , `1` int 0x10 jmp $ ; 新增:填充到分区表起始位置,添加一条可引导分区项 times 0x1be - ($ - $$) db 0 db 0x80 ; 标记为可引导分区 db 0x00,0x02,0x00 ; 分区起始CHS地址 db 0x0c ; 分区类型(FAT32 LBA) db 0x00,0x04,0x00 ; 分区结束CHS地址 dd 0x00000001 ; 分区起始LBA dd 0x00001fff ; 分区大小 times 510-($-$$) db 0 dw 0xaa55
4. 其他兼容性排查
部分老BIOS对USB3.0接口的U盘支持不完善,你可以换用USB2.0的U盘,或者插在笔记本的USB2.0接口上尝试启动。
内容的提问来源于stack exchange,提问作者Νίκος Αντωνετσής
相关产品推荐
相关产品推荐

