Rust OS 一阶段学习总结
@FinishTime: 2024-09-19 00:35:51
个人背景概述
我是一名软件工程专业的大三本科生,曾参与过 2023 年秋冬季训练营和 2024 年春夏季训练营。并且在 2024 季春夏训练营中,取得了通过的成绩。
今年的秋冬季训练营,我想冲一冲优秀,多做一些项目,多为国内操作系统和开源做出贡献。
今年一阶段学习时间表
- 2024-09-18 大约 3.5 小时,重新完成 rustlings 的官方基础习题(前 94 题)。之后,又用了大约 2 小时,完成了后续的习题(95-110)。
一阶段学习内容概述
我按照“rust 语言圣经”上的讲解顺序,复习之前的知识点。
由于我在那段时间之前,在参加 InfiniTensor 的 AI 训练营,所以 rust 的基础语法等根本没有落下,这使得我在完成 rustlings 的习题时,几乎没有遇到什么问题。
只有到后续的习题中,我遇到了一些问题,主要是和 智能指针
有关的内容。这些部分我一直不是很理解的。但是因为我的经验,我还是能写出代码的。
总结
在第一阶段的学习中,我巩固了我所掌握的 rust 基础,我更是深深的意识到:Talk is cheap, show me the code!
。实践是最好的老师!
Rust rCore 二阶段学习总结
@FinishTime: 2024-10-15 18:44:32
二阶段学习时间表
- 2024-10-08 开始实验,轻车熟路,一天晚上完事了大部分的 ch3。
- 2024-10-09 凌晨 ch3 debug 完毕,下午进行提交完毕。
- 2024-10-09 晚上 ch4 提交完毕。
- 2024-10-11 ch5 提交完毕。
- 2024-10-13 ch6 提交完毕。
- 2024-10-15 ch8 提交完毕。撰写报告完毕。
问题复盘
通过上面的学习时间表可以看出,我虽然是第二次做大实验,但仍然每一部分都需要 1 到 2 天时间。虽然不是将大段时间全部投入,但可能也是比较慢了。
以下是我实验过程中的问题复盘。
ch3: 本地测例初始化问题
在 ch3 里,我遇到了两个问题,第一个是本地测例的初始化问题。
由于我是第二次参与训练营,所以在实验时,我就直接去看指导书的习题部分,在尝试开始实现时,在 rust-anaylzer 的使用上时发生了错误,插件因为找不到某些依赖库,拒绝提供服务。
我去查看了插件的报错信息,发现找不到 user
目录。而我在源代码仓库,也确实没看到源代码里有 user
目录。后续,我在自行尝试解决无果后,去微信群问了助教。得到的回答是 看文档
。然后我去重新看了文档,找到了一个下载 user
的方法。这个问题是由于我的粗心导致的。
ch3: 时间初始化问题
ch3 的第二个问题是,os 时间初始化问题。
在我实现的 os 里,在时间初始化,采用的是 直接在任务加载时便初始化为当前系统时间
。这显然是错误的。但它的报错并不友好。
此问题的表现为:在直接指定 BASE=1
执行测试用例时,能够通过测试用例。指定 BASE=0
时,也能够通过测试。但指定 BASE=2
时,竟然不能通过测试!?同时,这种情况下,qemu 会出现“卡死”,让人一直等下去。
我通过细细阅读报错,发现 qemu 卡死是因为有一个用户测例 panic 导致的。经过分析的测例执行逻辑为:
1 | 我分析,ch3里,qemu在跑测试用例的时候,qemu的退出机制是,当全部测试用例成功时,才会退出。 |
能够定位位置,之后的工作就要简单多了。我发现了问题所在,然后将时间改为 Option
类型,以 None
来初始化,在为某任务进行 sys_call 计数时进行判断,如果为 None
,则进行初始化。这样,问题就解决了。
后续,我看到交流群里有个同学,和我遇到了一样的问题,于是,我也帮助了他。
ch6: 又一次卡了一小点
在 ch6 时,平心而论,要求实现的逻辑并不是很复杂,只是需要层层的传递,最后由“easy-fs”进行实际干活即可。但我再次遇到了一个极为恶心的问题。
在春夏季训练营,我曾经遇到了“File is shorter than the first ELf header part”的问题,翻译过来就是,文件比文件描述符还短。我发现,只有 ch5_spawn0,也就是 helloworld 的测例出现了这个问题。
而这一次,我又遇到了这个问题。然后,我通过微信群的聊天记录,找到了当时一位热心同学给我的解答,即,此情况可能是由于 rust 的智能优化导致的,只需要把一个位置,由 [u8; 512]
改为一个 Vec 即可。
还好我留有聊天记录,再次感谢当时的那位同学!
ch8: 系统时间系统调用未实现
来到了 ch8,我没有看到指导书文档里,写着的 “除 sys_get_time 以外”,所以,我就没有合并我之前的代码。但问题是,在我实现了 ch8 的内容后,进行测例,有两个始终过不去,就是那两个死锁相关的。而且,它没有报错提醒。这使我很懵,是不是我的银行家算法写的有问题?
在一次又一次地尝试为银行家算法进行 debug 后,我发现,好像我的算法没问题啊。于是,我又一次详细阅读测试代码,发现:这里面有个sleep(500)
,这是调了哪个 sys_call?我查了,发现是获得系统时间的那个。但我没有合并之前的代码,导致其会进入死循环。由此,我才改好了问题。
总结
第二次来 rCore,感觉熟能生巧了一些,之前很多不太理解的部分,已经慢慢构不成威胁了。果然,实践能够带动理论!但我也因为自己的粗心,导致了一些不必要的麻烦。这是需要我进行反省的。
展望
这一次的三阶段,将会涉及到“组件化”。希望我能尽快完成相关内容,及早进入后续项目内容的学习!希望能够冲一冲优秀!