Blog OS:用 Rust 写操作系统的 12 章渐进式教程与内核构建完整指南
【免费下载链接】blog_osWriting an OS in Rust项目地址: https://gitcode.com/GitHub_Trending/bl/blog_os
想从零写操作系统,却卡在"内核第一行代码如何被执行"?Blog OS 是《Writing an OS in Rust》教程的开源源码仓库,用 12 个章节带你在 x86-64 架构上搭建一个可启动的 Rust 内核:每章附完整可运行代码,教程提供 8 种语言版本,免费开源。适合 Rust 开发者、计算机专业学生和操作系统学习者。
30 秒看懂这个项目
- 定位:博客式教程加配套代码。每篇文章对应一个独立 git 分支(
post-01到post-12),代码随章节递进,可回看任意中间状态,总目录见 README.md。 - 平台情况:内核目标是 x86-64,通过 QEMU 以 BIOS 方式启动;开发环境不限系统,Windows、macOS、Linux 均可,仓库还收录了 Android 环境构建章节。
- 为什么免费:代码采用 Apache-2.0 / MIT 双许可(见 LICENSE-APACHE),可自由查看、修改、商用;博客文本为 CC-BY-NC 协议,仅限非商业用途。
核心能力拆解:一条从启动到多任务的内核开发路线
2.1 找资料:先定位你要的章节
教程按"骨架 → 中断 → 内存 → 多任务"四段组织,共 12 章。全部正文位于 blog/content/edition-2/posts/ 目录,每章一个子目录,内含全文、配图与运行截图。中文版与各语言版以index.zh-CN.md等后缀并列存放,无需切换目录。
2.2 把内核跑起来:从启动到打印(第 1–4 章)
- 第 1 章:构建 freestanding Rust 二进制,理解
no_std环境下没有标准库意味着什么。 - 第 2 章:用
bootimage工具自动生成引导加载器,得到第一个可在 QEMU 中启动的 64 位内核。 - 第 3 章:直接操作 VGA 文本缓冲区,实现屏幕打印,绕开驱动层。
- 第 4 章:在内核里写单元测试,并接入 QEMU 集成测试,失败时直接拿到虚拟机截图。
内核在 QEMU 中的首次运行结果
2.3 扛住错误:异常与硬件中断(第 5–7 章)
- 第 5 章:搭建 IDT 中断描述表,捕获除零、断点等 CPU 异常,并打印结构化的异常堆栈。
- 第 6 章:处理双重错误(double fault),避免异常处理器自身崩溃导致启动死循环。
- 第 7 章:启用 8254 硬件计时器产生定时中断,处理键盘扫描码输入。
页错误(Page Fault)的异常现场与堆栈信息
2.4 管理内存:分页、堆与分配器设计(第 8–11 章)
- 第 8 章:讲透 x86-64 四级页表(L4–L1)和虚拟地址到物理地址的翻译流程。
- 第 9 章:实现帧分配器与页表管理器,用递归映射让页表自身可寻址。
- 第 10 章:基于
alloccrate 实现全局堆分配器,内核中可用Box、Vec。 - 第 11 章:横向对比 bump、固定块、链表三种分配器设计的取舍。
内核堆分配器演示:分配地址与引用计数输出
2.5 进阶控制:内核里的多任务(第 12 章)
讲解协作式多任务:Futuretrait 设计、async 状态机转换与 pinning,并在内核中实现一个异步键盘任务与简易执行器(executor)。这是通往抢占式多任务与线程调度的基础。
上手路径
普通用户:直接读(零环境成本)
- 按 第 2 版正文目录 从第 1 章顺序读起,中文读者打开各章
index.zh-CN.md。 - 每章含完整代码、图解与 QEMU 运行截图,不搭环境也能读懂全部原理。
- 建议节奏:每天 1–2 章,前 4 章是一个完整阶段,读完即可复现"内核启动并打印"。
开发者:5 步从源码构建并启动内核
前置依赖:Rust 工具链、QEMU,以及构建工具bootimage(执行cargo install bootimage安装)。
git clone https://gitcode.com/GitHub_Trending/bl/blog_os cd blog_os git worktree add code post-12- 上面第三行会把
post-12分支的代码检出到code子目录。 - 进入
code目录执行cargo run,一条命令完成构建、加引导头、启动 QEMU。 - 想复现某一章的中间状态,把分支号换成对应的
post-01至post-11即可。
通过 VGA 文本缓冲区输出 Hello World 的内核
进阶技巧
- 多章并行开发:各章代码在独立分支上,用
git worktree可同时检出多个章节的代码,不必反复切分支。 - GDB 单步调试内核:教程提供了 GDB 搭建章节(见 extra 目录),以 TUI 视图逐行执行内核源码,定位启动期问题。
- 跨语言查阅:同一章节并存中简、中繁、日、韩、法、俄、波斯、阿拉伯语版本,对照阅读术语更准确。
- 特殊环境构建:extra/building-on-android 演示了非桌面环境的内核构建流程。
GDB TUI 模式内核断点调试
排障速查表
现象:
cargo run报bootimage: command not found可能原因:构建工具未安装解决步骤:执行cargo install bootimage,再重新运行构建。现象:内核刚启动就 panic,提示与 red zone 相关可能原因:Rust 默认代码生成使用红区(red zone),内核态下会被中断破坏解决步骤:在
.cargo/config中为 target 添加-C target-feature=-red-zone(教程第 2 章有完整说明)。现象:QEMU 启动后卡死或陷入双重错误可能原因:IDT 描述表未正确加载,或内核栈空间不足解决步骤:对照第 6 章检查异常错误码,确认 IDT 基址已写入寄存器、栈大小充足。
现象:单元测试全绿,内核在 QEMU 中仍失败可能原因:只跑了宿主侧测试,未覆盖虚拟机内行为解决步骤:按第 4 章补充基于 QEMU 的集成测试,用虚拟机输出断言。
现象:GDB 无法附加到内核可能原因:QEMU 未开启调试端口解决步骤:以
-s -S参数启动 QEMU(监听默认 1234 端口),在 GDB 中执行target remote :1234连接。
最后提醒
- 注意协议边界:博客文本是 CC-BY-NC 许可,可用于学习分享,不可商用再发布;内核代码为 Apache-2.0 / MIT 双许可,可直接用于你的项目。
- 所有示例只在 QEMU 中运行,切勿把内核镜像写入物理磁盘。教程代码随 Rust 版本演进,若遇编译错误,请检出与章节对应的
post-XX分支而不是主分支。
【免费下载链接】blog_osWriting an OS in Rust项目地址: https://gitcode.com/GitHub_Trending/bl/blog_os
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考