自制OS在QEMU中无法加载欢迎消息的问题求助
自制OS欢迎消息加载失败问题修复
症状
执行make clean、make、make run后,QEMU仅显示bootloader的"NOX OS Booting..."消息,kernel.c中预设的欢迎文本无法显示。已尝试增加boot.asm中的磁盘读取扇区数,问题未解决。
核心问题定位
- Kernel镜像格式错误:当前Makefile中链接生成的
kernel.bin是ELF格式文件,而非纯二进制机器码。bootloader加载ELF文件到0x1000后,直接跳转到该地址执行的是ELF头部数据,而非有效指令,导致无法进入entry.asm和kernel_main。 - 跳转逻辑依赖正确的镜像格式: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,需检查磁盘读取和跳转逻辑。
验证步骤
- 执行
make clean && make && make run - 正常流程应显示:
- bootloader的"NOX OS Booting..."
- (可选)"Kernel loaded successfully!"
- 屏幕第1行第3列的'E'字符
- 清除屏幕后显示预设的欢迎消息
内容的提问来源于stack exchange,提问作者James Tan
相关产品推荐
相关产品推荐

