You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制OS在QEMU中无法加载欢迎消息的问题求助

自制OS欢迎消息加载失败问题修复

症状

执行make clean、make、make run后,QEMU仅显示bootloader的"NOX OS Booting..."消息,kernel.c中预设的欢迎文本无法显示。已尝试增加boot.asm中的磁盘读取扇区数,问题未解决。

核心问题定位

  1. Kernel镜像格式错误:当前Makefile中链接生成的kernel.bin是ELF格式文件,而非纯二进制机器码。bootloader加载ELF文件到0x1000后,直接跳转到该地址执行的是ELF头部数据,而非有效指令,导致无法进入entry.asm和kernel_main。
  2. 跳转逻辑依赖正确的镜像格式:bootloader中jmp CODE_SEG:0x1000的跳转地址是正确的,但仅当kernel是纯二进制格式时,0x1000位置才是entry.asm的_start入口点。

修复方案

1. 修改Makefile生成纯二进制Kernel镜像

在链接kernel的步骤中添加--oformat binary参数,强制ld输出纯二进制机器码:

$(KERNEL_BIN): $(ENTRY_OBJ) $(KERNEL_OBJ)
    $(LD) $(LDFLAGS) --oformat binary -o $@ $^

2. 可选:添加加载验证提示(辅助排查)

在boot.asm的磁盘读取成功后添加提示,确认kernel是否被正确加载:
在int 0x13指令之后、jc disk_error之前插入:

mov si, load_success_msg
call print_string

然后在消息区域添加:

load_success_msg db 'Kernel loaded successfully!', 0

3. 验证entry.asm的执行状态

确认entry.asm中的调试字符'E'是否显示:如果该字符出现,说明已进入entry.asm,问题可能出在kernel_main调用或视频输出逻辑;如果未出现,说明仍未进入entry.asm,需检查磁盘读取和跳转逻辑。

验证步骤

  1. 执行make clean && make && make run
  2. 正常流程应显示:
    • bootloader的"NOX OS Booting..."
    • (可选)"Kernel loaded successfully!"
    • 屏幕第1行第3列的'E'字符
    • 清除屏幕后显示预设的欢迎消息

内容的提问来源于stack exchange,提问作者James Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:59