前言
首先,非常感谢 rCore 训练营提供的学习机会。在训练营里,我收获颇多,不仅巩固了以往学到的一些技法,还把以往仅在书本上了解的操作系统原理转化成了实际的项目代码,一步步看着以往学过的知识点被串联起来,真是一次难忘的经历!
训练阶段
第一阶段 Rust 学习
因为之前我并没有很深入地学过 rust 语言,想要在两周内初步掌握一门静态强类型语言还是稍微有点挑战性的。
幸好,rust 的核心概念所有权和生命周期在以往学习 C++ 的过程中已有涉猎,因此学习的过程并没有预期中那么 “陡峭”,第一周便通关了 rustlings。
虽然说字面上通关了,但是实际上有些细节部分还是没有掌握得很透彻,于是第二周便打算直接在项目代码中学习,半学半仿写地看了一遍 rCore 的代码。在项目中学习到了不少的 rust 编程技巧,例如各种 trait,from/into 的用法,泛型的使用技巧,函数式编程的思维方式等,可谓收获满满。
整体来说,rust 这门语言给我的观感非常不错,他一方面吸收现代语言的灵活性,另一方面也保留了对底层的控制能力,也 “堵” 上了不少 C++ 的坑点,接下来有计划更进一步深入学习。
第二阶段 rCore Labs
在计算机科学领域,操作系统扮演了重要的角色,它们不仅支持着现代计算设备的正常运行,还提供了深入研究和探索计算机内部工作原理的机会。因此,我一直对操作系统有着浓厚的兴趣,并渴望了解它们的内部机制。在做 Labs 的过程中,我有种逐渐拨开迷雾的明朗感,以往看作黑箱的各种操作系统机制,被具体地呈现到眼前,可谓非常地 “过瘾”。
Lab1
没有什么特别复杂的地方,主要一个坑的地方是,get_time_us 的精度问题,syscall计数很好地巩固系统调用的流程,明确地展示了特权级别切换的具体过程。Lab2
页表的具体实现比较抽象,看的过程中理了几次流程图。但是理解之后发现,其中 RAII 方式管理页帧的方法非常的优雅。在理解 mm 模块之后,mmap 和 munmap 的实现就比较直接明了了,只要做好边界检测和合法性检测,实现的过程比较简单。需要注意的是前面写的 syscall 因为内存地址空间的切换,需要把用户空间的地址转换成操作系统访问的物理地址。Lab3
spawn 仿照的 fork 和 exec,实现比较简单,stride 算法实现也比较简单,没有特别复杂的地方。Lab4
坑的地方来了,Lab3 写的 spawn 在迁移到 Lab4 后无法正常运作了。在排查了一段时间后发现貌似和内存对齐有关(莫非是编译器bug?),似乎超出了我的能力范围,决定暂时不深入探究。最后解决的方案是使用 TaskControlBlock 提供的 fork 和 exec 函数组合。而 link 和 unlink 的实现需要修改 fs 的代码,通过 DiskInode 记录文件信息,透过 OSInode,Inode 层层调用。link 的本质是两个不同名的文件指向同一个,Inode,这让我切切实实地体会到了操作系统对磁盘的抽象。Lab5
又一坑位,Semaphore 的测试点依赖 sys_get_time 函数,没实现会直接死循环。由于这次 Lab 不要求合并前面的代码,于是没考虑这个东西,一直在找算法的 bug,卡了一天多的时间。今天晚上通过群友指点才知道问题所在。。。
总结
通过训练营,我初步地了解了操作系统的内部工作原理,学习了如何编写高效且安全的系统级代码。Rust编程语言的高效与抽象让我对代码的可维护性和可靠性有了更深刻的认识。
与训练营的导师和同学合作是一个非常愉快的经历。我有机会与有经验的人合作,学习他们的技能和思考方式。团队合作让我明白了众人拾柴火焰高的道理,锻炼了我的沟通和合作技能。希望通过参加训练营,提高我的编程技能、系统级知识和解决问题的能力。此外,我希望通过与训练营导师和同学的合作,不断进步,并将所学应用于实际工作中,并对 rCore 开源社区作出贡献,未来积极参与 rCore 和 rust 社区,并期待在未来可以贡献于开源操作系统项目。
最后,我想向rCore开源操作系统训练营的所有人表示由衷的感谢!rCore开源操作系统训练营是一次宝贵的学习经历,不仅提高了我的技术水平,还拓宽了我的视野,感谢导师和组织者为我们提供了这个机会!