Video Lecture 8 Page Fault
文章目录
- 2.2 Zero-fill-on-demand
- 2.3 Copy-on-write-fork
- 2.4 Demand Paging
- 思考问题
- MIT 6.S081 Lecture 8 – Page Fault 课堂笔记
- 1. 页故障(Page Fault)基础
- 2. Lazy Allocation(按需分配)
- 3. Copy-on-Write Fork
- 4. Zero-fill-on-demand
- 5. 与后续实验/主题的衔接
- 6. Memory-mapped files
- 6. 课堂 Q&A 精选
- 6. 小结
关键词:copy-on-write fork, zero fill-on-deman
2.2 Zero-fill-on-demand
2.3 Copy-on-write-fork
2.4 Demand Paging
思考问题
1 Linux系统如何处理Page fault? FreeRTOS如何处理Page Fault?
MIT 6.S081 Lecture 8 – Page Fault 课堂笔记
课程主页:
https://pdos.csail.mit.edu/6.828/2021/schedule.html
对应视频:2020/2021 版 Lecture 7(Frans)或 Lecture 8(2021 版为 Q&A),下文统一按「Lecture 8」整理。
建议阅读:xv6 book §4.6「Page-fault exceptions」
1. 页故障(Page Fault)基础
-
触发条件
在XV6系统中,Page Fault只会发生在用户空间。
CPU 访问某虚拟地址时发现 PTE 无效或权限不符 → 抛出 page-fault exception。 -
硬件为 OS 提供的三要素[6]
- STVAL:触发故障的虚拟地址。
- SCAUSE:故障类型(13=读缺页,15=写缺页,12=指令缺页)。
- SEPC:触发指令的 PC,用于返回后重试。
-
处理入口
usertrap()
→r_scause()
判断为 page fault → 交给相应处理例程。
2. Lazy Allocation(按需分配)
Eager Allocation | Lazy Allocation |
---|---|
sbrk() 立即分配物理页 | 仅增加 p->sz ,不分配物理页 |
进程实际未用也占内存 | 真正访问时才 page-fault,再分配 |
易导致物理内存耗尽 | 显著节省内存,提高 fork +exec 效率 |
-
实现要点[1]
sbrk
只修改p->sz
。- 首次访问新 heap 区域 → page fault → 检查
va
位于[old_sz, new_sz)
之间。 kalloc
一页 → 清零 →mappages
建立映射 → 返回用户空间重新执行指令。- 若已无物理页可分配 → 直接杀死进程(lazy lab 简化处理)。
-
如何区分「合法未分配」与「非法地址」
低于当前p->sz
且高于 stack 视为合法 heap;否则视为段错误,杀死进程[1]。
3. Copy-on-Write Fork
-
动机
传统fork
立即复制父进程全部页 → 耗时且浪费内存。
COW 让父子进程共享所有物理页,但把对应 PTE 设为 只读。 -
工作流程[1]
fork
复制页表,但所有 PTE 清除PTE_W
、置 COW 标志(利用 PTE 的 RSW 位)。- 任一进程对共享页执行写操作 → 触发 page fault(写保护异常)。
- 内核识别 COW 位 →
kalloc
新页 → 拷贝旧页内容 → 更新子(或父)页表,使其 可写且私有 → 重新执行指令。 - 未修改页继续共享,显著减少内存占用。
-
PTE 标志位约定
RISC-V PTE 低 8 bit 外还有两位 RSW(supervisor usable)。
实验中用 RSW 第 8 位表示 “这是 COW 页”,区分普通只读页[1]。
4. Zero-fill-on-demand
对于分配未初始化变量的BSS段,由于它们的值都为0,因此它们的VA可以指向同一个数据都为0的PA(该PA设置为只读)。当有写操作写到该VA时,会触发Page fault,进而进行进一步处理。
5. 与后续实验/主题的衔接
Lab/主题 | 与 Page Fault 的关联 |
---|---|
Lab: traps (lazy allocation) | 实现上述 lazy allocation 机制。 |
Lab: cow (copy-on-write fork) | 实现 COW 的完整 fork 优化。 |
Lab: mmap | 用 page fault 惰性填充文件映射页,支持按需读/写文件页[3]。 |
后续 Lecture | Demand paging、Memory-mapped files、Page replacement 等进一步利用 page fault。 |
6. Memory-mapped files
Memory-mapped files(内存映射文件)是一种将文件内容直接映射到进程虚拟地址空间的技术,使应用程序可以像访问内存一样读写文件数据,无需传统read/write系统调用。
文件内容被映射到进程虚拟地址空间,程序通过指针直接读写文件数据,消除用户态与内核态的数据复制开销
6. 课堂 Q&A 精选
-
Q:如果物理内存耗尽怎么办?
A:简化版直接 kill 进程;真实 OS 可能 swap 或内存压缩。 -
Q:如何知道是 COW 还是普通写保护?
A:利用 PTE 的保留位做标记,page fault 时检查。 -
Q:父进程写共享页也会被 COW 吗?
A:是的,与进程身份无关,只要 PTE 为只读+COW 位。
6. 小结
- Page fault 是把「缺页或权限异常」转化为「内核机会」的核心机制。
- 通过 lazy allocation 与 copy-on-write,xv6 显著降低了内存占用与
fork
成本。 - 两个实验(lazy、cow)将课堂概念落地,并为后续 mmap、demand paging 奠定基础。