-
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 #121 from PeizhongQiu/master
qiupeizhong blog
- Loading branch information
Showing
1 changed file
with
34 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,34 @@ | ||
--- | ||
title: rcore2023A-PeizhongQiu | ||
date: 2023-11-02 11:33:27 | ||
tags: | ||
--- | ||
|
||
##实验一总结 | ||
<!-- more --> | ||
实验一比较简单,由于没有实现页表,内核地址空间可以直接访问用户态地址空间。所以直接返回即可。另外,获取时间最好使用精度较高的 get_time_us,不然在后续的实验中会由于精度的问题过不了某些测试。获取系统调用次数可以直接在 syscall 函数调用时更新。获取第一次调用时间的话就要修改 run_first_task 和 run_next_task 即可。 | ||
|
||
## 实验二总结 | ||
跟实验一不同的是,这次由于实现了页表,所以之前设计的系统调用都需要重写。内核需要找到传递进来的参数的实际物理地址,然后向该地址读写数据。 | ||
|
||
另外,此次实验还需要设计两个新的系统调用:mmap 和 munmap。由于两者是一段连续的地址,所以要判断该连续的地址是否全部未映射或已映射。最后,mmap 和 munmap 要分别插入和删除页面。 | ||
|
||
## 实验三总结 | ||
首先,需要把之前的实验代码写入这次的实验中。如果之前的代码存在问题,这次的代码一般就不会通过。 | ||
|
||
这次的实验是要实现 spawn 和 stride 算法。spawn 不是简单的 fork + exec。实现之前,需要理解 spawn 的语义。然后可以在 fork + exec 的代码中拷贝部分代码将 TCB 数据结构设置为需要的状态。 | ||
|
||
stride 算法是一个进程调度的算法,由于设置的例子比较简单,所以实现也比较简单。根据网页教程的步骤做即可。 | ||
|
||
## 实验四总结 | ||
个人感觉实验四相较之前可能比较难一点。首先就是要兼容之前的代码。一开始的时候spawn 兼容的有问题,导致一直报错。后面把 spawn 重新实现了一下才通过。 | ||
|
||
然后是可能会产生死锁的问题。由于在部分的代码实现中,如find,create 都对 fs 上了锁,所以不能直接使用两者的函数。但是可以把他们的实现拷贝出来,拼凑一下。 | ||
|
||
最后是 unlink 删除目录项的操作,找到目标后,需要更新目录项。这里采用了群里一些人的办法。就直接将原来的删除,然后将原来的内容拷贝过去即可。 | ||
|
||
## 实验五总结 | ||
实验五是实现一个死锁检测算法。这个算法类似于银行家算法。但是教程里的描述其实并不是很清楚,很多细节都没有。所以要仔细想清楚其中的细节。sem 和 mutex 的实现基本一致。另外,sys_get_time必须要实现,不然某些实例会产生死锁。 | ||
|
||
## 总结 | ||
这些实验的内容其实都不是很难,里面涉及到的概念还是比较基础的。但是第一次接触 rust,用 rust 写操作系统对于我来说还是一件很新奇的事情,这次实验的难度主要还是在 rust 的使用上面。另外,感觉教程的内容感觉讲的不是很清楚。就比如最后的死锁检测算法就看的云里雾里,如果不是群里某位大佬提及到像银行家算法,我都不会想到,所以还是希望能够把文档完善一下。 |