ARM架构小型OS在QEMU模拟器中可视化异常的问题求助
问题修正方案:ARM小型OS在QEMU中显示异常的解决步骤
问题核心分析
你遇到的显示异常主要源于三个关键错误:-nographic参数下误用VGA缓冲区输出、字符串语法错误、编译产物与启动命令的文件名不匹配,同时需要确保链接脚本地址适配VersatilePB平台。
1. 替换输出方式:改用UART串口输出(最关键修正)
使用-nographic参数时,QEMU会禁用VGA显示,转而通过串口(UART)输出控制台内容,直接写入0xB8000的VGA缓冲区完全无效。修改notmain.c为UART输出:
#define UART0_BASE 0x101F1000 #define UART0_DR (*(volatile unsigned int*)(UART0_BASE + 0x00)) #define UART0_FR (*(volatile unsigned int*)(UART0_BASE + 0x18)) // 发送单个字符到UART void uart_putc(char c) { // 等待发送缓冲区为空 while ((UART0_FR & (1 << 5)) != 0); UART0_DR = c; } // 发送字符串到UART void uart_puts(const char* str) { while (*str) { uart_putc(*str++); } } void kernel(void) { const char *msg = "Hello, ARM world!\n"; uart_puts(msg); while (1); }
2. 修正字符串语法错误
原代码中直接换行的字符串写法属于非法语法,必须用转义符\n替代:
// 错误写法 const char *msg = "Hello, ARM world! "; // 正确写法 const char *msg = "Hello, ARM world!\n";
3. 统一编译产物与启动命令的文件名
编译生成的是notmain.bin,但QEMU命令指定的是os.bin,二选一修正即可:
# 方式1:编译时修改输出文件名 arm-none-eabi-objcopy notmain.elf -O binary os.bin # 方式2:修改QEMU启动命令 qemu-system-arm -M versatilepb -m 128M -nographic -kernel notmain.bin
4. 确保链接脚本memmap适配VersatilePB
VersatilePB平台默认内核加载地址为0x10000,链接脚本需明确指定入口与段地址:
ENTRY(_start) SECTIONS { . = 0x10000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
验证流程
重新执行编译步骤后启动QEMU,终端将正常显示Hello, ARM world!。
内容的提问来源于stack exchange,提问作者Dmytro Parkhomenko
相关产品推荐
相关产品推荐

