前言
大家好,我是来自济南大学的李宇。
如标题中所说,我是今年应届考研的学生,目前的目标是清华大学,但是我作为一名跨考生,又碍于没有项目没有论文,机缘巧合之中在向勇老师的 学堂在线 OS 课程交流群 中看到了本次活动的消息,所以就报名参加了该活动。
不知道是因为努力还是因为运气,我在本活动第一个月的进展还算顺利,在活动的第 20 天就几乎完成了所有的项目,所以我想在此分享一下我在这一阶段的学习经验和总结报告。
学习经验
本次活动的第一阶段主要分为 Rust 学习、RISC-V 学习、rCore 实验三个部分,下面我将简单分享一下我的经验。
Rust 学习
关于 Rust 的学习,这个我自认为没有什么发言权,因为参与活动的还有很多早就接触过 Rust 的大佬们,我只能作为一个萌新分享一下入门的方法。
首先是 Rust 的入门,也就是了解相关的语法。这方面我认为 Rust by Example 和张汉东老师的《Rust 编程之道》用来入门都是不错的。如果想要快速入门,那么我推荐前者;如果学有余力,想学得更扎实一些,那么我推荐后者。
关于语法的了解,我自认为是比较简单的,如果大家有一些其他语言基础的话。语法无非就是那几点,只是 Rust 需要再额外注意一下所有权和生命周期等问题。
了解完语法后,可能对这门语言还是有点似懂非懂的,这时候我建议去亲自上手做一些小练习,比如笨办法系列。这种办法虽然笨,但是用这种方法学到的也确实扎实。
这时候,可能就对 Rust 有了比较深入的了解了,那么就该进行下一步了:了解 Rust 的模块化编程。这一步推荐张汉东老师的《Rust 编程之道》第十章,写得很详细了。时间紧的话涉及 Rust 2015 的可以跳过一下,至少目前是用不到的,需要的时候再来当作手册查阅也可。
完成以上几个步骤后,我认为这就算 Rust 入门完成了吧。
RISC-V 学习
对于 RISC-V 的学习,我认为了解一下非特权指令,然后重点看特权级相关的指令和寄存器就行吧,虽然在 rCore 中有关特权寄存器的操作都被封装到一个名为 riscv
的库中了,但是还是要了解原理的嘛。
我是之前有接触过 MIPS 指令集的,所以对同属与精简指令集的 RISC-V 有种触类旁通的感觉,学得也比较快,所以在这一步节省了很多时间。
其实对于 RISC-V 的了解也不需要特别多,重点了解一下原理,尤其是特权级相关的原理就好了,毕竟 rCore 中没有需要直接编写 RISC-V 汇编代码的实验,需要的时候再当手册查嘛。
rCore 实验
接下来就是最重要的 rCore 实验了。
对于实验指导和实验题,我的理解是:实验指导是帮助我们理解 rCore 的实现过程,以至于了解 rCore 的理念或者说是哲学的一个过程,而 rCore 实验则是指导我们检验是否真正理解 rCore 的过程。
所以我认为,实验为主,实验指导为辅。结合助教们精心设计的实验题,可以帮助我们更加深入地理解 rCore。
此外,我还是想吐槽一下 Unsafe Rust(
我在上面说的,几乎完成所有项目,指的是还未完成没有准备好实验框架的实验三,以及完全做不出来的实验二的挑战实验。
实验二的挑战实验是实现 Buddy System,由于该实验是为了对堆进行初始化,所以不能使用任何需要堆内存的结构,比如 Box
、Rc
、Arc
等,排除了这些,只能使用 NonNull
或者裸指针了,这两者都避不开使用 Unsafe Rust。我之前用 Rc
实现过,单元测试一切顺利,只是无法接入到操作系统内使用,而在我将 Rc
改为裸指针后,总是出现一些莫名其妙的 bug,指针指向一些乱七八糟的地址,还包含着一些乱七八糟的值,为此浪费了我两三天时间 debug,最终我选择了放弃(
总结
在这一活动中,我学到了很多知识。
首先是对于 Rust 和 RISC-V 的学习。在这一阶段,我学到了一门新的编程语言,一种新的指令集,我最大的感受就是,Rust 这门语言好麻烦,但是也很方便、够安全。
然后是对 rCore 的学习,我学到了如何用 Rust 写操作系统,如何实现中断、内存分配等知识:
对于如何用 Rust 写操作系统,我感觉这方面比 C 语言麻烦多了。C 语言的话只需要
void _start()
就好了吧,但是 Rust 却要折腾半天。好在 RISC-V 已经有了现成且开源的 Bootloader,不需要再编写这个了,省去了不少麻烦。对于中断这一节,感觉跟 uCore 区别并不大,但是 rCore 的实验指导介绍更详细一些,让我更深入地了解了 RISC-V 中断的实现过程。
对于内存分配这一节,我已经开始渐渐感受到 Rust 包管理的美妙之处了,只需要将使用的包写入到
Cargo.toml
中,就可以直接调用了,实在是太方便了!此外,RISC-V 将外设抽象成物理内存也非常妙,可以通过对内存的读写进行对外设的操作,相对于还要使用in
和out
指令的 x86 架构,也算是为减少指令数目作出了一定贡献。对于虚拟地址这一节,使用 Rust 语言将物理地址和虚拟地址封装成结构体,并使用特性使其相互转化,非常直观且省心。
对于线程和进程这一节,我发现 Rust 对同步互斥的支持非常好,有
Mutex
等工具可以帮助我们实现同步互斥,非常方便。对于设备树和文件系统这一节,我感觉 rCore 封装得有点过度了,这一节几乎没有学到什么新东西,也没有实验可以做,也算是一个小缺点吧。
对于用户程序和系统调用这一节,这里感觉跟 uCore 差不多其实,但是还是要夸一下封装好的操作 ELF 文件的库,比 C 语言不知道高到哪去了。
感觉上面的内容跟记流水帐一样
对于已经学习过操作系统和做过 uCore 实验的我来说,参加本次活动的第一阶段,比起学到新知识,我认为更多的是认识到 Rust 和 rCore 的优越性。也怪不得有那么多让想让 Linux 内核支持 Rust 呢。
感悟
经验和总结先说到这,再谈一谈我的感悟吧。
我感觉这个活动还是蛮有意义的,很有挑战性,但是也比较费时间。我几乎将这个暑假每天的所有空余时间都投入到了活动中。说是暂时中断了考研,其实也是在为复试做准备吧。
是的,为了考研的复试可以更稳妥,我选择了暂时中断对于初试的复习。不然我作为跨考生,即使初试成绩再好,复试没有任何项目或者论文,是一定会被刷的。所以我的看法是,为了复试更有竞争力,战略性中断初试也是很值得的,就当是在复习操作系统嘛,算不上一举两得,但也是超过一举一得的。至少不亏,难道不是吗?
最后,我想夹带一点私货。我知道考研更多的是靠自己的努力,但是我也希望可以得到大家的祝福,谢谢大家~
然后,祝大家可以通过第一阶段的考核,第二阶段进展一切顺利!
就是这样,喵。