外观
九个实验的路线、检查点与完成证据
全部实验固定 MIT 6.1810 2025。每个分支是官方为该实验准备的起点,不要求把前面所有实验答案手动合并到后面。完整 SHA 保存在项目 labs/os/upstream-pins.json,获取方式见环境与版本。
| 实验 | 本年实际任务 | 主验证 | 深度 |
|---|---|---|---|
| util | sleep/pause、sixfive、memdump、find、exec | findtest.sh、make grade | 深入用户接口与内存表示 |
| syscall | GDB、interpose、路径例外、残留内存 | sandbox 测试、make grade | 深入权限边界与进程继承 |
| pgtbl | PTE 解读、USYSCALL、vmprint、superpage | pgtbltest、usertests | 深入翻译与分配生命周期 |
| traps | 汇编、backtrace、alarm | bttest、alarmtest、usertests | 深入状态保存恢复 |
| cow | 延迟复制、引用计数、copyout | cowtest、usertests | 最详细的跨模块补丁设计 |
| net | E1000 驱动、UDP 接收与端口队列 | nettest.py、nettest、make grade | 驱动 I/O 流程为主 |
| lock | per-CPU freelist、读写自旋锁 | kalloctest、rwlktest、usertests | 深入不变量与公平性 |
| fs | 双级索引、符号链接 | bigfile、symlinktest、usertests | 深入索引与资源回收 |
| mmap | VMA、惰性读页、解除与写回 | mmaptest、usertests | 深入内存与文件的连接 |
每个实验留下可复核记录
推荐一份记录包含:上游提交、自己的改动范围、构建工具版本、测试命令、原始输出、自己新增的边界测试、尚未验证的部分。不能只保存最终分数;分数无法解释是哪个构建、哪个分支、哪次运行。
在自己的 xv6 实验目录中可以使用:
sh
git rev-parse HEAD
git diff --stat
make clean
make grade执行前确保改动已妥善保存。make clean 清理构建产物;它不是版本回退。make grade 在宿主机执行,测试程序名称通常在 xv6 shell 中执行。网络实验有宿主和来宾双侧程序,不能把两个命令放在同一个 shell 猜测运行。
从能运行到能说明
第一层检查“能构建、能启动”;第二层检查官方测试;第三层检查资源是否反复使用后仍完整;第四层解释边界。比如 COW:一次 fork 成功只说明局部路径可运行;forkfork、copyout、OOM、只读页、不同退出顺序共同覆盖所有权协议。lock 还需多 CPU 配置,net 还需跨越描述符环,fs 还需删除后重新创建。
测试失败时先缩小触发条件,不先修改评分脚本或放宽断言。测试通过后不要立即扩大改动范围;先保存可解释的版本,再探索性能优化。一个同时改 COW、大页、mmap 和锁的补丁,出现内存损坏时很难确定是谁破坏了最早的不变量。
本仓库实际提供与验证的内容
labs/os/models.py 提供普通 Python 可运行的 Sv39 和 COW 教学模型;test_models.py 包含地址、权限、大页、父子隔离、只读保护、退出回收、OOM 与跨页 copyout 测试。运行方式:
sh
python3 labs/os/models.py
python3 -m unittest discover -s labs/os -p 'test_*.py' -v本课程包的真实验证记录见 labs/os/verification.md。**教学模型测试通过不等于九个 xv6 实验解答通过。**本仓库交付的是完整概念与实验导读、可运行模型和上游版本记录;没有把整套官方实验参考答案或未经运行的补丁宣称为完成品。
验收时口头解释三件事
对每个实验,能够指出一条完整执行路径,解释一个资源的生命周期,并构造一个会击穿错误实现的反例。以 mmap 为例:路径是 fault 到 readi 到 PTE;资源是 VMA 的 file 引用;反例是 close fd 后再访问映射。这样的验收比背诵函数名更接近真正掌握。
自测:官方测试通过后,为什么还要记录未覆盖范围?
测试只针对实验承诺,不证明生产级语义或所有并发交错。明确边界能防止将实验简化误当成系统通用规律,也能帮助下一阶段扩展时选择真正需要的新验证。