当前位置: 首页 > news >正文

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]

    1. STVAL:触发故障的虚拟地址。
    2. SCAUSE:故障类型(13=读缺页,15=写缺页,12=指令缺页)。
    3. SEPC:触发指令的 PC,用于返回后重试。
  • 处理入口
    usertrap()r_scause() 判断为 page fault → 交给相应处理例程。
    Scause寄存器说明


2. Lazy Allocation(按需分配)

Eager AllocationLazy Allocation
sbrk() 立即分配物理页仅增加 p->sz,不分配物理页
进程实际未用也占内存真正访问时才 page-fault,再分配
易导致物理内存耗尽显著节省内存,提高 fork+exec 效率
  • 实现要点[1]

    1. sbrk 只修改 p->sz
    2. 首次访问新 heap 区域 → page fault → 检查 va 位于 [old_sz, new_sz) 之间。
    3. kalloc 一页 → 清零 → mappages 建立映射 → 返回用户空间重新执行指令。
    4. 若已无物理页可分配 → 直接杀死进程(lazy lab 简化处理)。
  • 如何区分「合法未分配」与「非法地址」
    低于当前 p->sz 且高于 stack 视为合法 heap;否则视为段错误,杀死进程[1]。


3. Copy-on-Write Fork

  • 动机
    传统 fork 立即复制父进程全部页 → 耗时且浪费内存。
    COW 让父子进程共享所有物理页,但把对应 PTE 设为 只读

  • 工作流程[1]

    1. fork 复制页表,但所有 PTE 清除 PTE_W、置 COW 标志(利用 PTE 的 RSW 位)。
    2. 任一进程对共享页执行写操作 → 触发 page fault(写保护异常)。
    3. 内核识别 COW 位 → kalloc 新页 → 拷贝旧页内容 → 更新子(或父)页表,使其 可写且私有 → 重新执行指令。
    4. 未修改页继续共享,显著减少内存占用。
  • 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]。
后续 LectureDemand 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. 小结

  1. Page fault 是把「缺页或权限异常」转化为「内核机会」的核心机制。
  2. 通过 lazy allocation 与 copy-on-write,xv6 显著降低了内存占用与 fork 成本。
  3. 两个实验(lazy、cow)将课堂概念落地,并为后续 mmap、demand paging 奠定基础。
http://www.lryc.cn/news/615985.html

相关文章:

  • 使用 Python 进行图片识别的项目开发
  • git merge和git rebase的区别
  • MIRO中文本如何传入FI凭证的
  • 基于Spring SSE构建实时监控系统
  • SpringCloud详细笔记
  • es-drager-blog
  • Java 日常开发笔记(小程序页面交互传参-id)
  • 震动马达实现库函数版(STC8)
  • 升级 JDK 17 碰到的请求 https 问题
  • 如何在Python中使用flask框架搭建web服务?
  • org.apache.hadoop.hbase.TableNotFoundException: ApplicationIndex
  • C/C++类型转换(C++四大强制类型转换)
  • 6.3 完成 RAG
  • TSF应用开发与运维部署
  • 下载UOS桌面专业版系统镜像
  • 强制类型转换
  • [TryHackMe]OverPass2(流量包分析+sha256+suid提权)
  • 【Vue✨】Vue3 中英文切换功能实现
  • 计算机网络:如何理解目的网络不再是一个完整的分类网络
  • RAG技术与应用
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘optuna’问题
  • Linux环境下实现简单TCP通信(c)
  • TypeScript 中的as const是什么?
  • Shell脚本-变量的分类
  • 从零到精通:嵌入式BLE开发实战指南
  • Spring Boot 全局异常处理与日志监控实战
  • go加速配置(下载第三方库)
  • 元数据管理与数据治理平台:Apache Atlas 通知和业务元数据 Notifications And Business Metadata
  • 《Go小技巧易错点100例》第三十七篇
  • 元数据管理与数据治理平台:Apache Atlas 分类传播 Classification Propagation