English | 中文
一句话总结: 在 xv6 教学内核中用 C 语言实现了自定义系统调用、按比例分配 CPU 的(lottery/stride)调度器、带惰性分配与写时复制
fork的mmap式内存映射, 以及一个支持 RAID 的 FUSE 文件系统。
一个由六个项目组成的渐进序列,从底层 C 系统编程一路深入到 xv6 教学操作系统的内核 功能,再到基于 FUSE 的文件系统。整体覆盖了现代操作系统课程的大部分核心:系统调用、 进程控制、CPU 调度、虚拟内存、文件系统。
本仓库为本科操作系统课程(UW–Madison CS537)的项目代码。文件夹保留
p1–p6的 原始命名以对应作业历史;下表说明每个项目实际实现了什么。
技术栈: C · x86 汇编 · xv6 内核 · FUSE · GNU Make · Unix 进程 API
| # | 文件夹 | 项目 | 我实现了什么 | 核心 OS 概念 |
|---|---|---|---|---|
| 1 | 01-letter-boxed |
Letter-Boxed 求解器 | 一个 C 命令行程序,针对给定棋盘与字典校验 Letter Boxed 单词谜题的解答链。 | C 系统编程、文件 I/O、命令行参数解析、字符串处理 |
| 2 | 02-xv6-syscall |
自定义 xv6 系统调用 | 给 xv6 内核新增 getparentname 系统调用,打通用户态/内核态完整链路。 |
系统调用机制、用户/内核态切换、陷入(trap) |
| 3 | 03-wsh-shell |
wsh —— Unix Shell |
约 900 行的 shell,支持 fork/exec/wait、管道、I/O 重定向、shell 变量、history 环形缓冲,以及 cd/export/local/vars 等内建命令。 |
进程创建、管道、重定向、环境管理 |
| 4 | 04-scheduler |
Lottery & Stride 调度器 | 用按比例分配的 lottery + stride 调度替换 xv6 默认的 round-robin,并新增 settickets/getpinfo 系统调用与 pstat 测量接口。 |
CPU 调度、调度公平性、内核数据结构 |
| 5 | 05-mmap |
内存映射(wmap) |
实现 mmap 式内存映射(wmap/wunmap/va2pa/getwmapinfo),含惰性分配、由缺页中断驱动的页填充,以及写时复制 fork。 |
虚拟内存、页表、惰性分配、缺页中断、COW |
| 6 | 06-wfs-filesystem |
WFS —— RAID 文件系统 | 一个 FUSE 文件系统,含磁盘上的超级块/位图/inode、直接块 + 间接块、目录、mkfs 格式化工具,并支持跨多块磁盘镜像的 RAID 0/1。 |
文件系统设计、inode、磁盘布局、RAID、FUSE |
- p4 —— 用数据说话的调度公平性。 仓库内含从运行内核中采集的真实每进程运行时间轨迹
(
stride_process_stats.csv、rr_process_stats.csv),直观展示 stride 调度如何按 ticket 数量成比例分配 CPU 时间,对比 round-robin 下与 ticket 无关的更平均分布。 - p5 —— 惰性分配 + 写时复制。 映射建立时不预分配任何物理页;首次访问时由缺页
中断处理程序填充,
fork后父子共享页面,直到写入才复制。 - p6 —— RAID 存储。
mkfs跨多块磁盘镜像格式化,文件系统支持 RAID 0(条带化) 与 RAID 1(镜像)。
每个项目自带 Makefile,编译与运行说明见各自的 README。基于 xv6 的项目(p2、p4、p5)
在 QEMU 中启动;p6 通过 FUSE 挂载。
学术诚信: 这是已完成课程的参考/作品集代码。如果你正在修读类似课程,请不要照抄—— 用它来理解概念,而不是用来提交作业。