Skip to content

Commit

Permalink
Merge pull request #145 from XIANYUGUAI/blog
Browse files Browse the repository at this point in the history
2023秋季开源操作系统训练营报告-xianyuguai
  • Loading branch information
limingth authored Nov 4, 2023
2 parents b3990c9 + fa9de8d commit 525fee4
Showing 1 changed file with 94 additions and 0 deletions.
94 changes: 94 additions & 0 deletions source/_posts/rcore-2023-autumn-summary-xianyuguai.md
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是个很好的教学用操作系统,也不会用到
太多比较复杂的机制,对学习操作系统概念来说是一个很好的项目,尽管国内外对于计算机
的教学质量有差距,但在这里能看到很多人为了提升国内教学质量所付出的努力
感谢清华大学的老师和助教们还有本次活动的组织者,为提升教学质量所做出的贡献,希望
能够在以后看到更多类似的课程与项目

0 comments on commit 525fee4

Please sign in to comment.