-
Notifications
You must be signed in to change notification settings - Fork 387
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #145 from XIANYUGUAI/blog
2023秋季开源操作系统训练营报告-xianyuguai
- Loading branch information
Showing
1 changed file
with
94 additions
and
0 deletions.
There are no files selected for viewing
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,94 @@ | ||
--- | ||
title: rcore-2023-autumn-summary-xianyuguai | ||
date: 2023-11-3 19:40:28 | ||
tags: | ||
- author: xianyuguai | ||
--- | ||
|
||
# rcore秋季训练营总结 | ||
|
||
## 原因 | ||
之前有听说过rcore,然后在发现群友发了这次的活动, | ||
刚好又因为现在是无业,就想着说报个名写写看,然后就报名 | ||
了 | ||
|
||
## 实验 | ||
rcore的实验内容主要是5个Lab,是二阶段的主要任务 | ||
|
||
大概就是这样,下面就是一些个人的碎碎念 | ||
<!-- more --> | ||
## Lab1 | ||
Lab1的内容是对``task_info``这个syscall的支持,将部分系统 | ||
信息返回给用户,像是用来是给人来熟悉一下rcore用的 | ||
|
||
## Lab2 | ||
Lab2的话,我认为主要是在引入了pagetable机制后对之前的lab的兼 | ||
容,由于kernel用的pagetable和用户使用的pagetable不是相同的,所 | ||
以需要将user对应的pagetable下的virtual address转换成对应的 | ||
physical address,然后再将内核中得到的数据复制到对应的地址下 | ||
|
||
新增的对mmap与munmap的支持本身来说难度不是很大,主要也是将 | ||
用户传入的地址map到一段分配好的地址上,或者是将传入的地址从 | ||
对应的pagetable中unmap掉 | ||
|
||
Lab2这里踩了个小坑,由于需要将physical address转换成slice来将 | ||
对应的内容复制到user virtual address对应的位置,在这个地方, | ||
rcore提供的的api返回的并不是需要的长度的slice,而是截止到当前 | ||
physical address对应的page的结尾,在复制的时候会出现问题 | ||
|
||
## Lab3 | ||
主要是在引入process概念后,需要知道如何创建一个process,spawn的 | ||
实现由于已经有现成的api,实现起来还是比较简单的,只需要读入需要 | ||
执行的文件的内容,再创建一个对应的``task_control_block``,并设置好 | ||
他的parent process,然后在他的parent process中加入这个新生成的 | ||
process,使资源能够得到回收就好了 | ||
|
||
接着就是实现对优先级的进程调度的支持,这个也比较简单,在tcb内部新增 | ||
一个stride和priority用来记录当前进程的使用情况,在调度算法挑选下一个 | ||
执行的进程时,选出stride最小的进程来执行即可 | ||
|
||
## Lab4 | ||
lab4的实验内容是实现file system对``sys_link`` ``sys_unlink``还有 | ||
``fstat``的支持,由于rcore已经提供了查找需要的inode的api,在实现这 | ||
三个syscall时,还是比较方便的,主要是需要在diskinode中新 | ||
增一个``nlink``用来表示有多少个文件链接在这个diskinode上,同时还 | ||
需要新增一个``inode_num``用来在实现fstat时更方便的得到inode的编号 | ||
|
||
在写Lab4的时候,由于需要对先前lab内容的兼容,我在 | ||
迁移spawn时遇到了问题,会遇到fs读不出需要的内容,长度 | ||
是0的问题最后的解决方法是在task control block这个结构内 | ||
部新增了一个与原本一样的方法,返回一个指向他的指针,虽然 | ||
还是不知道是什么原理,但是还是解决了 | ||
|
||
|
||
## Lab5 | ||
Lab5的主要内容是根据提供的算法来实现死锁检测,主要就是寻找一个 | ||
需求低于现有资源并且还没有结束的process来分配,并假定这 | ||
个process能够执行到结束,释放现在分配给他的资源,在剩下的 | ||
那一部分中继续寻找下一个符合要求的process,直到找不到 | ||
一个还没有结束的process,如果能够找到一个所有process都能过 | ||
完成的顺序,就说明不会出现死锁 | ||
|
||
Lab5这里有个小坑,由于阅读文档时发现这次的Lab不需要对先前lab的支持, | ||
在实现完提供的死锁检测的算法后,如果直接进行测试,会发现测试在进行 | ||
到一半时会卡住,出现乍一看会被认为是死锁的状态,但实际上是由于 | ||
测试用例中使用的``sleep``在``userlib``中使用了一个还没有实现的``get time``来 | ||
进行对时间的判断,但由于没有实现``get time``,在实际使用时,测试用例 | ||
会认为时间还没有到,为了不对资源进行浪费,将当前cpu的所有权移交给其他 | ||
进程 | ||
|
||
## 感受与建议 | ||
|
||
其实lab4和lab5本来想摸几天鱼再写,后面想了一下,写都写了,干脆先写完,要不 | ||
摸鱼摸着摸着就忘了(很合理吧),不懂md语法,写出来的效果看着好怪 | ||
|
||
个人感觉几个实验部分的测试有点弱,比如lab3的测试是并没有对调度算法的优先级 | ||
的正确性进行测试,只是测试调度算法是否能够将几个进程运行到结束 | ||
希望能加入一个faq部分,把大家踩过的坑一起放进去,在其他人遇到这些问题时,不会被 | ||
卡太久 | ||
|
||
虽然踩到了一些小坑,个人认为rcore是个很好的教学用操作系统,也不会用到 | ||
太多比较复杂的机制,对学习操作系统概念来说是一个很好的项目,尽管国内外对于计算机 | ||
的教学质量有差距,但在这里能看到很多人为了提升国内教学质量所付出的努力 | ||
感谢清华大学的老师和助教们还有本次活动的组织者,为提升教学质量所做出的贡献,希望 | ||
能够在以后看到更多类似的课程与项目 |