-
Notifications
You must be signed in to change notification settings - Fork 453
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'rcore-os:master' into master
- Loading branch information
Showing
175 changed files
with
9,525 additions
and
0 deletions.
There are no files selected for viewing
23 changes: 23 additions & 0 deletions
23
source/_posts/2024-autumn-stage1-stage2-summarize-ynchicy.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# 一阶段学习体会 | ||
|
||
早就听说过大名鼎鼎的 rustlings, 这次借着 oscamp 的机会来做一做。做的过程中发现 oscamp 的 rustlings 似乎比官方的 rustlings 加了很多私货,难度大了不少, | ||
但是也的确把编写 很多有用的 rust 特性 和 os 过程中会用得到的一些 rust 的 feature 都涵盖了。在做的过程中,也学习到了很多以前自己没有注意或者使用过的 rust 特性。 | ||
更重要的是,通过一些题目的学习,能摆脱原来写 c++ 的思维,写出一些更 rust 风格的代码,比如返回值多用 Option 和 Result,更多的使用 match 和 if let, 而不是用原来 c++/c 风格的错误判断, | ||
以及更多的用迭代器等方法。 | ||
|
||
一阶段学完之后,尤其是经历了大量和编译器的斗智斗勇之后,我对 rust 的理解加深很多,也对 rust 带来的相比 c++ 的很多优势有了更深的体会。相信 rust 和 c++ 的学习会互相促进。 | ||
|
||
# 二阶段学习体会 | ||
|
||
本科期间零零散散一致有学过 rust 和 rcore 的一些东西,由于各种各样的事情没能坚持下来。 | ||
读硕士之后刚好又系统学习了一下 rust ,正巧有同学来约我参加 oscamp , 于是就来参加。 | ||
|
||
如今再做 rcore 感觉要比本科期间轻松了很多。在游刃有余之后,能从 rcore 中汲取的知识也就更多了。 | ||
文件系统的组织方式、并发的实现和管理等,这些本科期间令我头晕转向的知识点,现在都能比较轻松地理解。也能从中窥探出一个真实生产环境下的操作系统是如何设计的。 | ||
|
||
本次实验中,前四个实验都比较轻松,思路清晰地拿下了。最让我头晕转向的是第五个实验,也就是死锁检测的实现。 | ||
刚开始被银行家算法迷惑,感觉很难实现。后来又做了尝试做了环路检测来检测死锁。但是做的过程中发现环路检测可能比较难处理信号量。于是又回过头来思考银行家算法。 | ||
结合前面尝试做环路检测的过程,觉得只要实现一套类似银行家算法的检测机制就好了。于是把代码全部推翻,从头来过很快就拿下了。 | ||
|
||
这一次 rcore 学习体验不错,希望接下来的三阶段能学到一些有意思、更贴近实际场景的东西。 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
|
||
--- | ||
title: 2024a-rcore-1,2阶段总结-路人甲 | ||
date: 2024-11-09 14:27:50 | ||
categories: | ||
- 2024秋冬季开源操作系统训练营 | ||
tags: | ||
- author: lurenjia1213 | ||
- repo: https://github.com/LearningOS/2024a-rcore-lurenjia1213 | ||
--- | ||
# 前言 | ||
我是来自于海南大学密码科学与技术专业的本科生,对于计算机体系结构方向很感兴趣,但由于学校条件所限,不能满足个人学习需求,所以来参加这个课程 | ||
|
||
在之前,我一直对一些东西比较好奇 | ||
|
||
比如 | ||
1. 盗版激活软件所说的模拟硬件激活 | ||
2. 计算机取证中,DMA技术如何用来解密BitLocker的,DMA外挂是如何实现的(当然,这个漏洞已经被修复),(我觉得,作为一个本科生,不应该只知道表面,而是更深入的了解,正所谓,知其然,知其所以然) | ||
3. 内核的内存管理 | ||
4. 并发 | ||
5. 动态链接的一些细节 | ||
|
||
等问题. | ||
|
||
|
||
所以, 我报名参加了这次的操作系统训练营. | ||
|
||
|
||
# 第一阶段 | ||
我C写的比较多,而且习惯确实不太好,所以在这阶段,也是磕磕绊绊,尤其是在所有权机制上,给了我“不灵活”的印象,我觉得也不算坏事吧,通过尽可能多的约束,把不安全的代码存在的范围尽可能缩小,方便发现问题和解决。 | ||
|
||
此外 rust的cargo非常好用。 | ||
|
||
还有,教程使用的rustlings有点旧?我用着是有点不太方便的,貌似没法很好的调试,我依赖于rustings run name这种方式来debug,但是每次都要写那么多,显然有点麻烦 | ||
|
||
我通过把如下内容加入 .bashrc,简化了这个操作 | ||
|
||
|
||
alias check='rustlings run' | ||
|
||
alias hint='rustlings hint' | ||
|
||
这样,就可以通过check name的方式检查题目了 | ||
|
||
|
||
# 第二阶段 | ||
## Lab 1 | ||
一个简单的多任务系统,我曾经参加过海南大学南海鲨战队的电控培训,看过ucosii的代码,所以这点对我来说还好 | ||
## Lab 2 | ||
这个实验启用了分页机制, 在这次实验之前,看过xv6 内存管理部分的代码,所以还好(这在之前,逆向程序时的内存地址,让我有不少困惑) | ||
## Lab 3 | ||
进程: 在这地方,我觉得问题不大 | ||
## Lab 4 | ||
文件系统: 这里问题挺多的,做的有点糊涂,不过不管怎么样,能用 | ||
## Lab 5 | ||
多线程: 了解了线程与并发的相关知识,还有银行家算法 | ||
|
||
# 总结 | ||
通过这门课程我学习到了很多操作系统的基础知识, 这个学期补补计算机组成原理,算法。rust也不熟练,不优雅,还得多练,下个学期二战。 | ||
|
||
我在此感谢此训练营的组织者和助教们,你们为很多人打开了一个新的天地。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
--- | ||
title: 2024 秋冬季开源操作系统训练营第一 & 二阶段总结 - 冰轩 | ||
date: 2024-11-10 16:19:54 | ||
tags: | ||
- author: BingXuanOwO | ||
- repo: https://github.com/LearningOS/2024a-rcore-BingXuanOwO | ||
--- | ||
|
||
## 前言 | ||
|
||
这次加入训练营的前因来自于两位朋友曾断断续续提到了 rCore,以及这个与 rCore 有关的 OS 训练营。 | ||
|
||
关于 Rust,我曾抱着将信将疑的态度。在社交媒体上关于此的风评给我的感受来讲,就好像万物皆可被该语言重写,这个语言能解决一切编程问题。而包括这种偏见在内等原因,我却没有对 Rust 有太多了解。 | ||
|
||
而至于 OS,我曾因观看过蒋炎岩的 OS 课程而对 OS 略知一二,但却一拖再拖,因各种原因没有完整的学完全部课程以及做完 labs。 | ||
|
||
我想,是时候改变这一切了。我最终报名加入了进来。 | ||
|
||
<--! more --> | ||
|
||
## PT1. 初次上手 Rust 与 Rustlings | ||
|
||
在报名之后,接下来的第一个任务便是完成 Rustlings 全部 110 道题目,以此形成对 Rust 初步的认识。Rust 的基础语法适应起来很快,但是最重要的还是适应 Rust 最核心的 borrow,所有权等一系列与 RAII 相关的设计。虽然碍于 Rustlings 篇幅受限,我没能完整掌握这方面,不过这部分知识还是在 rCore 的实验中补回来了的。 | ||
|
||
最终,我成功完成了全部的 rustlings 题目,并晋级至重要的下一阶段——rCore。 | ||
|
||
## PT2. rCore 之旅 | ||
|
||
接下来要完成的,便是相对而言更为重要的 rCore。一路上磕磕绊绊不少,但还是完成了挑战。 | ||
|
||
首先是 Lab1,Lab1 的任务主要是理清 rCore 原有的代码结构。我在刚看到 rCore 的框架代码的时候,老实讲的确会感觉无从下手。不过,在我花上一段时间了解原本的代码结构,理解调度部分的实现后,就没感觉问题很大了。这中间有个小插曲--由于我一开始看错了题目,我一开始以为 syscall_times 部分记录的是每次 syscall 调用时对应进程运行的时间,但是后来发现其实是每种 syscall 调用的次数。 | ||
|
||
接下来是 Lab2。因为 Lab2 的框架代码已经提前实现了多种用于内存管理的 struct,我最开始的想法是直接在内存的 PTE 上做文章。但我后续发现,在不对框架原有分配部分不做出大变动的情况下,这种想法似乎并不可行。我好像又有点手足无措,不过思考过后,我最终想到遍历 `MemorySet` 中全部 `MapArea` 区间计算并调整区间的方案,总算实现了 map 和 unmap 的 syscall。 | ||
|
||
Lab2 中重写 `sys_get_time` 和 `sys_task_info` 的部分就相对容易些,我实现的方案是按照对应函数所需返回值的大小,对于每个可能包含该变量的虚拟页,反查用户空间对应的物理页,并从内核 0x10000 虚拟页处开始分配虚拟页表然后 map 到对应的物理页。Lab2 原本这部分的实现实际上每次 map 后都不会 unmap 掉, 而是在接下来继续 map 的时候从上一次分配的末尾处 map。但在后面的 Lab 中,由于分配量超出预期,从而会导致其尝试 map 已经在别处分配了的 PTE。到问题发现之后,我添加了 unmap 部分,并使分配都从 0x10000 开始,以此解决了问题。 | ||
|
||
随后便是 Lab3,相对而言其实还算简单,stride 部分只需要参照题目描述实现。而至于 spawn 部分,可以参照已实现的 fork 与 exec 部分,这样照葫芦画瓢也同样能较为轻松的实现出来。 | ||
|
||
而接下来的 Lab4,由于项目结构又一次进行了变化,引入了一个新的 easy-fs 库,从而又感到了和刚进行 Lab1 时,没法理解代码结构时的头疼。而在进行 Lab4 的过程中,因为不知为何导致的死锁,我又一次头疼不已,甚至一度想放弃。好在最后因为 Rust RAII 的特性,通过封装一层函数的方式,将某个我并不知情的引用自动 drop 掉,才最终解决了问题。 | ||
|
||
最后,到了 Lab5,rCore 阶段要结束了。虽然这次我并没有选择将检测死锁的部分独立拆分为单独的 crate,但这部分仍然先在裸机上开发,完成后再移植进内核。由于是直接在裸机上开发,整体调试起来也会方便很多。不过话虽如此,在刚开始的时候,由于我开始进行 Lab5 的时间早于这次线程相关课程的上课时间,且题目没有详尽地描写检测死锁的算法,以及对算法的不熟悉,导致我在这里卡住了很久没有进展。不过最后,我确定了题目给出的算法为 Dijkstra 的银行家算法,在不断的了解这个算法后,最终完成了 Lab5。 | ||
|
||
_至此,一锤定音。_ | ||
|
||
_尘埃,已然落定。_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--- | ||
title: 2024-秋冬季开源操作系统训练营第一二阶段总结-wang.md | ||
date: 2024-11-10 11:14:20 | ||
tags: | ||
--- | ||
|
||
|
||
## 第一阶段总结 | ||
|
||
因为之前已经在学校里学习过Rust的内容,第一阶段更像是起到一个查缺补漏和复习的作用。通过完成Rustlings的100道练习题,对Rust生命周期、所有权机制、智能指针、移动语义等内容有了更深入的理解。 | ||
|
||
|
||
## 第二阶段总结 | ||
- lab3: 实现syscall: sys_get_time(), sys_task_info() | ||
- lab4: 引入虚拟内存/分页机制,重新实现sys_get_time()和sys_task_info(), 实现mmap和munmap | ||
- lab5: 将task抽象为process进程,实现sys_spawn()和stride调度算法 | ||
- lab6: 新增文件系统,可以将原来在内存中的数据持久化到硬盘上。 实现sys_linkat(), sys_unlinkat(), sys_stat() | ||
- lab8: 引入thread。实现死锁检测,实现sys_enable_deadlock_detect() | ||
通过完成5个操作系统的实验,对操作系统的基本原理有了更深入的理解。在实验过程中,我遇到了很多问题,比如在实验四中,我在实现文件系统时,由于对文件系统Inode/OSInode/DiskInode/File之间的关系和概念理解不够透彻,一开始写lab的时候确实是完全不知道该怎么做,也导致了一些错误。于是我认真阅读了实验手册,通过画图和总结,最终完成了lab。 | ||
lab1-3个人认为是相对简单的,几乎每一个的pattern都是先去某个struct添加一个新的field,然后在impl中对这个新的field进行一些需要的操作。这其中还可能涉及用户态与内核态之间的数据传递,比如在lab1中的sys_task_info()函数就涉及到内核态数据到用户态数据之间的传递。 | ||
总之,通过这次训练营,我对操作系统的原理有了更深入的理解,也对Rust的应用有了更多的实践经验。 |
Oops, something went wrong.