2024年秋冬季开源操作系统训练营第一、二阶段总结报告
我个人的话原本这段时间的计划是重新深入学习一下 RUST 语言,通过 RUST 圣经找到的 RUST 官方社区的 QQ 群。刚好在群里看到群友的开源操作系统的邀请,其实时间上对我来说刚刚好,主要原因在于明年暑假可能该找实习了,否则可能不太好找工作。我本人也想通过这个开源来完善自己在开源项目的 PR 上的缺陷,所以,刚刚好,那就坚持到最后吧。
机会总是有的,抓住了还得坚持到底。嗯,就这样。
第一阶段总结
第一阶段怎么说呢,嗯,不太好总结,之前因为一些机缘巧合看过 RUST 官方社区的教材,所以只有简单了解,也写过教材里的demo。所以,总体上来说,对我难度不大。嗯,也是在一阶段前截止前三天吧开始的,后面每天完成一点。大概这样。对我来说的话 RUST 实现链表那边是真的很难,但是只完成 task 倒还好。
第二阶段总结
二阶段的话,分不同的章节吧,收获不同。
第三章实验内容的话是taskinfo系统调用的支持。其实实现这个系统调用不难,这边主要的收获是对程序链接有了更深的了解。在linker链接器脚本中指定的符号可以被OS中以外部符号的形式使用,嗯,链接的作用应该是了解更深了。其次,了解更深的地方在于任务切换,一个任务从elf到一个进程,如何构造,如何执行,如何调度,如何进入User模式执行这样,包括一些寄存器SStatus,SEPC,Stvec等等。
第四章的话,mmap和munmap这两个的实现上也没问题。主要收获其实是在于跳板实现的一些细节,最后跳转trap_handler的时候使用jr指令主要原因在于linker脚本链接出来的地址差值和真正跳板代码的虚拟地址位置还有很大差别。所以,不能这么搞,差值还要加上和跳板的距离。
在进程管理里,先前的任务结构体被重新修改为了进程。并且要实现的系统调用也与进程的产生有关系。此外,对stride算法也有了一定的了解。本质上还是进程里添加了一个字段,然后在每次执行进程时都重新处理一次prio字段并更新记录,以决定下一次执行的进程。
进程管理的主要收获在于,task和进程切换的差别。他们差别很大,进程切换要切所有的通用寄存器等等。任务切换切pc,切栈,切被调用者保存寄存器这样,因为调用者保存寄存器在调用schedule的时候已经保存了。然而切换的时候还有被调用者保存寄存器还没保存好。嗯,就是这样。
这里,有个问题就是使用usize的MAX作为大整数,没想到后面会反复调度任务0,后面debug之后才知道要取余这样。
并发的话,就真的太折磨了,银行家算法真的难搞。最后没过测例的原因居然是没实现sys_get_time。太TM离谱了,以后一定好好看任务手册。
最后
如果这次没坚持到后面的话,可能后面就真的没机会了。学业上有科研要求,还想去实习,嗯,对我的规划来说,可能到毕业之前没有再来一次的机会了。
一定坚持到最后。