这是一个基于 xv6 的 RISC-V 操作系统改进项目。原来的项目是支持 K210 开发板的(来自 HUST-OS/xv6-k210)。原项目文档统一移入了doc文档,新文档统一放在docs文件夹下
xv6 是 MIT 开发的教学用操作系统,代码简洁但功能基础。我们在此基础上进行了深度改进,完成了 14项功能改进。这些改进相互关联、相互支撑,比如内存管理的 COW 和 Lazy Allocation 为 mmap 提供基础,进程调度器与信息统计功能紧密配合,整个系统能够作为有机整体运行。
- 文件系统: 多级缓存减少了磁盘 IO开销,文件名排重和时间戳修复提升用户体验
- 内存管理: COW + Lazy Allocation + mmap 协同工作,大幅提升内存效率和 fork 性能
- 进程管理: 优先级调度和 MLFQ 实现静态到动态演进,ps/top 提供完善监控
- 进程间通信: 信号机制和共享内存提供标准 IPC 接口
├── kernel/ # 内核代码
├── xv6-user/ # 用户空间程序
├── docs/ # 改进文档文件夹(详见下方)
├── bootloader/ # 引导加载程序
├── Makefile # 构建脚本
└── fs.img # 文件系统镜像
所有改进的详细文档位于 docs/ 文件夹,包括:
| 文档 | 内容 |
|---|---|
| 改进总结.md | 改进工作完整总结 |
| FAT表缓存改进.md | FAT 表缓存设计与实现 |
| 目录项缓存优化.md | 目录项 LRU 优化 |
| 文件名排重机制.md | 自动生成不重复文件名 |
| 时间戳.md | 时间戳问题修复 |
| cow.md | 写时复制机制 |
| 内存管理-惰性分配.md | 惰性分配实现 |
| mmap.md | 内存映射系统调用 |
| 进程管理-优先级调度.md | 优先级调度算法 |
| 进程管理-多级反馈队列.md | MLFQ 调度算法 |
| 进程信息与统计.md | ps/top 命令实现 |
| 进程间通信-共享存储器.md | 共享内存 IPC |
| 信号机制-第一阶段.md | 信号注册机制 |
| 信号机制-第二阶段.md | 信号处理实现 |
| cachetest.md | 缓存性能测试 |
| 改进项 | 说明 |
|---|---|
| FAT 表缓存 | 32 扇区缓存,LRU 淘汰策略,write-through 确保一致性,预期减少 50%+ 磁盘 IO |
| 目录项缓存优化 | 修复 LRU 命命中后移动到链表头部的操作,缓存命中率提升至 70%+ |
| 文件名排重 | 自动生成 file_1、file_2 等后缀,最多支持 9999 个同名文件 |
| 长文件名排重 | 处理长文件名转短文件名冲突,生成 ~1、~2 后缀确保兼容性 |
| 时间戳修复 | 修正 UTC 时间显示(晚 8 小时)和时钟频率假设问题 |
| 改进项 | 说明 |
|---|---|
| Copy-on-Write | fork 时父子进程共享物理页,写入时才拷贝。引用计数管理,kalloc.c 维护 ref_count |
| Lazy Allocation | sbrk 只更新记账,缺页时才分配物理页。支持稀疏地址空间,fork 更快 |
| mmap 系统调用 | 引入 VMA 结构管理多个内存区域,支持独立权限。缺页处理:COW > VMA > sbrk |
| 改进项 | 说明 |
|---|---|
| 优先级调度 | 0-100 优先级(默认 50),两阶段扫描 + 时钟中断抢占,fork 继承优先级 |
| MLFQ 调度 | 3 级队列(时间片 1/2/4),新进程从高队列开始,短任务快速完成 |
| 进程信息统计 | sys_getprocs() / sys_getrusage() 系统调用,ps / top 命令实时监控 |
| 改进项 | 说明 |
|---|---|
| 共享内存 IPC | System V 风格接口(shmget/shmat/shmdt/shmctl),最多 16 个段,spinlock 保护 |
| 信号机制 | POSIX 标准信号,signal() 注册处理,SIGKILL/SIGSTOP 不可捕获,支持用户处理函数 |
VMA 是首次在 xv6 中引入的概念,为 mmap 提供基础架构。双层缺页处理(COW > VMA > sbrk lazy allocation)实现了不同内存管理方式的协同。
每进程专属内核页表确保内核访问用户空间时具备一致映射关系。引用计数是 COW 和共享内存的基础,物理页释放取决于引用计数归零。
职责分离设计:handle_time_slice 负责递减和降级,调度器负责重置。新进程 time_slice 初始化为 0,避免刚创建就降级。
| 测试程序 | 测试内容 |
|---|---|
cachetest |
缓存性能测试,顺序/交替读取验证效果 |
cowtest |
COW 基本功能和多页面场景 |
lazytest |
惰性分配功能 |
mmaptest |
内存映射读写、权限、COW |
priotest |
优先级调度算法 |
mlfqtest |
MLFQ 调度算法 |
shmtest |
共享内存 IPC |
sigtest1/sigtest2 |
信号机制 |
| 成员 | 负责模块 |
|---|---|
| 余炅 | 进程调度、进程间通信 |
| 李旺磊 | 文件系统功能扩展、时间戳 |
| 汪博 | 内存管理优化 |
项目在 QEMU 上运行。在 Windows 上使用 WSL 安装 Ubuntu,下载 riscv64-linux-gnu 和 qemu 工具后运行:
1. 安装 WSL Ubuntu
wsl --install -d Ubuntu2. 安装交叉编译工具和 QEMU
sudo apt update
sudo apt install -y gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu qemu-system-riscv64 qemu-usermake clean
make fs # 生成文件系统镜像(首次或需要更新时)
make run # 启动 QEMU或直接运行脚本:
./run.bash按 Ctrl+A 然后 X 退出 QEMU。