0%

2024春夏季开源操作系统训练营Blog-第二阶段

前言

经过第一阶段的Rust练习和RISC-V语法的入门阅读,进入第二阶段,完成rCore的五个实验。第二阶段主要是进行操作系统的学习,并通过实验具象操作系统概念的实现。同时也在跟着Writing an OS in Rust写blog_os作为补充。

一些链接🔗

第二阶段总结

整体rCore实验难度集中在最后三个实验中,第一二章节引入简单操作系统的架构,从裸机平台构建libOS,将整个OS作为一个库给用户使用,到加入特权级切换,让操作系统找到任务并运行实现批处理OS,第三章加入yield系统调用支持多道程序,并加入时钟中断实现抢占式多任务构成多道程序与分时多任务系统。第四章开启地址空间,进一步完善了OS的安全性,应用不再有直接访问物理内存的能力,并且只能通过虚拟地址读写自己的地址空间,无法访问破坏其它应用的地址空间,同时也给操作系统提供内存管理的灵活性,通过分页机制更好地管理物理页帧,页表管理虚拟地址到物理页帧的映射转换。第五章进一步强化任务的概念为进程,加入一个简单的shell,使得用户与操作系统之间的交互能力提高,可以动态地执行应用。第六章实现了一个easyfs文件系统,对操作系统提供持久化存储。第七章通过文件系统的支持建立进程间通信,让不同应用组合在一起运行。第八章引入线程和并发的概念,让操作系统从宏观层面实现多个应用的并发执行,实现内核态管理用户态运行的线程,并支持互斥锁、信号量和条件变量这三种资源。

由于提早完成了第一阶段任务,得以提前开始第二阶段,前面通过阅读文档并复现代码熟悉整体架构,第二阶段正式开始后完成实验。

  • lab1就是简单实现获取当前执行任务的信息,为了维护系统调用次数需要为每个任务维护一个数据结构用以记录,在每次调用之前通过syscall_id查询自增。执行时间单位是ms,初始化为任务第一次调度的时间。
  • lab2因为地址空间的引入,首先是对先前的get_time和get_taskinfo接口进行修改以支持虚拟地址,实际就将用户传递的虚拟地址转换为对应的物理地址即可访问修改,不过需要注意可能会被分成两页。之后需要实现mmap和munmap接口,对虚拟内存的申请和释放,主要需要注意判断和处理可能错误,以及释放虚拟内存的步骤实现。
  • lab3首先需要实现spawn接口,实际就是fork+exec,需要注意的是不必像fork一样复制父进程的地址空间。然后需要实现stride调度算法,需要注意调度算法所需状态的初始化和维护,可以选择通过堆或者维护单调队列来实现,不过测例简单也可以直接暴力搜索,还需注意处理溢出情况,避免调度进入死循环,同时优先级的维护还需实现set_priority系统调用。
  • lab4是实现硬链接相关接口linkat和unlinkat,需要注意unlinkat对inode以及对应数据块的回收。
  • lab5是实现死锁检测,需要注意维护检测算法所需的per-thread状态以及互斥量和信号量资源。

额外题目还没实现,后续如果有时间再研究吧:)