自制简易OS遇QEMU无法识别可引导设备问题求助
QEMU提示未找到可引导设备,Bootloader构建正常但无法引导自定义OS
问题详情
- 运行环境:Intel架构macOS,使用QEMU模拟器运行自定义操作系统镜像
- 构建状态:
make命令执行无错误,完整构建输出如下:
$ make --> Compiled: boot.asm i686-elf-ld: warning: /Users/fabboy/CLionProjects/os/build/boot.bin has a LOAD segment with RWX permissions --> Created: boot.bin --> Compiled: Entry.c --> Created: kernel.bin 2880+0 records in 2880+0 records out 1474560 bytes transferred in 0.014243 secs (103528751 bytes/sec) 17+1 records in 17+1 records out 8708 bytes transferred in 0.000143 secs (60895105 bytes/sec) 10+1 records in 10+1 records out 5448 bytes transferred in 0.000111 secs (49081081 bytes/sec)
- 构建后目录结构:
$ tree ├── build │ ├── boot.bin │ ├── bootloader │ │ └── boot.obj │ ├── kernel │ │ └── c │ │ └── Entry.obj │ ├── kernel.bin │ ├── kernel.map │ └── os_image.img
- 核心问题:执行
make run启动QEMU时,模拟器提示未找到可引导设备,无法加载操作系统。
排查方向与解决建议
1. 检查Bootloader引导签名
- 确认
boot.asm在第一个扇区(512字节)的末尾添加了0xAA55引导签名,这是BIOS识别可引导介质的必要标记。 - 验证
boot.bin的文件大小:执行ls -l build/boot.bin,确保大小为512字节。如果超过,说明代码或数据溢出,导致引导签名不在正确位置。
2. 镜像生成逻辑校验
- 检查Makefile中生成
os_image.img的步骤,确认boot.bin被正确写入镜像的第一个扇区。例如,是否使用了类似dd if=build/boot.bin of=build/os_image.img bs=512 count=1 conv=notrunc的命令,保证引导扇区覆盖到镜像起始位置。 - 确认
os_image.img是标准1.44MB软盘镜像(对应2880个512字节扇区),同时检查make run中的QEMU命令是否用-fda build/os_image.img参数指定软盘镜像。
3. Linker脚本正确性检查
- 检查bootloader的
linker.ld,确保代码被链接到实模式下的正确内存地址(通常为0x7c00)。如果链接地址错误,BIOS加载后无法正常执行代码。 - 修复ld的RWX权限警告:虽然该警告不一定直接导致引导失败,但可通过调整linker脚本的段权限解决(代码段设为RX,数据段设为RW),避免潜在问题。
4. QEMU启动参数验证
- 确认
make run中的QEMU命令是否强制使用BIOS启动(自定义OS基于BIOS的情况下)。在Intel Mac上,可尝试添加-bios /usr/local/share/qemu/bios-256k.bin参数,避免默认使用UEFI模式导致无法识别BIOS引导扇区。
5. Bootloader代码调试
- 在
boot.asm中添加BIOS中断调试输出(如用int 0x10打印字符),直观确认bootloader是否被BIOS加载执行。 - 使用QEMU调试功能:执行
qemu-system-i386 -s -S -fda build/os_image.img,配合GDB连接调试,查看bootloader的执行流程是否符合预期。
内容的提问来源于stack exchange,提问作者Fab boy
相关产品推荐
相关产品推荐

