diff --git a/source/_posts/rcore-2023-autumn-summary-xianyuguai.md b/source/_posts/rcore-2023-autumn-summary-xianyuguai.md new file mode 100644 index 00000000000..130e20ab42c --- /dev/null +++ b/source/_posts/rcore-2023-autumn-summary-xianyuguai.md @@ -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,是二阶段的主要任务 + +大概就是这样,下面就是一些个人的碎碎念 + +## 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是个很好的教学用操作系统,也不会用到 +太多比较复杂的机制,对学习操作系统概念来说是一个很好的项目,尽管国内外对于计算机 +的教学质量有差距,但在这里能看到很多人为了提升国内教学质量所付出的努力 +感谢清华大学的老师和助教们还有本次活动的组织者,为提升教学质量所做出的贡献,希望 +能够在以后看到更多类似的课程与项目