同济大学 2024-2025 学年春季学期 操作系统课设(dr 老师)
本项目基于 Unix V6++ 教学操作系统(同济大学内部使用),完成了从连续存储管理向 页式离散化存储管理 的全面迁移。通过重构内存管理、页表机制和进程资源生命周期,支持现代操作系统所采用的页框级物理内存分配方式,并引入了 Copy-On-Write(COW)机制以优化 fork 系统调用性能。
✨ 项目亮点
-
离散物理内存管理(Page-based)
- 使用 位示图(bitmap) 替代传统的空闲分区表 MapNode 实现页框级内存管理;
- 支持最大 0x2000(8192)个页框,位图结构固定占用 0x400 字节;
- 重构 PageManager 类,彻底移除对 Allocator 的依赖,实现真正的页式管理。
-
精简高效的二级页表机制
- 移除“相对虚实地址映射表”,直接使用页目录 + 用户页表实现地址转换;
- 每个进程持有一份私有的 1# 用户页表,其他页表均可共享;
- 通过切换页目录中 1# PDE 的 BaseAddr 实现进程切换的页表更新,简化 Swtch() 流程;
- 进程创建时即初始化用户页表,避免 fork -> exec 路径中的 Page Fault。
-
进程资源全生命周期离散化支持
- 精细化控制进程图像:保留 PPDA 区、释放旧图像内存、重建用户页表;
- Exec、Exit、Expand 等函数均重构以支持页框级的内存释放与重新分配;
- SStack() 与 SBreak() 分别支持堆栈区按页动态增长。
-
Copy-On-Write(COW)机制实现
- 为页框添加引用计数机制,仅在写时触发复制;
- fork 调用中父子进程共享物理页框,避免无效复制;
- 在写操作触发 Page Fault 时分配新页框并重新建立映射;
- 提升性能同时降低内存开销,支持对大型进程的高效复制。
🛠️ 技术细节概览
模块 | 描述 |
---|---|
Bitmap.h | 定义位图结构,用于跟踪页框分配状态 |
PageManager.cpp | 重写 AllocMemory 和 FreeMemory,采用页式算法 |
MemoryDescriptor.cpp | 每个进程维护独立的 1# 用户页表,负责建立页表映射 |
ProcessManager.cpp | 精简 Swtch 与 NewProc,支持离散页表管理与 COW 建立 |
Exception.cpp | 在 Page Fault 中处理写操作触发的 COW 逻辑 |
.
├── README.md
├── docs # 相关文档
├── note # 相关笔记
└── oos # Unix V6++ 相关文件
└── src # 源代码
在 note/ 下有相关的设计文档可供参考。
oos/ 下只放置了修改过的文件,保留了原始路径,如有遗漏可查看设计文档自行补充。
注意:该学期为 dr 老师第一次独立开班,因此不保证后面学期会沿用该作业,自行甄别。
设计文档中的所有思考只代表我当时的看法,本人保留自省的权利