news 2026/9/9 21:13:02

Blog OS:用 Rust 写操作系统的 12 章渐进式教程与内核构建完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Blog OS:用 Rust 写操作系统的 12 章渐进式教程与内核构建完整指南

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-01post-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 实现全局堆分配器,内核中可用BoxVec
  • 第 11 章:横向对比 bump、固定块、链表三种分配器设计的取舍。

内核堆分配器演示:分配地址与引用计数输出

2.5 进阶控制:内核里的多任务(第 12 章)

讲解协作式多任务:Futuretrait 设计、async 状态机转换与 pinning,并在内核中实现一个异步键盘任务与简易执行器(executor)。这是通往抢占式多任务与线程调度的基础。

上手路径

普通用户:直接读(零环境成本)

  1. 按 第 2 版正文目录 从第 1 章顺序读起,中文读者打开各章index.zh-CN.md
  2. 每章含完整代码、图解与 QEMU 运行截图,不搭环境也能读懂全部原理。
  3. 建议节奏:每天 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
  1. 上面第三行会把post-12分支的代码检出到code子目录。
  2. 进入code目录执行cargo run,一条命令完成构建、加引导头、启动 QEMU。
  3. 想复现某一章的中间状态,把分支号换成对应的post-01post-11即可。

通过 VGA 文本缓冲区输出 Hello World 的内核

进阶技巧

  • 多章并行开发:各章代码在独立分支上,用git worktree可同时检出多个章节的代码,不必反复切分支。
  • GDB 单步调试内核:教程提供了 GDB 搭建章节(见 extra 目录),以 TUI 视图逐行执行内核源码,定位启动期问题。
  • 跨语言查阅:同一章节并存中简、中繁、日、韩、法、俄、波斯、阿拉伯语版本,对照阅读术语更准确。
  • 特殊环境构建:extra/building-on-android 演示了非桌面环境的内核构建流程。

GDB TUI 模式内核断点调试

排障速查表

  • 现象cargo runbootimage: 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 21:12:00

人脉贡献率算法:用数据思维颠覆泛社交,构建深度人脉维护计划

1. 先别急着加好友:你的人脉到底谁在“创造价值”我微信里有接近两千个联系人,前几年一直觉得这就是资源。直到有一次我想换条职业赛道,把自认为“关系不错”的朋友在脑子里过了一遍,真正能开口深聊、并且能给出关键建议和机会的人…

作者头像 李华
网站建设 2026/9/9 21:11:54

Redis网络模型深度拆解:IO多路复用与多线程IO实战

作为每天和 Redis 打交道的人,我一直觉得网络模型这个问题特别有意思。你随便去网上搜“Redis 高性能的原因”,十篇文章里有九篇会告诉你“因为单线程、因为 IO 多路复用”,但你再追问一句“为什么单线程却能扛住十万级的 QPS”“Redis 6.0 之…

作者头像 李华
网站建设 2026/9/9 21:10:42

C#网络抓包实战:基于SharpPcap的TCP/UDP协议解析工具开发

简介:这是一份基于C#语言的网络数据包抓取工具源码,面向希望掌握网络底层通信的开发者。工具借助套接字编程与抓包库思想,实现IP、TCP、UDP数据包的实时监听、捕获和解析,适用于网络调试、协议学习与安全分析。资源共八十二个文件…

作者头像 李华
网站建设 2026/9/9 21:10:34

STM32F103软件IIC驱动LIS3DH三轴加速度计完整指南

简介:面向嵌入式开发者的STM32F103与LIS3DH三轴加速度传感器通信实现,采用GPIO模拟IIC总线方式驱动,已实测通过。压缩包共4个文件,含2个C源文件与2个头文件,整体仅12KB,涵盖IIC底层时序模拟与传感器数据读取…

作者头像 李华
网站建设 2026/9/9 21:10:12

STM32步进电机闭环控制:编码器位置反馈与PID实现

简介:STM32驱动编码器步进电机是一份基于STM32F103ZET6的嵌入式运动控制示例工程,适合正在学习电机控制、定时器PWM与编码器反馈的开发者。资源以Keil工程形式提供,包含完整C/H源码、编译生成的O/HEX/AXF等固件文件以及工程配置文件&#xff…

作者头像 李华