从零开始写一个操作系统内核-第一篇:不只是“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 —— 操作系统开发者的“圣经”。
评论