Skip to content
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xv6-k210 操作系统改进项目

这是一个基于 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_1file_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 管理与双层缺页处理

VMA 是首次在 xv6 中引入的概念,为 mmap 提供基础架构。双层缺页处理(COW > VMA > sbrk lazy allocation)实现了不同内存管理方式的协同。

进程内核页表与引用计数

每进程专属内核页表确保内核访问用户空间时具备一致映射关系。引用计数是 COW 和共享内存的基础,物理页释放取决于引用计数归零。

MLFQ 时间片管理

职责分离设计: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-gnuqemu 工具后运行:

环境准备

1. 安装 WSL Ubuntu

wsl --install -d Ubuntu

2. 安装交叉编译工具和 QEMU

sudo apt update
sudo apt install -y gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu qemu-system-riscv64 qemu-user

运行系统

make clean
make fs         # 生成文件系统镜像(首次或需要更新时)
make run       # 启动 QEMU

或直接运行脚本:

./run.bash

Ctrl+A 然后 X 退出 QEMU。

About

Bob在OS比赛中的继续部分

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages