从零开始写一个操作系统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 — 操作系统开发者的”圣经”.

Last modified: 2024年10月1日

Author

Comments

Write a Reply or Comment

Your email address will not be published.