Skip to content

gong-web/2025-2026-OS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

107 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ucore 操作系统总设计文档

本项目是一个基于 RISC-V 架构的类 Unix 操作系统 ucore 的完整实现。通过从零开始构建内核,我们深入理解了操作系统的核心机制,包括内存管理、进程调度、同步互斥以及文件系统。


🏗️ 系统架构总览

ucore 的设计遵循模块化原则,各层级紧密协作,最终构建出一个支持多用户进程、具备文件系统和同步机制的完整系统。

image-20260104143109194

1. 系统启动与基础支撑 (Lab 1)

  • 内核初始化: 完成从 Bootloader 到内核的跳转,初始化物理内存布局。
  • 中断/异常处理: 建立中断向量表,实现 trap 处理流程。通过 trapframe 结构保存和恢复寄存器状态,支持内核态与用户态的上下文切换。
  • 时钟中断: 提供系统节拍,为进程调度和时间管理提供基础。

2. 内存管理系统 (Lab 2 & Lab 3)

  • 物理内存管理 (PMM): 实现了基于页(Page)的分配机制。支持 First Fit、Best Fit 等分配算法,并引入了 SLUB 分配器 以高效管理内核小对象。
  • 虚拟内存管理 (VMM): 建立了 SV39 多级页表机制。通过 vma (Virtual Memory Area) 管理进程地址空间,实现了按需分页 (Demand Paging)页面置换 (Swap) 机制(如 Clock 算法),支持超出物理内存容量的程序运行。

3. 进程与线程管理 (Lab 4 & Lab 5)

  • 进程控制块 (PCB): 设计了 proc_struct,记录进程的运行状态、内存映射、父子关系及文件描述符。
  • 内核线程: 实现了内核线程的创建 (do_fork) 与切换 (switch_to)。
  • 用户进程: 实现了 load_icode 以解析 ELF 文件并加载到用户空间。通过 ecall 触发系统调用,实现了 forkexecwaitexit 等核心生命周期管理函数。
  • 写时复制 (COW): 在 fork 时共享物理页,仅在写入时触发缺页异常进行拷贝,极大优化了进程创建效率。

4. 调度与同步机制 (Lab 6 & Lab 7)

  • 进程调度: 抽象了调度器框架,实现了 Round RobinStride Scheduling(步进调度)算法。Stride 算法通过“步长”机制实现了精确的优先级控制。
  • 同步互斥:
    • 信号量 (Semaphore): 提供了底层的 P/V 操作,用于保护临界区。
    • 管程 (Monitor) 与条件变量: 实现了更高层的同步抽象,解决了生产者-消费者等经典并发问题。

5. 文件系统 (Lab 8)

  • 虚拟文件系统 (VFS): 定义了统一的 inodefs 接口,使得上层应用无需关心底层文件系统的具体实现。
  • Simple FS (SFS): 实现了一个简单的磁盘文件系统。
    • 磁盘布局: 包含 Superblock(超级块)、Freemap(位图)、Inode(索引节点)和 Data Block(数据块)。
    • 索引机制: 支持直接索引和一级间接索引,能够管理大文件。
  • 设备抽象: 将 stdinstdout 和磁盘设备抽象为文件,统一纳入 VFS 管理。

👥 团队分工与详细实验内容

Lab 6:调度器框架与调度算法

负责人:郭子涵 (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_initRR_enqueue 等函数,掌握时间片耗尽后的重调度逻辑。
  • Challenge 1:实现 Stride Scheduling 算法 (郭子涵)
    • 基于斜堆实现 Stride 调度,证明其优先级比例分配的正确性,并设计多级反馈队列方案。

Lab 7:同步互斥机制

负责人:巩岱松 (Ex 0, 2)、郭子涵 (Ex 1)

  • 练习 0:填写已有实验 (巩岱松)
    • 集成 Lab 2/3/4/5/6 代码,确保同步机制在多进程环境下的稳定性。
  • 练习 1:理解内核级信号量 (郭子涵)
    • 分析信号量设计流程,证明哲学家就餐问题在当前实现下不会死锁,并设计用户态信号量方案。
  • 练习 2:完成内核级条件变量与管程 (巩岱松)
    • 基于信号量实现条件变量,利用管程机制解决哲学家就餐问题,探讨不基于信号量实现条件变量的可能性。

Lab 8:文件系统

负责人:巩岱松 (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 文件,实现 shls 等用户程序的运行。
  • Challenge 1:UNIX PIPE 机制设计 (郭子涵)
    • 设计管道数据结构与接口,解决读写同步与互斥问题。
  • Challenge 2:UNIX 软硬连接机制设计 (郭子涵)
    • 设计索引节点链接计数与路径解析方案,处理文件删除时的资源回收。

🛠️ 开发与运行

1. 环境要求

  • 操作系统: Linux 或 Windows + WSL2
  • 工具链: RISC-V GNU Toolchain (gcc-riscv64-unknown-elf)
  • 模拟器: QEMU for RISC-V (virt 机器类型)

2. 编译与运行

# 进入对应实验目录,例如 lab8
cd lab8

# 编译并运行
make qemu

3. 测试

# 运行自动化评分脚本
make grade

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors