实模式Hello World在QEMU无输出及格式警告问题排查
解决实模式引导程序的QEMU串口输出与格式警告问题
1. 修复QEMU未指定文件格式警告
QEMU默认会自动检测镜像格式,而你的引导程序是MBR格式的512字节软盘镜像,必须明确告知QEMU使用raw格式:
- 修改
make run中的QEMU命令,用-fda参数指定软盘镜像(自动识别为raw格式):qemu-system-i386 -fda boot.bin -serial stdio - 或者用
-drive参数明确指定格式:qemu-system-i386 -drive file=boot.bin,format=raw,if=floppy -serial stdio
执行以上任意一种命令后,QEMU的格式警告会消失。
2. 让串口捕获引导程序输出
-serial stdio仅能捕获串口端口的输出,若你原引导程序是通过BIOS中断(如int 0x10)输出到屏幕,串口自然无法接收数据。需修改boot.asm,实现串口输出逻辑:
串口初始化与输出代码示例
org 0x7c00 bits 16 start: ; 初始化COM1串口(9600波特率,8数据位,1停止位,无校验) mov dx, 0x3FB ; 线路控制寄存器 mov al, 0x80 ; 允许设置波特率 out dx, al mov dx, 0x3F8 ; 除数寄存器低字节 mov al, 0x0C ; 9600波特率对应值(115200/9600=12=0x0C) out dx, al mov dx, 0x3F9 ; 除数寄存器高字节 mov al, 0x00 out dx, al mov dx, 0x3FB ; 线路控制寄存器 mov al, 0x03 ; 8数据位,1停止位,无校验 out dx, al mov dx, 0x3FC ; 调制解调器控制寄存器 mov al, 0x03 ; 使能DTR和RTS out dx, al ; 输出Hello World到串口 mov si, msg send_char: lodsb or al, al jz exit ; 字符串结束则退出 call send_serial jmp send_char send_serial: push dx push ax wait_tx_empty: mov dx, 0x3FD ; 线路状态寄存器 in al, dx test al, 0x20 ; 检查发送保持寄存器是否为空 jz wait_tx_empty mov dx, 0x3F8 ; 发送保持寄存器 out dx, al pop ax pop dx ret exit: hlt jmp exit msg: db 'Hello World', 0x0D, 0x0A, 0 ; 填充到512字节,添加MBR签名 times 510-($-$$) db 0 dw 0xAA55
确保汇编正确生成镜像
Makefile中的汇编命令需指定输出为二进制格式(以nasm为例):
boot.bin: boot.asm nasm -f bin boot.asm -o boot.bin run: boot.bin qemu-system-i386 -fda boot.bin -serial stdio clean: rm -f boot.bin
编译运行后,串口stdio即可捕获到引导程序输出的"Hello World"。
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

