哪一个计算机系的学生不想写一个自己的操作系统呢?
没事的时候,我总会想这件事。自己的操作系统,它应当闪耀着新时代的光芒:使用 Rust 编写、运行在 RISC 芯片上、最好还能抛弃宏内核……但一直没有真正坐下来实现,毕竟脑中还在幻想着其他事情。
后来在编译原理群里、年级群里都看到了这次活动的通知,我感到是时候了,即使没能写出完全自主的 OS,加入一个团体鞭策自己学习 Rust、OS 也是好的。
Rust
这个活动分为两个阶段,第一阶段的第一周按计划是学习 Rust。我是觉得实用编程语言大体一个样,所以看了一篇 Rust 语法摘要之后直接去做第一周指定的 rustlings 练习题去了。
现在回想起来,这样莽撞地上手的确是不行的。在 rustlings 里遇到了很多莫名其妙的问题,都得在网上搜半天,搞得像 stackoverflow 是教材一样。后来还是好好去读张汉东老师的《Rust 编程之道》,了解所有权、Option、struct/enum/trait 这些 Rust 基本思想(同时还了解到内存泄漏不算在 Rust 可以防护的内存安全中,Rust 在我心中的地位降低了)。
做完 rustlings,书也看得差不多了,就该去做“15 道题”了。我选了去做 leetcode,做了几题感觉算是掌握 Rust 了,结果碰上一道链表题……顿时不知所措,mut 应该摆在哪,到底哪里要用 as_ref,为什么这里直接用&就能编译了……简直像对着编译错误信息猜谜。后来老师说 15 道题还要用别的语言实现一遍,使用 C++三下五除二解决了链表,让我怀疑起 Rust 是不是从设计上就有问题……
不过大多数情况下 Rust 使用起来还是可以的,并没有很不舒服。甚至在学习它的过程中,我感觉自己对 C++、Haskell 更了解了,这太赚了。有时候学习一样东西,就得看看和它不一样但相似的事物。这段时期群里经常有人问 Rust 相关的问题,张汉东老师还有各路神仙同学一起在群里解答,氛围十分好。
RISC-V
我是十分喜欢读教材的人,所以买了《计算机组成与设计 RISC-V 版》来看。RISC-V 的确设计简洁:核心指令定长,尽管可以再细分 R 型 S 型指令,但相同含义的部分在不同型指令中所占位置一样,这样可以降低硬件复杂性;把 x0 硬连线到常数 0,这样可以直接用它求相反数,还可以配合 jal 做无条件跳转;只用一条 addi 实现加减常数……
抛开 RISC-V,这本书本身也十分不错,甚至有纠正我上体系结构课的误区(MIPS 虽然符合直觉,但它完全不能比较不同指令系统的计算机)。有时间打算看完。
但是感觉直接看不如用到时在学习,所以看完《计算机组成与设计 RISC-V 版》前两章就直接跳去写 rcore 指导了。所幸指导中也对用到的 RISC-V 相关知识做了简单介绍。
rCore-Tutorial
这是本次活动的重点,也是最吸引我的地方。不过很惭愧,我不能 100%投入进去,在 28 号之前也很难完成了。不过仅仅到当前的进度我也学到了很多,赚了。
第一次了解到 SBI 这种好东西,直观感受到 Rust 相比 C++的进步还体现在构建、引用库方便上(据说 C++程序员羡慕 Rust 也主要在这一点上,内存安全相比之下太小了)。
之前一直简单地觉得堆就只有一个,我们 new 对象放进的那个,这次写了 lab2 才发现原来操作系统本身也有自己的堆,它得用这个堆去管理用户的堆。也可能在课上或教科书里也有这部分内容,但是这次真正用代码去描述这个想法更让我印象深刻。
我只做到 lab3,分页的部分。这部分多了很多类型,有些类型在目前看来只是 C 语言中一个指针的工作。不过通过实现 Rust 的 Deref、设计 drop 的顺序它们使用、销毁都变得自动化了。但我总感觉这样很奇怪,也许做到后面才会感到它们的巨大优势。之后也会抽时间接着往下写,毕竟这也算是一个长久的梦了。
总结
很感谢陈渝老师给我参加活动的机会,在我投递简历时我觉得很可能过不了,但最后陈渝老师让对 Rust、RISC-V 还有操作系统有兴趣的同学都来参加活动了。如果不参加,我可能还是会和之前的暑假一样把空闲时间浪费掉。在这不到一个月的时间我学会了 Rust(很低限度地说),体会到了 RISC-V 的简洁与成熟的生态 (至少模拟上没问题,还有方便的 openSBI、riscv crate),深切感受到了后辈的压力(发现很多大佬都只有大二,我必须更努力了)。虽然对相关方向的探索不会停止,但这次活动就要结束了。想起陈向群老师在第一次开会时说要按自己的节奏来,自己有收获即可,至少在这一点上,我可以说我收获了很多。