0%

2025秋冬季开源操作系统训练营第一二阶段实验总结报告-Dirinkbottle

基础阶段-Rust编程

难点: 从自由的C转向Rust的学习是一个比较艰难的过程,尤其是所有权系统。对我来说,习惯了C语言写代码后,所有权是Rust的第一个难点,不能再用C这么自由的内存管理了,需要仔细处理所有权问题,也是我学Rust最艰难的一段时期——和编译器斗智斗勇。

但是Rust的所有权优点显而易见:

  • Rust会自动管理内存,防止一些C普遍遗留的内存泄漏
  • 在系统编程中使用Rust可以完全避免悬垂指针等问题
  • 性能好,不逊于C

Rust拥有好的工程管理工具Cargo,这对于系统开发有着减少大量工作量的作用,也利于实现之后的组件化操作系统Unikernel。

在完成Rustling的练习之后,我的Rust编程能力得到很大的提升,为专业阶段的OS设计与实现打下了坚实的基础。

专业阶段-OS设计与实现

到了最喜欢的阶段了,OS的每个模块都深深地吸引着我。我花了10天的时间学完并且完成了rCore-Tutorial-Guide-2025S、rCore-Tutorial-Book-v3的大多数实验。我将rCore-Tutorial-Book-v3当作理论知识教学书,rCore-Tutorial-Guide-2025S当作实验手册。

令我印象最深的: 地址空间。依靠MMU给应用创建了一个虚拟的地址空间,应用本身以为拥有全世界,其实尽在操作系统的掌控之内!

这个阶段也是我运用理论知识进行实践的一个开始。在完成大部分实验之后,我不满足在现有的框架内翻找API,并且希望更深一步地理解rCore。然后我打算学着rCore的思想自己写一个操作系统内核。那晚我开启了GitHub仓库,并且给我这个OS kernel命名为BlueStarOS! 在此贴上链接https://github.com/Dirinkbottle/BlueStarOS

我改装了rCore的Makefile快速搭建起了依赖和基础框架,基于RustSBI开始着手内核开发。在自己动手完成内核时,我才知道自己实现需要解决大量的问题。

碰到的最大难点: 调试困难,内核的小bug较难排查。

遇到的问题:

  • 在我建立内核地址空间时,我错误地把PageTable的页号×页大小直接当作页表指针(也可能是当时脑袋发昏),导致之后切换页表后无法翻译内核地址空间的数据
  • Rust中的编译优化导致的玄学问题,例如特意的占位符会被优化掉
  • 内存屏障问题…

在此期间,我学会了如何快速使用QEMU配合GDB进行调试,GDB帮了大忙。之后我一直开发这个内核,到了目前基本完成了:

  • 内存管理
  • 系统调用
  • 陷阱处理
  • 大部分任务调度
  • 内存文件系统

这些实现都是最小化的,利于我理解和学习。

项目基础阶段-组件化操作系统

得益于Rust高效便捷的包管理系统,组件化操作系统可以方便地实现。在这一阶段我主要学到了内核开发中组件化的思想。

组件化的优势:

  • 不用手动造轮子实现每个组件,例如内存管理模块,这部分内核之间基本通用
  • Unikernel的组件化赋予了它极其灵活的特性,既可以针对单个应用进行定制,让整个操作系统内核全部针对这个应用来设计
  • 不仅提高了应用的运行性能,而且还提升了应用的安全性
  • Unikernel可以最小化组建应用的执行环境和运行环境然后快速上线
  • 去除了冗余功能和不必要的模块,正如一些文章所说,”我都没有shell你拿啥反弹”
  • Unikernel也可以扩展为宏内核,拥有功能完备的操作系统所有该有的模块

这一阶段的实验难点: 项目文件比较大,系统结构较rCore有很大不同。我花了几天时间合理利用AI来帮助理解Unikernel的构建思想和分层以及一些小语法。在实验过程中我也对Unikernel的设计思想理解更深一步!

遇到的问题: 今天遇到了一个棘手的小问题,在simple-hv实验中完成实验后本地运行测试会卡住。这期间我修改了很多次代码依然如此。经过问题排查得知是QEMU的事件型驱动出的岔子,在用管道传递运行结果时大部分时间会卡住。调整了一下脚本就解决了问题。


马上将要进入真正的项目阶段,我满怀期待,希望在项目阶段能学到更多的操作系统的知识!