感谢老师和助教们贡献了这么好的课程,可以看到付出的努力和心血,所以我也非常重视这一次的训练营。通过这次的训练营,不仅让我在短时间内快速学习使用了Rust,并乘热打铁学习实践了我一直想掌握的OS知识。在阅读文档的时候详略有当,也给出了很多扩展性的知识和难题,不过个人水平太菜并没有深入。只经过短短两周多的学习,已经基本能在脑海中对操作系统有一个较为清晰的概念了。
lab1
要求我们实现一个sys_task_info的系统调用,用于获取进程的信息。这个系统调用,我分为两步来完成:第一步,能够返回task运行总时间,即第一次执行时间到当前时间的时间差,单位为ms,要实现这个功能,我在TaskControlBlock结构体中添加了我需要的开始时间戳,然后在第一次run该task的时候,记录开始时间戳,然后在sys_task_info中,通过current_task,找到对应的TaskControlBlock,然后计算时间差,返回即可。第二步,能够统计task的sys_call的调用次数,同上,我在TaskControlBlock结构体中添加了我需要的sys_call调用次数,然后在每次调用sys_call的时候,增加该系统调用的调用次数即trap_handler中抓取到系统调用的中断处理时处理即可,然后在sys_task_info中,通过current_task,找到对应的TaskControlBlock,然后返回即可。
lab2
要求重写sys_get_time 和 sys_task_info两个系统调用,由于引入虚存机制后,要想将数据写入任务地址空间,就需要根据任务的pagetable手动映射到实际物理地址,然后再写入,然后考虑到数据可能被被两个物理页分隔,所以需要特殊处理是否缺页的情况,特别需要注意的点是get_time最好统一使用us。 要求实现mmap 和munmap在内存中映射文件,实现过程是先获取该任务的memery_set,然后我这里的实现比较傻,是每个area存一个page,然后通过调用memery_set提供的函数,来实现,值得注意的几个点就是_port与MapPermission不同,并且需要增加MapPermission::U。
lab3
要求在新增进程功能下,不仅让代码能通过之前的测试,还要新实现sys_spawn,以及进程调度算法,我在让代码能通过之前的测试时,对之前的功能改进了一下结构,由于对于Arc的理解加深了,所以很多代码看着就明白了很多。要实现sys_spawn,就是参考fork以及exec的实现步骤,实现一个spawn,然后在sys_spawn中,调用spawn。然后实现stride调度算法,我在TaskControlBlockInner中添加了stride以及pass字段,并在config中设置BIG_STRIDE为1<<20, 然后在调度算法中,就是找到pass最小的task,然后fetch,然后更新pass,然后返回即可。