从零开始写一个操作系统kernel-Part 1: 不只是”Hello World”
🌱 从零开始写一个操作系统kernel-Part 1: 不只是”Hello World”!
你是否曾好奇: ✅ Windows, Linux, macOS 这些操作系统是怎么”从无到有”启动的? ✅ kernel到底长什么样? 能不能自己写一个? ✅ 为什么kernel代码不能用 printf , 却能直接显示文字?
🛠️ 第一步: 准备开发环境
我们要构建一个 32位 x86 kernel , 通过 GRUB 引导 , 并在 QEMU 中运行 — 这样既安全又快捷!
你需要安装:
⚠️ 为了规范编译, 推荐使用 交叉编译器 i686-elf-gcc (避免宿主系统库干扰) . 教程可Reference: OSDev Wiki – GCC Cross-Compiler
🚀 core三件套: 汇编 + C + 链接脚本
1️⃣ 启动代码 (boot.asm)
这是 GRUB 认得的”入口”:
✅ 这段代码干了三件事:
告诉 GRUB: “我能被引导! ” (Multiboot 协议)
setstack指针
跳转到 C 代码入口
2️⃣ kernel主函数 (kernel.c)
没有 printf ? 没关系, 我们直接写显存!
✨ 0xB8000 是 x86 文本Mode的显存起始地址, 每个字符占 2 字节 (字符 + Attribute) .
3️⃣ 链接脚本 (linker.ld)
控制程序在内存中的布局:
📦 编译 & 运行: 一键启动!
用这个 Makefile 自动构建:
运行:
🎉 QEMU 窗口弹出, 左上角赫然显示: Hello from my OS kernel! 🌟
🔜 Next, 做什么?
恭喜! 你已经迈出了最难的第一步. Next, , 你可以逐步添加:
| module | Role |
|---|---|
| GDT | setsegment descriptor (进入Protected Mode) |
| IDT | handleinterrupt (键盘, 时钟等) |
| Paging | enablevirtual memory |
| Serial 输出 | 用 COM1 调试, 比显存更可靠 |
| 简易 Shell | Implementation命令行交互! |
🌐 强烈推荐: OSDev Wiki — 操作系统开发者的”圣经”.
Comments