0%

2023开源操作系统训练营第二阶段总结报告-庄广

前言

我是一名工作了五年的社畜,先后用过php、go语言开发应用端的程序,尽管接触过一些操作系统的知识,但都是二手资料,只了解个大概。

我对问题都会追本溯源,想了解得更深一点,这样才能更好的总结归纳。

工作中用的很多工具以及知识底层都涉及到操作系统,只有了解了操作系统内核才能更好的理解整个计算机体系结构。

国庆节前在网上冲浪时,无意中看到Rust语言中文社区有关于开展开源操作系统训练营的公告,了解后,竟然是免费教程,太让人惊喜。

机不可失失不再来就立马报名参加了。

第一阶段rustlings 100道题

这一阶段的题相对比较简单,我花了一周的时间就刷完了。但也发现了自己的盲点,比如高级生命周期这块,是从没了解过。

顺带一提,我承接了队长的工作,解答队员不懂的知识点,队员都很争气,基本都没这么问我,都能完成rustlings100道题,到第一阶段截至,8名队员有7名晋级,
还有一名太忙了,没时间做,也不参加后续的了。

第二阶段 r-Core内核

第零周

也就是完成rustling之后,我开始摸索搭建实验环境的搭建和看第零章的内容,到第一周开始,环境已经搭好和看到第一章

第一周

发现第三章才是第一个实验,奋起直追,主要的时间都发在阅读文档中,我看的是详情书,看到周六才到第三章末。

周六才是完成实验,实验不是很难,主要在于理解两个异常控制流的转换,all_trap和switch,理解特权级切换硬件都干了什么,软件如何衔接。

最终在周日完成了第一个实验。

第二周

第四章比前面三章要理解的东西都多,而且也很难。可能对于我来说,操作系统这块内容比较陌生,没有一个概念,做起来就有点畏手畏脚。

如何将用户态的一个变量赋值,这个变量还可能分散到两个实际不相连的物理页,实在想不到如何下手。群里的大佬支招,让我把结构体的字段拆开分别赋值,
这个方法可行,但不通用,每个结构体字段都不一样,每个都要根据它的字段分别赋值,很麻烦。

最终我想到的方法是,写一个通用的方法,根据用户态的指针查到对应物理页面,在内核态实例化一个和用户态一样对象,转化成字节数组,将字节数组拷贝到物理页面中。
这个方法收到拷贝应用数据的方法的启示,我不用管对象是什么,只需要当成字节数组来看,逐页拷贝就行。

只要理解了虚拟地址空间和物业页帧之间的关系,mmap和munmap都是比较好实现。

第三周

前面两周只做到了实验2,接下来的一周虽然很快看完了第五章,但是完全没有时间完成实验,只能到周末完成。

实验3相对于实验2算比较简单的,前面抽象的概念都已经展开,实验3只不过增加了fork、exec之类的系统调用,用于生成新的进程。

spawn只需要获取pid和从elf中获取堆栈等信息,组装成一个taskControlBlock,并加入到任务队列即可。

stride算法的实现需要扩充两个字段stride和priority,并在每次进程切换时stride加上pass,pass= big_stride/priority。之后是修改任务管理器的fetch方法,
实现fetch能获取最小stride进程,我将VecQueue改成LinkedList,为了好从中间去掉某个节点。

总结

  • 在这5周内,学习到很多知识,以前很模糊的点现在已经清晰了,感谢训练营给了这个机会
  • 因为是打工人,上班完全没法摸鱼,学习的时间不是很多,很多时候都是在地铁上,休闲时间里来完成实验。但这五周都过得很充实,尽管也很忙
  • 接下来就要进入第三阶段,希望能学到更多的知识