0%

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


自我介绍

我是一个来自于山东某普通一本的学生。爱好广泛,不过最喜欢的是计算机。在小的时候就非常喜欢看数码方面的内容,比如各种手机电脑,对其中的参数,性能,价格方面都有自己的见解。也经常关注圈子的各种最新的资讯等。但由于生活在乡下等种种原因,与计算机的接触也仅限于此了,什么编程语言,操作系统几乎都没听说过,唯一擅长的就成了处理各种电脑坏了的问题。。。

来打大学之后,对计算机有了更深了一步的了解,这更加提起了我的兴趣。中途接受学校课程学过C,Java,Python,JavaScript等语言。由于平时喜欢玩Minecraft(使用Java编写), 所以当时对Java产生了浓厚的兴趣,觉得自己要好好学习Java,既能满足我对游戏上需求(为游戏编写mod), 也能成为我以后能靠着吃饭的技术。

但。。。随着我对编程语言的认识越来越深,加上种种原因,我渐渐的对Java失去了兴趣。现在看来,Python也是一门我非常喜欢的语言,但是它效率又太低。本着对编程语言的信仰,我希望能学会一门效率非常高的现代语言,现在来看,它就是Rust

与大家相遇的故事

相对来说,当今用的人非常多的Java,JavaScript,或者加上Go,这类语言现在来看就像是为写业务而存活的,他们大多出现在某产品的前端,或后端中,做成网页或者客户端。而我对于计算机的热爱并不是做网页,学到现在,相对于用这些语言写业务来说,我更喜欢原理和技术上的事情。而且我是一个喜欢挑战相对更难的事情的人(并不是说写业务简单,我只是说可能在我的视角里原理和技术上的问题是相对来说更加解决的),所以我故意没有学习搞业务的东西。

我觉得能写一个OS是一件非常厉害的事情,非常酷炫的事情,比网页要厉害得多(个人而言),正好与上学期接触了某一个课程,是与计算机组成原理和操作系统有关的课程,这激发了我的兴趣与斗志,我希望能在最后的课程设计上写出来一个简单的OS,能脱离我们现在的操作系统,直接在裸机上运行的那种。而且在这之前,我正好凭着兴趣自学了Rust,毕竟Rust靠安全和很多新颖的设计著称,而且拥有非常高的性能,我想这不写操作系统正合适!

于是我在网上搜索了Rust和操作系统相关的资料,找到了rCore和blogos, 由于先找到的blogos,于是就照着blogos做了起来。当然,结果没有那么的好,由于有限的时间,加上知识的匮乏,最终只完成到了简单的中断部分,但我觉得这是一个非常好的经历,在我真正去自己写操作系统的时候,我发现并学习到了很多很有意思的设计,而且感觉成就感满满,虽然我做的内容不多,但我觉得我收获很多。我最后也是把它交了上去,虽然是个半成品,不过毕竟时间比较短,这也不算是次的作品了。

之前看过rCore的book,上面有训练营的链接,但我每次看到的时候,都发现已经开展了一段时间了,也不知道怎么参加, 不知道确切的时间。不过在这学期,我有个朋友发了训练营的链接,正好碰上正式开启的直播,朋友知道我学过Rust,就鼓励我参加。虽然深知困难,但我觉得依然要抓住机会,于是就报名了咱们的训练营,不过有点遗憾的是我朋友并没有参加本次训练营。

第一阶段

第一阶段对我来说还是相对轻松的。。。(也许)。其实虽然开启直播后马上就开第一阶段了,但是我却还是在开启了一周后才报的名,原因是在某个小岗位上写业务相关的东西(虽然不喜欢但有时候觉得还是得写写……)。不过由于提前学过Rust,直接做rustlings就可以了,然后就是比较顺利的用半周差不多的,每天的空余时间写了写就过了,然后剩下的时间就去忙校内安排的课程了(课太多了),再加上正好体测加各种实验实在忙不过来,等再次反应过来第二阶段都过了半周了。。。

其实我还是挺愿意写一个rustlings100题的题解的,不知道有没有空。毕竟用github page+hexo搭过简单的博客,还是很愿意写这些东西与大家讨论分享的,能学的很多很多的新知识和新方法。

第二阶段

第二阶段对我来说就比较煎熬了。。。

一窍不通

毕竟前面说,等我反应过来二阶段已经过完半周了,正好有空我抽出来了很多很多时间去研究第二阶段。我错过了第一节课的直播,且正好没有录播……而且我也没找到多少关于二阶段的资源,我甚至不知道哪些是二阶段的资料,Github的那个仓库怎么用我也不知道,命令也跑不通,题也不知道是什么……反正一头雾水。而且感觉自己落下很多了,也不好意思发消息问。没办法就硬回去看群里的消息,几百条划上去从头硬看,好不容易能翻出点东西来,就去尝试了。我甚至不知道到底是clone哪个仓库,到底是自己的还是README.md里面的仓库,我寻思不管啥先拉下来再说,拉下来然后也没跑通。后来翻消息发现有指导书和一个哥们发的公众号,于是花了一天也是把环境搭好了。但之后怎么跑呢,反正也是不知道……好不容易后来看到朱老师说从某一条指令开始运行,再加上第二次直播,我立马就明白了每一条是干啥用的,后来就成功能跑起来了。

初入茅庐

