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

编写简易OS时Kernel无输出求助:仅显示Booting kernel...

排查简易OS仅显示“Booting kernel...”无法输出“Hello, world!”的问题

引导加载器(bootloader)核心检查点

  • 验证内核加载逻辑:确认bootloader是否将内核二进制正确读取到内存指定区域(常见为0x10000或0x8000),可通过在bootloader中添加显存输出调试,或使用QEMU调试功能(qemu-system-i386 -hda disk.img -s -S配合GDB)检查内存数据
  • 检查保护模式切换流程:若内核为32位,需确保GDT加载正确、CR0寄存器的PE位已置位、通过远跳转指令完成实模式到保护模式的切换,跳转地址需与内核入口匹配
  • 确认内核跳转指令:bootloader最终跳转到内核入口的指令(如jmp 0x10000)需与内核链接时指定的起始地址完全一致

内核编译与链接问题排查

  • 强制32位编译:编译内核时必须添加-m32参数,避免默认64位编译导致i386模式下无法执行,示例编译命令:gcc -m32 -ffreestanding -c kernel.c -o kernel.o
  • 确认链接脚本配置:自定义链接脚本(如link.ld)需明确指定内核起始地址(如ENTRY(_start); SECTIONS { . = 0x10000; .text : { *(.text) } }),链接时通过-T link.ld参数指定脚本
  • 锁定内核入口:链接时添加-e _start参数,强制将_start函数设为内核入口,避免编译器优化或默认入口导致的跳转错误

“Hello, world!”输出逻辑验证

  • 直接写显存方式:
    • 确认访问的显存地址为0xB8000,保护模式下需确保该内存区域被正确映射(若启用分页需额外配置)
    • 检查字符与属性的组合格式:每个屏幕位置需写入两个字节,前字节为ASCII码,后字节为颜色属性(如0x07代表黑底白字)
  • BIOS中断方式:
    • 注意BIOS中断仅能在实模式下使用,若bootloader已切换到保护模式,必须改用显存直接操作,或实现保护模式下的中断向量表与BIOS调用封装

编译脚本(compile.sh)校验

  • 步骤顺序检查:确保流程为「编译bootloader→编译内核→创建磁盘镜像→写入MBR→写入内核到后续扇区」
  • 磁盘镜像写入验证:确认bootloader.bin被写入磁盘前512字节(MBR区域),内核写入的扇区起始位置与bootloader中读取逻辑一致,且写入的扇区数不小于内核实际占用扇区数(可通过wc -c kernel.bin计算字节数后除以512向上取整)
  • 编译参数完整性:bootloader编译需使用nasm -f bin bootloader.asm -o bootloader.bin生成二进制文件,内核链接需使用ld -m elf_i386指定32位目标架构

内容的提问来源于stack exchange,提问作者lochlan w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:34:57