Skip to content

Commit 511610a

Browse files
authored
Merge branch 'rcore-os:master' into master
2 parents e9b1a1a + d678ab9 commit 511610a

File tree

98 files changed

+4866
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+4866
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
title: 2024 秋冬季开源操作系统训练营第一 & 二阶段总结 - 冰轩
3+
date: 2024-11-10 16:19:54
4+
tags:
5+
- author: BingXuanOwO
6+
- repo: https://github.com/LearningOS/2024a-rcore-BingXuanOwO
7+
---
8+
9+
## 前言
10+
11+
这次加入训练营的前因来自于两位朋友曾断断续续提到了 rCore,以及这个与 rCore 有关的 OS 训练营。
12+
13+
关于 Rust,我曾抱着将信将疑的态度。在社交媒体上关于此的风评给我的感受来讲,就好像万物皆可被该语言重写,这个语言能解决一切编程问题。而包括这种偏见在内等原因,我却没有对 Rust 有太多了解。
14+
15+
而至于 OS,我曾因观看过蒋炎岩的 OS 课程而对 OS 略知一二,但却一拖再拖,因各种原因没有完整的学完全部课程以及做完 labs。
16+
17+
我想,是时候改变这一切了。我最终报名加入了进来。
18+
19+
<--! more -->
20+
21+
## PT1. 初次上手 Rust 与 Rustlings
22+
23+
在报名之后,接下来的第一个任务便是完成 Rustlings 全部 110 道题目,以此形成对 Rust 初步的认识。Rust 的基础语法适应起来很快,但是最重要的还是适应 Rust 最核心的 borrow,所有权等一系列与 RAII 相关的设计。虽然碍于 Rustlings 篇幅受限,我没能完整掌握这方面,不过这部分知识还是在 rCore 的实验中补回来了的。
24+
25+
最终,我成功完成了全部的 rustlings 题目,并晋级至重要的下一阶段——rCore。
26+
27+
## PT2. rCore 之旅
28+
29+
接下来要完成的,便是相对而言更为重要的 rCore。一路上磕磕绊绊不少,但还是完成了挑战。
30+
31+
首先是 Lab1,Lab1 的任务主要是理清 rCore 原有的代码结构。我在刚看到 rCore 的框架代码的时候,老实讲的确会感觉无从下手。不过,在我花上一段时间了解原本的代码结构,理解调度部分的实现后,就没感觉问题很大了。这中间有个小插曲--由于我一开始看错了题目,我一开始以为 syscall_times 部分记录的是每次 syscall 调用时对应进程运行的时间,但是后来发现其实是每种 syscall 调用的次数。
32+
33+
接下来是 Lab2。因为 Lab2 的框架代码已经提前实现了多种用于内存管理的 struct,我最开始的想法是直接在内存的 PTE 上做文章。但我后续发现,在不对框架原有分配部分不做出大变动的情况下,这种想法似乎并不可行。我好像又有点手足无措,不过思考过后,我最终想到遍历 `MemorySet` 中全部 `MapArea` 区间计算并调整区间的方案,总算实现了 map 和 unmap 的 syscall。
34+
35+
Lab2 中重写 `sys_get_time``sys_task_info` 的部分就相对容易些,我实现的方案是按照对应函数所需返回值的大小,对于每个可能包含该变量的虚拟页,反查用户空间对应的物理页,并从内核 0x10000 虚拟页处开始分配虚拟页表然后 map 到对应的物理页。Lab2 原本这部分的实现实际上每次 map 后都不会 unmap 掉, 而是在接下来继续 map 的时候从上一次分配的末尾处 map。但在后面的 Lab 中,由于分配量超出预期,从而会导致其尝试 map 已经在别处分配了的 PTE。到问题发现之后,我添加了 unmap 部分,并使分配都从 0x10000 开始,以此解决了问题。
36+
37+
随后便是 Lab3,相对而言其实还算简单,stride 部分只需要参照题目描述实现。而至于 spawn 部分,可以参照已实现的 fork 与 exec 部分,这样照葫芦画瓢也同样能较为轻松的实现出来。
38+
39+
而接下来的 Lab4,由于项目结构又一次进行了变化,引入了一个新的 easy-fs 库,从而又感到了和刚进行 Lab1 时,没法理解代码结构时的头疼。而在进行 Lab4 的过程中,因为不知为何导致的死锁,我又一次头疼不已,甚至一度想放弃。好在最后因为 Rust RAII 的特性,通过封装一层函数的方式,将某个我并不知情的引用自动 drop 掉,才最终解决了问题。
40+
41+
最后,到了 Lab5,rCore 阶段要结束了。虽然这次我并没有选择将检测死锁的部分独立拆分为单独的 crate,但这部分仍然先在裸机上开发,完成后再移植进内核。由于是直接在裸机上开发,整体调试起来也会方便很多。不过话虽如此,在刚开始的时候,由于我开始进行 Lab5 的时间早于这次线程相关课程的上课时间,且题目没有详尽地描写检测死锁的算法,以及对算法的不熟悉,导致我在这里卡住了很久没有进展。不过最后,我确定了题目给出的算法为 Dijkstra 的银行家算法,在不断的了解这个算法后,最终完成了 Lab5。
42+
43+
_至此,一锤定音。_
44+
45+
_尘埃,已然落定。_
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
title: 2024-秋冬季开源操作系统训练营第一二阶段总结-wang.md
3+
date: 2024-11-10 11:14:20
4+
tags:
5+
---
6+
7+
8+
## 第一阶段总结
9+
10+
因为之前已经在学校里学习过Rust的内容,第一阶段更像是起到一个查缺补漏和复习的作用。通过完成Rustlings的100道练习题,对Rust生命周期、所有权机制、智能指针、移动语义等内容有了更深入的理解。
11+
12+
13+
## 第二阶段总结
14+
- lab3: 实现syscall: sys_get_time(), sys_task_info()
15+
- lab4: 引入虚拟内存/分页机制,重新实现sys_get_time()和sys_task_info(), 实现mmap和munmap
16+
- lab5: 将task抽象为process进程,实现sys_spawn()和stride调度算法
17+
- lab6: 新增文件系统,可以将原来在内存中的数据持久化到硬盘上。 实现sys_linkat(), sys_unlinkat(), sys_stat()
18+
- lab8: 引入thread。实现死锁检测,实现sys_enable_deadlock_detect()
19+
通过完成5个操作系统的实验,对操作系统的基本原理有了更深入的理解。在实验过程中,我遇到了很多问题,比如在实验四中,我在实现文件系统时,由于对文件系统Inode/OSInode/DiskInode/File之间的关系和概念理解不够透彻,一开始写lab的时候确实是完全不知道该怎么做,也导致了一些错误。于是我认真阅读了实验手册,通过画图和总结,最终完成了lab。
20+
lab1-3个人认为是相对简单的,几乎每一个的pattern都是先去某个struct添加一个新的field,然后在impl中对这个新的field进行一些需要的操作。这其中还可能涉及用户态与内核态之间的数据传递,比如在lab1中的sys_task_info()函数就涉及到内核态数据到用户态数据之间的传递。
21+
总之,通过这次训练营,我对操作系统的原理有了更深入的理解,也对Rust的应用有了更多的实践经验。
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
title: 2024 秋冬季开源操作系统训练营第一阶段总结-DFP-HN
3+
date: 2024-11-10 14:01:09
4+
tags:
5+
- author: DFP-HN
6+
- repo: https://github.com/LearningOS/rust-rustlings-2024-autumn-DFP-HN
7+
---
8+
# 第一阶段总结
9+
第一阶段训练营通过写一些rust的基本语句,快速入门rust,掌握了rust的基本语法。第一阶段的题目设置非常合理,对于rust零基础的也能快速入门,只需要一步一步按照文档上的学习就能轻松完成题目。
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
title: 2024 秋冬季开源操作系统训练营第二阶段总结-DFP-HN
3+
date: 2024-11-10 13:57:28
4+
tags:
5+
- author: DFP-HN
6+
- repo: https://github.com/LearningOS/2024a-rcore-DFP-HN
7+
---
8+
# 第二阶段总结
9+
第二阶段的题目略有难度,我在这个阶段有了很大的收获。第三章的练习是获取当前任务的信息,通过这个练习,大致清楚了进程在操作系统中的运行流程以及组成结构,系统调用的实现和中断的实现。第四章的练习考察对页表的理解,在完成的过程中加深了我对虚拟地址和物理地址的理解。第五章的练习是实现一个子进程的创建,fork+exec也能生成一个子进程,但这个子进程的资源和空间与父进程完全一致,然而练习的要求需要子进程有独立的数据,如果采用fork+exec将浪费很多时间去重新加载数据。第六章的练习是关于文件系统,创建硬链接和取消硬链接,这一章节对我来说有点挑战,因为之前学操作系统对于文件系统这一块就没太搞懂,认真看了几个晚上的代码后才搞懂文件系统的结构,收获非常大。第八章练习比前面的轻松一些,只要搞清楚了代码中各个结构之间的关系,就能轻松解决。
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: 2024_第二阶段总结_ghost
3+
date: 2024-11-10 20:14:22
4+
tags:
5+
- author:<ghostdragonzero>
6+
- repo:<https://github.com/LearningOS/2024a-rcore-ghostdragonzero>
7+
---
8+
9+
# 一、前言
10+
11+
毕业之后一直工作都是在做c嵌入式驱动开发,是和同事闲聊的时候了解这个项目的就开始学下去了 从2024春季就已经开始学了但是因为一些事情耽误了就没有完成
12+
对我个人来说主要是好奇想看看经常看到的所谓写操作系统是做什么,以及我在工作中也会看到rust的一些内容对这个语言也很好奇
13+
# 二、基础阶段
14+
15+
![错误记录](1-1.png)
16+
17+
在基础学习的时候我认为这样的错误记录是很有必要的
18+
因为我基础并不好经常对于书上看到的方法看到就忘了 实际写起来我最大的感受就是
19+
1、如果有多个数据结构嵌套我很容易就搞不清哪里要复制哪里不复制
20+
2、闭包按照我理解就是一个函数指针 在传递闭包的时候一开始没理解总是搞不清楚到底是怎么回事
21+
22+
**以及在完成一阶段之后我才安装了rust-analyer也算是踩坑了把 有这个插件才发现可以很快就发现错误不用在一次次编译**
23+
24+
# 三、OS专业阶段
25+
26+
专业阶段在整个学习的过程中对我而言最困难的是第四章和第八章
27+
在第四章 我觉得内存的边界条件卡住了很久 主要还是理解不够 明白了 地址空间 应用空间 需要转换
28+
也看明白了虚拟地址的寻址方法 但是真的感觉新的文档没有图我一开始没理解的就是 他三级页表怎么寻址的过程
29+
后面才真的理解上一级页表的值代表的是下一级要去找的page 再再下一级page上找到对应页表项 才实现了多级页表的寻址
30+
![三级页表](3-1.png)
31+
32+
整体来说我觉得这个专业阶段 首先文档需要图
33+
并且我发现只看一遍效果很差 需要边看边记 并且对于代码讲解最好是能够记录并且依次添加注释 明白每一步再做什么不是只看文档中的讲解就过一遍就结束
34+
![结构体关系](3-2.jpg)
35+
以及我觉得再实验过程中最重要的是搞清楚各个结构体所代表的实际意义
36+
并且可以集中在图上展示 不然我在做ch6一开始总是错就是 没梳理清楚 disk_inode inode OS_inode还有目录项分别都是些什么 导致ch6经常找错
37+
于是我就在草稿纸上根据理解写了我对于这些数据结构的理解和关联很快就解决了
38+
39+
实验的时候还有一点 有时候我总喜欢通过结构体之间的关系来找对应的数据 但是在rust里这样做我觉的很复杂
40+
最好的方式就是在容易得到的结构体中保存需要的数据
Loading
Loading
Loading

