-
Notifications
You must be signed in to change notification settings - Fork 453
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 #95 from YXalix/master
提交:2023开源操作系统训练营一二阶段总结-周海鹏
- Loading branch information
Showing
1 changed file
with
27 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,27 @@ | ||
--- | ||
title: 2023开源操作系统训练营一二阶段总结 | ||
date: 2023-10-30 16:00:00 | ||
categories: | ||
- report | ||
tags: | ||
- author:nashzhou | ||
- summerofcode2023 | ||
- rcore-lab | ||
--- | ||
|
||
|
||
感谢老师和助教们贡献了这么好的课程,可以看到付出的努力和心血,所以我也非常重视这一次的训练营。通过这次的训练营,不仅让我在短时间内快速学习使用了Rust,并乘热打铁学习实践了我一直想掌握的OS知识。在阅读文档的时候详略有当,也给出了很多扩展性的知识和难题,不过个人水平太菜并没有深入。只经过短短两周多的学习,已经基本能在脑海中对操作系统有一个较为清晰的概念了。 | ||
|
||
<!-- more --> | ||
|
||
### 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,然后返回即可。 |