外观
MIT 6.1810:从程序进入内核,到自己修改内核
这份课程包以 MIT 6.1810 Fall 2025、RISC-V xv6 为唯一实验基线。目标是能够从现象追到机制:一个 read 为什么可能睡眠,一个只读页为什么有时能在异常后继续写,一个已经退出的进程为什么还占着进程表项。随后把理解落实到九个官方实验。
阅读与实践顺序
| 阶段 | 先读 | 再做 | 能解释的结果 |
|---|---|---|---|
| 建立机器模型 | 运行边界、进程 | util | fork、exec、wait 为什么分开 |
| 跨越权限边界 | 系统调用 | syscall | 内核如何接收与限制请求 |
| 组织地址空间 | 内存 | pgtbl | 页表、大页、只读共享页 |
| 保存与恢复执行 | 异常与中断 | traps、cow | 恢复什么状态才能继续程序 |
| 多核与外设 | 并发 | lock、net | 不变量、DMA、等待与唤醒 |
| 持久化与映射 | 文件系统 | fs、mmap | 字节如何落盘,文件如何成为内存 |
| 验证掌握程度 | 调试、综合复习 | 实验验收 | 能解释正确性,也能构造反例 |
每章先建立概念,再给源码入口;实验页给设计顺序、边界情况与检查方法。正文中的伪代码和 Python 模型用于解释机制。它们不是可直接提交的 xv6 完整答案,也不构成九个实验已经通过的证明。
版本是学习材料的一部分
2025 的 util 使用 pause();syscall 实现 interpose sandbox;pgtbl 包含 superpage;lock 后半实现读写自旋锁。旧年度的 sleep() 内核接口、trace/sysinfo、buffer cache 锁实验不能直接套用。本版本的内核进程入口叫 kfork/kexit/kwait,用户接口仍叫 fork/exit/wait;返回用户态的重要入口是 prepare_return(),不是旧教程里的 usertrapret()。
labs/os/upstream-pins.json 保存 2026-10-04 从官方仓库实读的九个分支提交号。版本与环境给出获取方法。所有源码导航都指向相应实验分支;实验之间不是要求把全部改动顺次合并的一条产品分支。
学到什么程度算完成
对于每个实验,至少保存四样东西:改动前的行为、关键不变量、测试记录、一个自己补充的反例。看到测试通过后,再回答“如果把哪一行删掉,哪个不变量先坏掉”。这一步能区分理解机制与恰好满足样例。
本课程包已经提供可在普通 Python 环境执行的地址转换和 COW 模型。真实 xv6 仍需 RISC-V 工具链与 QEMU;模型通过和真实内核通过分开记录,具体边界见实验总览。