0%

2024春夏季训练营第一阶段总结-qiuanran

前言

在去年秋天听闻了这个训练营,机缘巧合之下结识了Rust和rcore。 也许是由于rust这门语言入门门槛比较高,加之当时没有其他更modern语言的学习经验,只做完Rustlings就已经打算放弃了。从去年秋天到现在一直在写Rust,也了解了许多系统方面的知识,就打算在这次训练营中弥补一些遗憾。

第一阶段

心得

第一阶段更多的是教初学者通过查手册、book或者是问AI来逐渐了解Rust的各种特性,如所有权机制(一个value只能对应一个所有者)、RAII机制(自动回收)、智能指针(个人认为智能指针的学习更多的应该落实于应用场景:即它为什么而存在的问题)、生命周期(我认为它的存在更多的是帮助编译器编译)等,这些是Rust比较有意思的机制,也是大大保障了代码安全性的由来。

体验

有了去年以来一直积累的Rust经验,做Rustlings倒是非常快了。最后出的十道算法题非常有意思,大大加深了我对于智能指针的认识,虽然都是入门的算法题倒算是个很新奇的体验。

资料

由训练营给出的学习资料,同时也推荐Stanford的CS110L。

第二阶段

学习过程

rcore这个类Unix内核对于了解各种OS的各种核心内容而言是非常有帮助的,实际上,若不是有了Rust的一些经验,很难理清由理论转换为具体实现的过程。

对于rcore的学习,刚开始我十分痛苦,看着后面的实验要求一时间无计可施,只能由各种已经实现的syscall一个个去trace他们的调用关系,才有了一点点的大致思路。但具体实现起来又有其他的问题,这时候我的目光就放在了具体的数据结构上,需要彻底弄明白每一个数据结构的具体功能、与其他数据结构的关联,才能够说很好的掌握了整个流程。

rcore总结

  • Chapter1-2:需要关注于环境如何一步步搭建,如何切换特权级
  • Chapter3:难点在于理解任务切换时候的流程:trap上下文的保存。应用在内核中处理时, 其 Trap 控制流调用__switch函数,这个函数非常重要,里面就是任务的上下文寄存器。
  • Chapter4:对于我而言,虚拟内存几乎是最难的一个章节了,以至于看到实验要求的时候说注意数据被切分成两个不同的页表中时我甚至不知道它想表达什么,反复观看、查找资料之后才能艰难完成。
  • Chapter5:关键在于理解有关进程的每一个数据结构,以及它的调度机制,重点需要弄明白suspend_current_and_run_next这个函数以及整个task的工作流程:take_current_task 来取出当前正在执行的任务,修改其进程控制块内的状态变成Running,随后将这个任务放入任务管理器的队尾。接着调用 schedule 函数来触发调度并切换任务。
  • Chapter6:文件系统相比起前面的章节有些异常庞大了,需要抓住核心抽象以及它的层次结构。
  • Chapter7:了解进程之间如何通信,关注于各种不同的通信方式。
  • Chapter8:并发是OS绕不开的一个话题,掌握各种锁+线程的概念对于理解并发有奇效,但其实Rust的很受欢迎的异步并发并没有提及,想来是语言特性而不属于OS教学层面上的。推荐一个了解Rust异步并发非常好的读物:Async in depth | Tokio - An asynchronous Rust runtime

一些心得

我觉得最重要的,也是支撑我艰难走过rcore这道难关的就是一个观念,在南京大学的OS课程上反复强调的:操作系统就是一个应用程序。这也是我在进行每一个lab后最大的感触。在接管了trap之后,所有的一切都是逻辑上的开发,与不同的应用程序没有什么区别。

资料

  • 南京大学OS课程
  • MIT6.S081: xv6 book
  • CSAPP