基于 RISCV 架构的 Rust 系统内核-太素OS
源码
目前太素OS已经大致完成如下功能:
- Uart 通用异步收发传输器,命令行的输入可以通过 MMIO 获取,同时可以输出到命令行,作为主要的调试手段
- 中断 包括汇编、Rust 两部分,中断首先跳转到汇编部分,再转到 Rust 部分。汇编部分负责保存与恢复环境,中断负责具体的处理
- 内存管理
- 分页管理,将内存按照 4kb 大小的页表进行记录管理,前 1G 的地址属于 MMIO。128MB 内存,内核分到 80MB
- 分块堆内存管理,在分页管理的基础上,采用类似 SLAB 的方法,每次分配内存时将大小对齐到 2^n,将申请到的内存按照对应大小划分成许多块进行标记管理。
- 页表映射 在分页管理的基础上,管理三级的页表。仅在映射时进行内存申请。
- PLIC 平台级中断控制, 主要用于控制时钟中断和软件中断(待完成)
- 时钟中断,现设置为 15_0000 个周期(15ms)进行一次中断
- 同步 利用 RISCV 原子交换实现
- 单重锁,仅可以同时上锁一次
- 多重锁,同一个核心可以上锁多次(主要是给中断时的进程调度使用,可以在函数调用中多次上锁)
- 读写锁,支持读取时允许多次上锁,写入时只允许锁一次
- 进程,分为用户、内核两种,作为程序存在的标志
- 内存映射,默认映射执行地址的一个页表以及栈内存对应页表。同时为内核进程映射所有内核用地址以及用户地址,为用户进程映射内核系统调用地址
- 进程代表程序,管理所属的所有线程
- 线程,作为进程的子集,通过 fork 产生,更加轻量,不需要再次进行内存映射
- 每个线程分配16张页表作为栈
- 调度,通过时钟中断触发调度,暂停当前内核标记为 Running 的进程、选取下一个标记为 Waiting 的进程标记为 Running 并运行
- 第一个线程作为主线程,主线程结束所有线程被卸载,进程结束
- 块设备,即磁盘。支持同步读写(用单重锁实现,操作发出后锁住,读写完成后触发中断解锁)、异步读写(创建一个 Sleeping 的进程,读写完成后触发中断唤醒待执行进程)
- GPU,图形化显示
- 输入设备,包括键盘、鼠标等的输入(nographic 选项下无效,因为需要 qemu 的窗口捕捉输入)
- 磁盘读写缓冲 预先读取大块磁盘中的内容放置在缓冲内存中。所有读写操作都写入缓冲部分内存。目前只实现了读取,写入待完成。
- FAT32文件系统 目前实现了 FAT32 文件系统的读取。文件系统以文件树的形式展示,可以读取运行 elf 程序
- Shell(调试用)一个简单的命令行交互程序,以独立进程运行,用于调试功能
- 图形接口
- element,基本显示单元,维护一个矩形作为显示内容,支持透明度
- canvas,在 element 的基础上支持翻页功能
- 桌面系统 一个简单的桌面系统,包含命令行窗口、文件夹窗口、Dock。支持一些简单的交互
2021全国大学生操作系统比赛的“OS功能设计”赛道
- 以小组为单位参赛,最多三人一个小组,且小组成员是来自同一所高校的本科生(2021年春季学期或之后本科毕业的大一~大四的学生)
- 如学生参加了多个项目,参赛学生选择一个自己参加的项目参与评奖
- 请遵循“2021全国大学生操作系统比赛”的章程和技术方案要求
张根
-
email [email protected]
中等
一个带图形界面的相对完整的操作系统,用Rust编写,运行在RISC-V 64 CPU上。
GPL-v3
设计并完善图形 API
对于新手而言,一个美观的图形界面可以成为他们学习操作系统的主要动力,同时也可以吸引更多同学加入到操作系统的研究当中。所以图形界面对于教学工作而言非常重要。
太素OS已经实现了底层的图形绘制 API。目前有一个内嵌在内核里的桌面系统,但是相关的系统调用还没有完成。现在需要制作相关的系统调用并将桌面系统独立编译为 elf 文件。
要求大致需要完成以下工作:
- 完善相关的系统调用
- 在 1 的基础上制作一个桌面系统,编译成独立的 elf 文件,通过系统调用的方式进行工作。
- 优化系统调用 API 的工作方式,使得系统运行于 QEMU 上不至于有明显的卡感。
你可以重构相关的图形部分代码。
建议:
- 充分利用 Rust 的特性、减少不安全代码
- 各个模块之间尽量降低耦合度
设计并完善任务系统
太素OS的任务系统较为简单,目前还没有设置优先级等特性。多核调度也仅仅只是由主核心进行触发。现在需要设计一个功能更加完备的任务系统,要求:
- 具有优先级或权重等特性,能够据此进行合理的时间片分配
- 多核调度能够更加灵活,不再或减少对于主核心的依赖
- 设计并实现线程间通信功能
- 设计并实现定时任务定时唤醒
设计并完善文件系统
太素OS中的文件是将硬盘镜像挂载到 Linux 虚拟机后拷贝过去的。文件系统对于测试系统调用、页表映射、内存分配的功能具有非常大的意义。目前项目中的文件系统较为粗糙,仅仅实现了FAT32
格式的读取以及简单的写入。硬件无关的系统调用也没有制作。任务如下:
- 添加其它类型的文件系统支持,如:ext、ntfs 等
- 设计新的虚拟文件系统,设计合理的文件抽象