从零开始写一个操作系统内核-第一篇:不只是“Hello World”

🌱 从零开始写一个操作系统内核-第一篇:不只是“Hello World”!


你是否曾好奇: ✅ Windows、Linux、macOS 这些操作系统是怎么“从无到有”启动的? ✅ 内核到底长什么样?能不能自己写一个? ✅ 为什么内核代码不能用 printf ,却能直接显示文字?

🛠️ 第一步:准备开发环境

我们要构建一个 32位 x86 内核 ,通过 GRUB 引导 ,并在 QEMU 中运行——这样既安全又快捷!

你需要安装:

⚠️ 为了规范编译,推荐使用 交叉编译器 i686-elf-gcc (避免宿主系统库干扰)。 教程可参考:OSDev Wiki – GCC Cross-Compiler


🚀 核心三件套:汇编 + C + 链接脚本

1️⃣ 启动代码(boot.asm)

这是 GRUB 认得的“入口”:

✅ 这段代码干了三件事:

告诉 GRUB:“我能被引导!”(Multiboot 协议)
设置栈指针
跳转到 C 代码入口


2️⃣ 内核主函数(kernel.c)

没有 printf ?没关系,我们直接写显存!

✨ 0xB8000 是 x86 文本模式的显存起始地址,每个字符占 2 字节(字符 + 属性)。


3️⃣ 链接脚本(linker.ld)

控制程序在内存中的布局:


📦 编译 & 运行:一键启动!

用这个 Makefile 自动构建:

运行:

🎉 QEMU 窗口弹出,左上角赫然显示: Hello from my OS kernel! 🌟


🔜 接下来做什么?

恭喜!你已经迈出了最难的第一步。 接下来,你可以逐步添加:

模块 作用
GDT 设置段描述符(进入保护模式)
IDT 处理中断(键盘、时钟等)
Paging 启用虚拟内存
Serial 输出 用 COM1 调试,比显存更可靠
简易 Shell 实现命令行交互!

🌐 强烈推荐:OSDev Wiki —— 操作系统开发者的“圣经”。

最后修改: 2026年7月1日

作者

评论

发表评论

您的邮箱地址不会被公开。