常见错误
1. 屏幕空白,C内核没有执行
原因A: 链接地址与加载地址不匹配
解决: 确保 linker.ld 中的 . = 0x1000 与 boot.asm 中的 KERNEL_OFFSET equ 0x1000 一致。
原因B: kernel_entry 不在二进制文件的开头
解决: 链接时 kernel_entry.o 必须在 kernel.o 之前:
ld -m elf_i386 -T linker.ld -o kernel.bin kernel_entry.o kernel.o
# 顺序很重要!原因C: 编译不是32位模式
解决: 确保使用 -m32 编译C代码,-f elf32 汇编内核入口。
2. 链接器报错 “undefined reference to kernel_main”
原因: kernel.o 没有包含在链接命令中
解决: 检查 Makefile,确保 kernel.o 参与链接。
3. GCC 报错 “cannot find -lgcc”
原因: 缺少32位库
解决:
sudo apt install gcc-multilib4. 运行时三重错误(Triple Fault)
原因: 内核代码被加载到了错误的地址
调试: 用GDB检查内核加载位置:
(gdb) x/10i 0x1000
# 应该看到 kernel_entry 的代码
5. C代码中的全局变量值不正确
原因: BSS段没有被清零
解决: 在 kernel_entry.asm 中添加BSS清零代码,或在C中显式初始化所有变量。