从2024年10月开始,我在郭老师和陈老师的指导下开始系统学习 Rust 操作系统,到目前为止已有半年时间,现总结如下。
学习过程
学习主要分为 3 个阶段:Rust 语言学习阶段,操作系统训练营阶段和 Starry 实践阶段。
Rust 语言学习阶段
2024年10月-11月,我参加了 Rust 学习赛。在此之前我对 Rust 的了解仅限于一些最基本的语法,没有用 Rust 写代码的经历。这次比赛于我而言是以赛促学,直接投入实践。我先是通过看训练营的课件和网上的一些资料,完成 rustlings 的练习,初步熟悉了 Rust 的语法和一些基本概念。然后参加比赛。初赛相对简单,只需要完成一些相对短的代码片段。复赛难度提高,特别是最后一题的内存分配器,我尝试了 c2rust 库,但由于需要一些改造才能适配,最终失败了。通过这一个多月的学习,我对 Rust 有了初步的了解。
操作系统训练营阶段
2024年11月-12月,我参加了操作系统训练营,学习了 rCore 的基本原理和实现和组件化操作系统的设计和实现,并且在项目阶段参加了对应用的支持。训练营的专业阶段和项目基础阶段中,我学习了如何从零开始实现一个 Rust 操作系统,以及在此之上拓展到 unikernel 和宏内核。我完成了这两个阶段的课后练习,加深对 Rust 和操作系统的理解。训练营的第四阶段中,我选择了在 new Starry 上支持 Python。经过一段时间的 debug 以及和同学的交流后,实现了在 new Starry 上运行最基本的 Python 测例。通过两个月的学习,我对 Rust 操作系统有了基本的认识,并且获得了一些实践的经验。
Starry 实践阶段
2025年1月-4月,我参与了 starry-next 的开发。一开始是熟悉 starry-next 的代码结构,通过运行并尝试补充实现2024年操作系统比赛的测例来加深理解,在这个过程中我也参考了其他同学的一些实现。开学之后的工作转移到在四种硬件架构上通过2025年操作系统比赛的测例,比2024年的测例多了许多。我与大实验和本科毕设的同学一起开发。3月中旬之前主要专注于 basic 测例的实现,一开始2024年版本的 starry-next 可以通过所有的测例,但 2025 年版本代码改动,所以花了一些时间去适配。之后专注于 libc-test、busybox、lua、iozone 测例。除了硬件层面的问题,大多数测例实质上是要完成一些 syscall,以及可能对操作系统的一些组件的改动。一开始我主要负责若干个文件系统相关的 syscall 的实现,但随着开发的进展,涉及的 syscall 也不限于文件系统。在这个过程中我学习了许多其他同学的实现,也向主线提了一些 PR。4月底,我一直在尝试实现 iozone,目前定位到原先无法通过测试的原因是共享内存和 select(实际 iozone 调用 select 是为了 sleep)未实现,而目前粗糙的实现依然存在 iozone 会不断调用 select 陷入死循环的问题,有待进一步排查。
学习成效
Rust 学习方面,通过了训练营 rustlings 的所有练习,通过了 Rust 比赛的初赛所有题目和复赛除了最后一题之外的所有题目,获得优秀奖。
操作系统方面,完成了训练营的所有练习,为 starry-next 和 ArceOS 提了若干个 PR,最终能通过2025年操作系统比赛初赛的大部分测例。
问题和解决
第一是语言问题,一开始学习 Rust 的时候虽然过了一遍内容,但并没有完全理解,在后续开发的时候依然会遇到一些看不懂的报错,只能上网搜索。但是语言的学习确实也只能这样,在运用的过程中记忆。
第二是环境和开发方式问题,我尝试了许多不同的环境,包括 WSL、GitHub codespace、阿里云服务器、实验室服务器等,以及在其上的 Docker 环境。starry-next 的配环境确实有点麻烦,另一方面也是我自己对于容器环境的了解不够深入。最终我选择在实验室服务器上自己配环境,以及在 GitHub codespace 用其他同学写好的配置。
第三是开发过程中遇到的各式各样的操作系统的问题,也是我需要实现的地方,比如 glibc 的 tmpfile 函数依赖 fcntl 函数的 F_GETFL 参数,比如 fstatat 函数中 to_string 函数会在字符串后 padding,导致 utf-8 解析错误,比如 glibc 的 fstat 函数调用的是 fstatat 函数,而代码中在unlink 之后依然用文件名访问等等。这些问题都在我阅读代码和 man 手册后得到解决。具体问题和解决过程见 starry-next 宏内核扩展实践记录。
下一步
2025年4月开始,我补充学习了操作系统训练营中之前没有学的虚拟化章节,并且通过阅读 axvisor 的代码和文档来进一步学习虚拟化。接下来我将参与到组件化虚拟机方面的实习研究工作中,从 riscv 入手,逐步延伸到 aarch。