|
|
|
|
# Rust OS 教学lab实验的制作 方案设计文档
|
|
|
|
|
## 1 实验目标
|
|
|
|
|
* 补全部分Rust OS尚未实现的基础功能
|
|
|
|
|
* 从现有Rust OS中裁剪出一个子集用于教学lab
|
|
|
|
|
* 参考现有ucore OS实验设计Rust OS教学lab(基于riscv32)并完成相关测试代码的编写
|
|
|
|
|
* 完成教学实验说明文档,并补充每一个lab所需的代码注释
|
|
|
|
|
* 尝试配置基于浏览器的虚拟机实验环境
|
|
|
|
|
|
|
|
|
|
## 2 背景
|
|
|
|
|
现有的操作系统大实验是基于ucore OS完成的,总共由8个小实验完成,包含了操作系统从启动到进入shell的全过程,内容包括硬件启动,异常处理,内存管理,进程管理,同步互斥,文件系统等操作系统基础知识点。[ucore OS lab](https://github.com/chyyuu/ucore_os_lab)已经具有十分完善的[教学文档](https://objectkuan.gitbooks.io/ucore-docs/content/index.html)。
|
|
|
|
|
|
|
|
|
|
ucoreOS lab基于x86结构,主要由C语言完成编写。x86架构由于其向后兼容性等种种原因,整体结构比较复杂,作为教学操作系统门槛比较高。相比较而言riscv32架构简洁高效,易于实现,是教学用cpu结构的不二选择。此外C语言的安全性一直以来饱受诟病。相较C语言,Rust语言更加简洁、安全,模块性好,可复用性强,可以通过采用现有库文件更优雅的解决文件。**最重要的是王润基等同学已经参照ucore OS实现了一个比较完整的基于x86_64和riscv32的Rust OS**,因此我们决定再次基础上进行完善并裁剪出一个基于riscv32的教学用RustOS lab。
|
|
|
|
|
|
|
|
|
|
## 3 实验设计与分工
|
|
|
|
|
### 3.1 完善现有Rust OS基础功能
|
|
|
|
|
现有Rust OS在riscv32环境下还存在一些bugs或unimplemented features,要想完成一个类似于ucore OS lab的教学实验框架,首先要把这些漏洞完善。现简单将每个lab目前待完善的地方和负责填坑的人列举如下:
|
|
|
|
|
|
|
|
|
|
**lab1:** 主要涉及实验框架的编译、调试,OS bootloader启动过程。现有实验框架已经完成,不需要完善。
|
|
|
|
|
|
|
|
|
|
**lab2:** 主要涉及物理内存管理,由于riscv32结构的物理内存管理仅通过一个二级页表来实现,不像x86架构下还需要兼容段表(虽然最终只是一个自映射),因此这部分比原本的ucore OS lab会更简洁、易理解一些。另外RustOS 的现有物理内存分配算法是通过线段树实现的,且相较原本的内存分配算法复用性更好。本分内容已经完成。
|
|
|
|
|
|
|
|
|
|
**lab3:** 该部分实验主要涉及虚存管理部分,**目前RUST OS仅针对x86_64结构实现了page fault的处理**,后续需要完成riscv32的page fault处理和虚存管理部分。
|
|
|
|
|
|
|
|
|
|
**lab4:** 主要涉及内核线程创建和调度,现有框架中本部分内容已经完成,是否存在问题有待后续测试。
|
|
|
|
|
|
|
|
|
|
**lab5:** 主要涉及用户线程管理,此部分内容似乎同样已经完成,是否存在问题有待后续测试。**事实上之前测试中似乎又提到没有wait过的进程退出内存不会被回收,原因是线程管理Processor还没维护好线程的生命周期,线程退出后没有主动清除对象(考虑到它的子线程们可能还没退出)**,此部分有待完善。
|
|
|
|
|
|
|
|
|
|
**lab6:** 此部分主要涉及进程调度器的相关内容,现有框架中本部分内容已经完成,是否存在问题有待后续测试。
|
|
|
|
|
|
|
|
|
|
**lab7:** 主要涉及的是进程间的同步、共享资源的竞争,要求熟悉掌握信号量的原理,管程与条件变量的原理与实现,并用其来解决哲学家问题。**但是目前的rustOS-riscv中由于编译器对于原子指令的支持问题,导致相关功能未能实现**,需要寻求解决的办法来完善该实验。而且x86_64下该模块与kernel尚未分离,导致结构不够清晰需要进行调整。
|
|
|
|
|
|
|
|
|
|
**lab8:** 此部分主要涉及文件系统。文件系统本身的实现并没有包含在仓库当中,而是在另一个仓库[wangrunji0408/SimpleFileSystem-Rust](https://github.com/wangrunji0408/SimpleFileSystem-Rust)当中。注意除了 SimpleFileSystem 本身的实现,文件系统的接口(VFS等)也在该仓库当中,而这一部分需要挪到主仓库当中。除此之外,文件系统的挂载功能也没有被实现,需要完善。另外在riscv32下IDE硬盘驱动似乎暂时不能工作,目前是使用一段内存作为存储空间设备,而该设备的写操作没有实现,而事实上文件系统的写操作也没有被测试。
|
|
|
|
|
|
|
|
|
|
其中前6个lab现有框架已经实现完成,主要涉及虚存管理和进程管理的部分内容有待完善,此部分计划由刘辰屹来完成。lab7在riscv32下的完善计划由陈秋昊来完成,lab8的完善计划由朱书聪来完成。上述为暂时的分工,实际分工视各部分难度大小再进行调整。
|
|
|
|
|
|
|
|
|
|
此部分计划在第5周结束前完成。
|
|
|
|
|
|
|
|
|
|
### 3.2 教学lab的裁剪和测试程序的编写
|
|
|
|
|
此部分内容计划在第6周结束前完成
|
|
|
|
|
|
|
|
|
|
### 3.3 教学lab文档编写
|
|
|
|
|
此部分内容计划在第7周结束前完成,可能向后顺延至第8周
|
|
|
|
|
|
|
|
|
|
### 3.4 在浏览器中运行Rust OS lab
|
|
|
|
|
目前没有能够探索到实现此计划的可行性,待定。
|
|
|
|
|
|
|
|
|
|
## 4 参考文献
|
|
|
|
|
ucore OS lab实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/index.html
|
|
|
|
|
|
|
|
|
|
王润基同学的Rust OS开发文档:https://rucore.gitbook.io/rust-os-docs/
|