实验一总结
实验一比较简单,由于没有实现页表,内核地址空间可以直接访问用户态地址空间。所以直接返回即可。另外,获取时间最好使用精度较高的 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 的使用上面。另外,感觉教程的内容感觉讲的不是很清楚。就比如最后的死锁检测算法就看的云里雾里,如果不是群里某位大佬提及到像银行家算法,我都不会想到,所以还是希望能够把文档完善一下。