后来就是针对任务书进行学习,ch1,ch2,ch3相对来说我还是容易理解的,因为之前做过一次差不多的缘故,理解起来相对容易一些。不过读代码可就没有那么容易了,太煎熬了,我刚开始学急了,不知道从哪里下手。不过现在来说好像因为过去一段时间了,不是很记得当时是啥状态了。而且当时很讨厌unsafe这种东西,但是这里又有很多这玩意,我每次都会发出疑问,我真的可以直接修改内存吗,真的可以吗,真的吗?总是就是很不习惯,因为之前也没有接触过。不过后来也是慢慢稳住了,真的要冷静下来看代码,掌握一点技巧读起来也不会那么困难。系统的主要结构都会放在结构体中,然后提供一些方法,其实无非就是那老几样,找到头找到尾,捋清了关系,程序的运行逻辑也就慢慢的清楚了。而且幸运的是,我第一次尝试make test,就直接全部通过了,这给了我非常大的信心,然后我尝试去挑战ch4……嗯……差点人直接在ch4没了。

怎么说呢,ch4我感觉确实是看book好一点,ch4之前我也是看指导书,到了ch4之后我看了一遍指导书,感觉一头雾水,就只好去硬扒代码,但这代码吃素的?直接给我上嘴脸,看的我一头雾水。而且这次我没有基础了,上次做也没有做到内存这块,这学期老师讲的也没听懂(校内),这里卡了我好久。而我这段时间是几乎天天看这个东西,课上看这个,晚上也看,看到24点,研究代码,但……效果一般。后来看群里又去扒了一遍book,半天就扒完了,豁然开朗,第二天就做出来了,如释重负的感觉。兴奋的我提交之前,提交之后又没有做任何改动摁跑了几次make test,太开心了。(而且代码里面还有一些我的心理路程和各种翻译,虽然删了一些……)

实现上来说的话,就是差不多大体搞清楚了框架,address.rs就是usize包装成了各种地址页号之类的,两个allocator感觉我说不太清楚,而且感觉可能用不到就没再继续细看,然后memory_set和page_table就关键一些,一个是页表,一个MemorySet存页表和相应的地址空间,MapArea虚拟页号的连续区间。当然,我觉得大大简化难度的是原本就提供了一些方法,我直接拿去用了。读着读着我就觉得这个insert_framed_area就很适合去做这个实验,尝试了一下测试通过了,然后接触映射的我就照着insert_framed_area反过来写了几个函数,包装了一些。然后我写代码的时候还有一点洁癖,比较喜欢整洁一点……然后不喜欢破坏原本的结构,还有封装性,我很少会把原本private的东西改成public,反正……就是洁癖……然后也是非常顺利的通过了。

渐入佳境

ch4困扰了我好几天,半周多,ch5就好很多了,ch5我仍然看的book,而且这次不是我学的相对薄弱的地址了,这次进程相关的内容我正好前一阵子做业务的时候接触过很多了,理解起来相对容易一些,然后也是差不多两天左右时间通过了,找到技巧之后,感觉一切都好了起来,而且每章的那个新增结构,加上每个结构体前面的描述,基本上不用看具体的代码就能理解个大概。不过……第二阶段结束了,勉勉强强及格吧,还是得加把劲。

未完待续

关于收获

感觉这次二阶段收获还是蛮多的。同时压力也比较大(因为一开始觉得二阶段结束没全做完就无法参与三阶段了),晚上睡觉都想这些事,不过后来宽限了条件加上实验顺利通过了一些就感觉好了。

三次实验,每次做完都很高兴很高兴,
第一次是因为调试了很多次终于能正常跑起来了,而且是一次过。这无疑起了个好头,我很想分享此次的喜悦,原本想写一个blog,帮同样迷茫的朋友度过第一关,条件就是如果我能两天拿下ch4我就写,然后……我半周多才拿下ch4,就没有后续了。
第二次是因为历尽千辛万苦终于过了ch4,相对于我一开始面对ch4的内容,毫无头绪,到大体上理解结构,非常感慨,而且离进入三阶段也非常近了。
第三次是因为能成功进入三阶段了,努力没有白费,而且自己也没有那么笨,至少及格了。

而且对于学习上,也懂了很多。一开始我总是逃避去细看代码,尤其是汇编,一但遇到难读的我就不喜欢去细看,导致我花了更多的时间,偷懒最终还是要付出代价的。
而看懂了源码,弄懂了结构,就不会出现没有头绪的感觉,而是感觉自己点子很多,实验根本不在话下的感觉。都是些很模块化的东西,而且还提供了很多现成的方法,可以去使用和效仿。
我还学会了要勇敢面对自己害怕的事情,不能逃避。这件事不光是对写OS这件事而言,其实我以前非常讨厌unsafe,关在unsafe里的东西,我不知为何就不喜欢去想它的作用,有些名字特别长的函数我就会自己觉得自己看不懂,就非常苦恼。以前我总是逃避他,越逃避它,它就越折磨你。我这次是深有体会的,就这个,unsafe,裸指针,内存分配,我硬着头皮把我只要有疑问的全搞明白了,虚拟内存这里的各种名词(我才知道好几个不同的名字指的是同一个东西),每个名词都认明白是什么意思。虽然我弄明白他们需要花时间,但是我真的弄懂之后,后面的工作会好做很多很多。

最后感谢各位老师同学举办了这次活动能让我收获这么多,同时也感谢在群里面交流和帮我解决问题的大佬小佬们。咱们国家的计算机行业有大家在,以后一定会发展的越来越好,越来越强大!!