0%

zHappyFish-rCore-study-record

训练营学习记录

这篇文章用来记录我在2023秋冬季开源操作系统训练营的学习过程,之所以会参加本次训练营,是因为我想进一步学习操作系统以及Rust编程语言。

第一阶段(1-2周)

本阶段的主要目的是掌握Rust编程语言,为后续学习打下基础。

第一周

在参加训练营之前,我有学习过Rust,但之后并没有做过有关Rust的项目,只用Rust刷过题,以至于之前学过的知识很快就忘了,所以我并没有马上开始做训练营的题。

本周我将环境配置好后就开始重新过一遍Rust,主要重学了Rust的所有权、借用、泛型、特征、迭代器、生命周期、智能指针、多线程、迭代器。

第二周

本周我开始完成训练营的题,题目不难,但很有针对性,基本上就是各个章节的知识点,这个过程中也学到了一些重要的知识,比如build.rs、#[no_mangle],为后续学习rCore打下基础

第二阶段(3-4周)

本阶段的学习目标是完成rCore-Tutorial中的五个实验。相比于上个阶段,本阶段的学习任务要重得多,学习难度也更大,需要花更多的时间。

第三周

我首先花了一天时间配置环境,我使用的是Docker,项目中有写好的Dockerfile能直接构建镜像,可惜由于网络问题,我总是构建失败(apt-get 下着下着就卡住了,导致无法构建成功),最后只能新建了一个Ubuntu:20.04的镜像,然后在容器中按照Dockerfile的流程将容器的环境配置好,然后提交容器保存为镜像。

配置完环境后我就开始看 rCore-Tutorial 并完成实验

rCore-Tutorial 的第一章从一个应用层的Hello World开始,一点点去掉需要操作系统支持的部分,最后构建一个能在裸机上打印Hello World的程序。

第二章构建了一个批处理系统,能够依次运行导入的程序。由于没有实现文件系统,从第二章到第五章的用户程序都是同操作系统放在一起的,通过脚本生成的汇编代码来标识应用程序的起始地址和结束地址。
这一章讲到了Risc-V的特权级切换,比较重要的就是Trap的上下文切换过程。

第三章通过时钟中断实现了分时多任务系统,比较重要的就是switch过程,切换任务时我们需要保存任务的上下文,以便下次运行时恢复。这与Trap过程是不同的,Trap是用户态与内核态之间的上下文切换,而switch是不同任务在内核态的上下文切换。

第四章实现了Risc-V的三级分页机制,这里采用双页表的实现方式,即一个任务的用户态和内核态使用不同的页表,这使得我们在Trap时还需要完成页表的切换。为了使得页表切换时程序能按正常的顺序执行,内核页表和用户页表都必须映射一段相同的地址空间,这段空间保存的代码就是Trap过程的跳板。

第五章实现了进程管理,调整了一些数据结构,将进程的执行交给各个CPU(不过这里只有一个CPU),将当前运行的进程id交给Processor结构(它是处理器的抽象),然后将进程的调度交给TaskManager。为了支持在用户态输入命令,还实现了一个简单的shell程序以及sys_read系统调用。新建进程则由sys_fork和sys_exec完成。

第四周

待续。。。。