diff --git "a/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\200\344\272\214\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\347\216\213\347\277\212\345\230\211.md" "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\200\344\272\214\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\347\216\213\347\277\212\345\230\211.md" new file mode 100644 index 0000000000..14b59c0e33 --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\200\344\272\214\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\347\216\213\347\277\212\345\230\211.md" @@ -0,0 +1,106 @@ +--- +title: abcd1234-rust-os +date: 2024-10-15 18:32:19 +categories: + - rust-stage-1 +tags: + - author:17999824wyj + - repo:https://github.com/LearningOS/2024a-rcore-17999824wyj + - noob + - nickname:abcd1234 + - email:abcd1234dbren@yeah.net +--- + +# Rust OS 一阶段学习总结 + +@FinishTime: 2024-09-19 00:35:51 + +## 个人背景概述 + +我是一名软件工程专业的大三本科生,曾参与过 2023 年秋冬季训练营和 2024 年春夏季训练营。并且在 2024 季春夏训练营中,取得了通过的成绩。 +今年的秋冬季训练营,我想冲一冲优秀,多做一些项目,多为国内操作系统和开源做出贡献。 + +## 今年一阶段学习时间表 + +- 2024-09-18 大约 3.5 小时,重新完成 rustlings 的官方基础习题(前 94 题)。之后,又用了大约 2 小时,完成了后续的习题(95-110)。 + +## 一阶段学习内容概述 + +我按照[“rust 语言圣经”](https://course.rs/about-book.html)上的讲解顺序,复习之前的知识点。 +由于我在那段时间之前,在参加 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 导致的。经过分析的测例执行逻辑为: + +```plaintext +我分析,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,感觉熟能生巧了一些,之前很多不太理解的部分,已经慢慢构不成威胁了。果然,实践能够带动理论!但我也因为自己的粗心,导致了一些不必要的麻烦。这是需要我进行反省的。 + +## 展望 + +这一次的三阶段,将会涉及到“组件化”。希望我能尽快完成相关内容,及早进入后续项目内容的学习!希望能够冲一冲优秀!