source/_posts/2024A-OS-I-Summary.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
---
2+
title: 2024A-OS-I-Summary
3+
date: 2024-11-10 12:34:18
4+
tags:
5+
- author:Whth
6+
- repo:https://github.com/LearningOS/rust-rustlings-2024-autumn-Whth
7+
- RustBasics
8+
---
9+
10+
11+
12+
13+
14+
# 引言
15+
16+
----
17+
18+
9月的时候在`Rust语言中文社区`的微信公众号了解到了这个训练营,
19+
当时想想正好可以获取一些操作系统的设计与实践的经验和感受感受`Rust`编程的实际运用,所以就报名了.
20+
21+
22+
# 第一阶段概述
23+
24+
25+
---
26+
## 个人情况
27+
28+
- 非科班
29+
- 大四备战考研ing
30+
- 有过一些`C++``Python`的编程基础
31+
- 系统学习过linux的架构和原理
32+
- 了解过`Rust`的编程范式和语言特性(不过没怎么实际用过,只是简单的配过环境搓过些小玩意儿)
33+
34+
35+
36+
37+
## Rustling
38+
39+
说是100道题,不过实际上是80道题.
40+
其中70道语言特性和语法相关的基础题目,而剩下的10道题都是算法相关的.
41+
42+
因为`Rustling`没啥平台依赖所有就直接在win本把仓库克隆下来然后`cargo install&&rustling watch`开干
43+
44+
语法基础题花了一个下午给整完,中途卡了两天然后又花了两天把剩下的这10道题也做了.不过有一说一最后几个算法题确实有那么点上强度的感觉了Xb
45+
46+
![img.png](2024A-OS-I-Summary/img.png)
47+
48+
![img_1.png](2024A-OS-I-Summary/img_1.png)
49+
50+
51+
52+
## 总结
53+
54+
55+
56+
唉唉,给我的感觉两类题目的难度曲线会稍微有点陡峭了,简单和困难的过渡不太平缓,中途如果没有`Jetbrain RustRover`的built-in linter(好用,推荐😋)可能还得多花些时间
57+
![img_2.png](2024A-OS-I-Summary/img_2.png)
58+
59+
个人感觉最难的几个部分有生命周期,借用和作用域
60+
61+
1. **生命周期(Lifetimes)**:确保引用在其所指向的数据有效期内始终有效,防止悬空指针。虽说如此,但是实际上没有了`'a`和IDE的检查马上就歇菜了Xb.
62+
2. **借用(Borrowing)**:允许临时使用数据而不转移所有权,提高代码的灵活性和安全性。这个借用和cpp的借用机制类似,不过在rust中 borrowing 的时候会自动释放,不用像cpp那样手动释放,挺好.
63+
3. **作用域(Scopes)**:定义变量和引用的可见性和生命周期,确保资源在不再需要时被及时释放。最后我的理解感觉实际上也就是`{}`的范围.
64+
65+
不过难归难,实际上rust里面挺多编程范式确实体验蛮不错的,我挺喜欢模式匹配,建造者模式,鼓励链式调用(手动点赞).
66+
67+
最后在榜上捞了个Rank 39.
68+
69+
![img_3.png](2024A-OS-I-Summary/img_3.png)
70+
71+
72+
# 推荐阅读
73+
74+
75+
76+
1. [Rust官方文档](https://doc.rust-lang.org/book/title-page.html) - Rust的官方文档是最权威的学习资源之一,提供了详尽的语言特性和标准库介绍,适合所有级别的学习者。
77+
78+
2. [Rust精选](https://rustcc.cn/) - 提供了一系列聚焦于学习Rust的网络资源,包括但不限于使用Rust处理信号的文章,这些资源对于希望深入了解特定主题的学习者非常有帮助。
79+
80+
3. [《Rust 程序设计》](https://kaisery.github.io/trpl-zh-cn/) - 一本全面介绍Rust编程的书籍,适合希望系统学习Rust的新手。
81+
82+
4. [《Rust 权威指南》](https://rust-book.cs.dbappsecurity.com/) - 这本书深入讲解了Rust的核心概念和高级特性,适合已经有一定Rust基础的学习者。
83+
84+
5. [《Rust 实战》](https://rust-lang-nursery.github.io/rust-cookbook/intro.html) - 通过实战项目帮助读者掌握Rust编程的实际应用,适合希望通过实践加深理解的学习者。
85+
86+
6. [《深入理解 rust 并发编程》](https://rust-lang-nursery.github.io/rust-cookbook/concurrency.html) - 针对Rust的并发编程特性进行了详细的讲解,适合对并发编程感兴趣的开发者。
87+
88+
7. [《Command-Line Rust》](https://rust-cli.github.io/book/) - 专注于使用Rust开发命令行应用程序,适合对此类应用感兴趣的学习者。
89+
90+
8. [《Rust Atomics and Locks》](https://docs.rs/crossbeam/latest/crossbeam/atomic/index.html) - 深入讲解了Rust中的原子操作和锁机制,适合希望深入了解并发控制的学习者。
91+
92+
9. [《System Programing with Rust》](https://azerupi.github.io/mdBook/rust-system-programming/) - 介绍了如何使用Rust进行系统级编程,适合希望探索这一领域的开发者。
93+
94+
10. [《Rust 编程之道》](https://rustwiki.org/zh-CN/rust-by-example/) - 通过具体的例子和最佳实践,帮助读者更好地掌握Rust编程。
95+
96+
97+
98+
99+
100+
113 KB
Loading
121 KB
Loading
194 KB
Loading
16.4 KB
Loading

0 commit comments

Comments
 (0)