Skip to content

Commit

Permalink
qiupeizhong blog
Browse files Browse the repository at this point in the history
  • Loading branch information
PeizhongQiu committed Nov 2, 2023
1 parent 243fdc2 commit 514a281
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions source/_posts/rcore2023A-PeizhongQiu.md
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 的使用上面。另外,感觉教程的内容感觉讲的不是很清楚。就比如最后的死锁检测算法就看的云里雾里,如果不是群里某位大佬提及到像银行家算法,我都不会想到,所以还是希望能够把文档完善一下。

0 comments on commit 514a281

Please sign in to comment.