Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: 将报告从个人仓库同步过来 #624

Merged
merged 1 commit into from
Nov 18, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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:[email protected]
---

# 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,感觉熟能生巧了一些,之前很多不太理解的部分,已经慢慢构不成威胁了。果然,实践能够带动理论!但我也因为自己的粗心,导致了一些不必要的麻烦。这是需要我进行反省的。

## 展望

这一次的三阶段,将会涉及到“组件化”。希望我能尽快完成相关内容,及早进入后续项目内容的学习!希望能够冲一冲优秀!
Loading