本项目是一个基于 RISC-V 架构的类 Unix 操作系统 ucore 的完整实现。通过从零开始构建内核,我们深入理解了操作系统的核心机制,包括内存管理、进程调度、同步互斥以及文件系统。
ucore 的设计遵循模块化原则,各层级紧密协作,最终构建出一个支持多用户进程、具备文件系统和同步机制的完整系统。
- 内核初始化: 完成从 Bootloader 到内核的跳转,初始化物理内存布局。
- 中断/异常处理: 建立中断向量表,实现
trap处理流程。通过trapframe结构保存和恢复寄存器状态,支持内核态与用户态的上下文切换。 - 时钟中断: 提供系统节拍,为进程调度和时间管理提供基础。
- 物理内存管理 (PMM): 实现了基于页(Page)的分配机制。支持 First Fit、Best Fit 等分配算法,并引入了 SLUB 分配器 以高效管理内核小对象。
- 虚拟内存管理 (VMM): 建立了 SV39 多级页表机制。通过
vma(Virtual Memory Area) 管理进程地址空间,实现了按需分页 (Demand Paging) 和页面置换 (Swap) 机制(如 Clock 算法),支持超出物理内存容量的程序运行。
- 进程控制块 (PCB): 设计了
proc_struct,记录进程的运行状态、内存映射、父子关系及文件描述符。 - 内核线程: 实现了内核线程的创建 (
do_fork) 与切换 (switch_to)。 - 用户进程: 实现了
load_icode以解析 ELF 文件并加载到用户空间。通过ecall触发系统调用,实现了fork、exec、wait、exit等核心生命周期管理函数。 - 写时复制 (COW): 在
fork时共享物理页,仅在写入时触发缺页异常进行拷贝,极大优化了进程创建效率。
- 进程调度: 抽象了调度器框架,实现了 Round Robin 和 Stride Scheduling(步进调度)算法。Stride 算法通过“步长”机制实现了精确的优先级控制。
- 同步互斥:
- 信号量 (Semaphore): 提供了底层的 P/V 操作,用于保护临界区。
- 管程 (Monitor) 与条件变量: 实现了更高层的同步抽象,解决了生产者-消费者等经典并发问题。
- 虚拟文件系统 (VFS): 定义了统一的
inode和fs接口,使得上层应用无需关心底层文件系统的具体实现。 - Simple FS (SFS): 实现了一个简单的磁盘文件系统。
- 磁盘布局: 包含 Superblock(超级块)、Freemap(位图)、Inode(索引节点)和 Data Block(数据块)。
- 索引机制: 支持直接索引和一级间接索引,能够管理大文件。
- 设备抽象: 将
stdin、stdout和磁盘设备抽象为文件,统一纳入 VFS 管理。
负责人:郭子涵 (Ex 0, Ch 1)、梁朝阳 (Ex 1, 2)
- 练习 0:填写已有实验 (郭子涵)
- 集成 Lab 2/3/4/5 代码,更新 PCB 初始化以支持 Stride、优先级、时间片等调度信息,并改进时钟中断处理。
- 练习 1:理解调度器框架 (梁朝阳)
- 分析
sched_class函数指针作用、run_queue双数据结构(链表与斜堆)差异,以及调度器与算法的解耦机制。
- 分析
- 练习 2:实现 Round Robin 调度算法 (梁朝阳)
- 在
default_sched.c中实现RR_init、RR_enqueue等函数,掌握时间片耗尽后的重调度逻辑。
- 在
- Challenge 1:实现 Stride Scheduling 算法 (郭子涵)
- 基于斜堆实现 Stride 调度,证明其优先级比例分配的正确性,并设计多级反馈队列方案。
负责人:巩岱松 (Ex 0, 2)、郭子涵 (Ex 1)
- 练习 0:填写已有实验 (巩岱松)
- 集成 Lab 2/3/4/5/6 代码,确保同步机制在多进程环境下的稳定性。
- 练习 1:理解内核级信号量 (郭子涵)
- 分析信号量设计流程,证明哲学家就餐问题在当前实现下不会死锁,并设计用户态信号量方案。
- 练习 2:完成内核级条件变量与管程 (巩岱松)
- 基于信号量实现条件变量,利用管程机制解决哲学家就餐问题,探讨不基于信号量实现条件变量的可能性。
负责人:巩岱松 (Ex 0, 1)、梁朝阳 (Ex 2)、郭子涵 (Ch 1, 2)
- 练习 0:填写已有实验 (巩岱松)
- 集成 Lab 2/3/4/5/6/7 代码,为文件系统提供完整的内核支撑。
- 练习 1:完成读文件操作 (巩岱松)
- 实现
sfs_inode.c中的sfs_io_nolock函数,处理非对齐的磁盘块读取逻辑。
- 实现
- 练习 2:基于文件系统的执行程序机制 (梁朝阳)
- 改写
load_icode,支持从 SFS 中加载 ELF 文件,实现sh、ls等用户程序的运行。
- 改写
- Challenge 1:UNIX PIPE 机制设计 (郭子涵)
- 设计管道数据结构与接口,解决读写同步与互斥问题。
- Challenge 2:UNIX 软硬连接机制设计 (郭子涵)
- 设计索引节点链接计数与路径解析方案,处理文件删除时的资源回收。
- 操作系统: Linux 或 Windows + WSL2
- 工具链: RISC-V GNU Toolchain (gcc-riscv64-unknown-elf)
- 模拟器: QEMU for RISC-V (virt 机器类型)
# 进入对应实验目录,例如 lab8
cd lab8
# 编译并运行
make qemu# 运行自动化评分脚本
make grade