当前位置:网站首页>[MIT 6.S081] Lec 8: Page faults 笔记
[MIT 6.S081] Lec 8: Page faults 笔记
2022-07-27 16:09:00 【PeakCrosser】
Lec 8: Page faults
- Ref: https://github.com/huihongxiao/MIT6.S081/tree/master/lec08-page-faults-frans
- Preparation: xv6 book Chapter 4 Section 4.6
Page fault 概述
Features using page faults
- lazy allocation, 懒分配
- COW, copy-on-write fork, 写时复制
- demand paging, 按需调页
- memory mapped files, mmp, 内存映射文件
虚拟内存的优点
- Isolation, 隔离性. 内核与应用程序, 应用程序之间的地址空间隔离.
- level of indirection, 间接性, 抽象. 虚拟地址到物理地址的映射.
- trampoline page: 一个物理地址映射到多个用户地址空间
- guard page: 在内核空间和用户空间保护栈, 无映射的物理地址
内核响应 page fault 所需的信息
- the faulting va 出错的虚拟地址, 即触发 page fault 的源. XV6 出现 page fault 时会将出错的虚拟地址保存到 STVAL 寄存器中.
- the type of page fault 出错的类型. SCAUSE 寄存器(保存了 trap 进入内核模式时的原因)中有多个原因与 page fault 相关: 读, 写, 指令. page fault 同样使用 trap 机制由用户空间切换到内核空间, 会设置 STVAL 寄存器和 SCAUSE 寄存器.
- the va of instruction that caused the fault 触发错误的指令地址. 作为 trap 处理代码的一部分, 会保存在 SEPC 寄存器和
trapframe->epc中.
Lazy Allocation
- XV6 中通过
sbrk()函数来增加或减少内存地址空间, 操作的是堆上的地址空间, 以p->sz(堆与栈分界线)为起点 - XV6 中默认为 eager allocation(饥饿分配), 一旦调用内核立刻会分配物理内存. 即便有些内存从未使用也会分配, 会造成内存浪费.
- lazy allocation.
sbrk()不实际分配物理内存而只提升p->sz + n(n为增加的字节). 通过触发 page fault 再实际分配物理内存(分配 1 page -> 将 page 内容置零 -> 映射到用户页表 -> 重新执行指令). 在释放进程页表时同时也要考虑对未实际分配的虚拟内存应该跳过处理.
Zero Fill On Demand
用户程序地址空间
用户程序地址空间有: text , 存放指令; data 数据段, 存放初始化的全局(静态)变量; BSS 段, 存放未初始化或初始化为 0 的全局(静态)变量.
BSS 按需填零
对于 BSS 段, 由于其初始值均为 0, 因此不需要为其实际分配物理内存而是记住其初值为 0 即可.
因此对于 BSS 段, 不论其虚拟地址占多少虚拟页, 只实际分配一个内容全为 0 的物理页, 让所有虚拟页都映射到该物理页.
该全 0 物理页只读, 在对其中变量写操作时会触发 page fault, 会重新分配一个可读可写的新物理页, 设置初值为 0, 并执行写操作.
按需填零优缺点
- 优点
- 类似 lazy allocation, 节省内存.
- 使
exec所需要做的工作变少, 使得程序启动更快.
- 缺点
- 只是将一些内存分配操作推迟到了处理 page fault 时, 而由于会触发 trap 进入内核, 因此会有额外的存储开销和性能开销.
Copy-On-Write fork
考虑到 fork() 后可能又会调用 exec() 加载行的程序, 会释放创建的子进程的内存.
因此 fork() 时不是为子进程分配物理内存并拷贝父进程的地址空间的内容; 而是让子进程共享父进程的物理内存, 将子进程的 PTE 执行父进程对应的物理内存页.
初始时需要将父子进程的 PTE 均设为只读, 一旦二者之一要修改内存内容时便引发 page fault, 分配给子进程新的物理内存页, 将相关虚拟页拷贝到物理页中, 并且此时新旧 PTE 都分别变为对父进程或子进程可读可写.
引发 page fault 时, 内核要能区分当前向只读内存写操作是写时复制的场景. 一般需要硬件的支持, XV6 中 PTE 有 2 位保留位, 内核可以使用其中一位作为 COW 标志位.
由于 COW 情景下, 物理内存可能对应多个进程的虚拟内存, 所有进程退出时不能直接将其虚拟内存对应的物理内存直接释放, 而是要判断当前物理内存是否没有其它进程使用. 因此需要对物理页进行引用计数, 释放虚拟页时物理页引用计数减 1, 仅当引用计数为 0 时才实际释放物理页.
Demand Paging
应用程序的 text 代码段, data 数据段可能很大, 没有必要开始时就为其分配足够的物理内存; 而是仅分配虚拟地址, 其相应的 PTE 无效, 不对应物理地址.
当运行程序命令时, 会引发 page fault, 此时在为其分配物理地址, 从程序文件中读取代码或数据, 然后映射到用户进程页表, 最后再重新执行指令.
对于未使用的数据段或代码段则不会为其分配实际物理内存.
内存耗尽的解决方法: 撤回部分物理页, 将其内容写回文件系统, 释放当前物理页. 一般会采用 LRU 等页面淘汰策略. 对于脏页(dirty-page)和非脏页(non-dirty page), 一般选择非脏页, 因为脏页之后再被修改则需要对该页面进行 2 次操作, 一次是当前修改的内容写入文件, 另一次是再次修改时重新加载页面到内存. 而非脏页只需要将当前页面的 PTE 标记为无效即可, 无需写回内存, 而重复使用时再重新从文件中加载到内存即可.
PTE 中有 D 标记位表示对应页面是否是脏页(被写过). 有 A 标记位(Access bit)表示当前页面是否被读或被写过, 需要定时的对 A 标记为进行清零, 据此来计算内存页在 LRU 中的排名.
Memory Mapped Files
将完整或部分文件加载到内存中, 通过对内存相关地址的读写来操作文件.
一般操作系统会提供 mmap 系统调用. 该系统调用会接受虚拟地址(va), 长度(len), protection, 一些标志位(flags), 打开的文件描述符(fd)和偏移量(offset). 从 fd 对应的文件的 offset 位置开始, 映射长度为 len 的内容到虚拟地址 va, 同时加上一些 protection, 如只读或读写.
一般文件都是懒加载, 通过 Virtual Memory Area, VMA结构记录相关信息. 通过 page fault 将实际文件内容映射到内存; 通过 unmap 系统调用将文件映射的脏页写回文件.
边栏推荐
- Profiles vs Permission Sets
- Find redundant duplicate records in the table, delete and retain the minimum one
- @Convert 注解在jpa中进行查询的注意事项
- 力压谷歌、英伟达!阿里含光800芯片再获权威测试世界第一
- 英特尔发布新一代Movidius VPU:性能提升10倍,功耗仅30W
- 【学习笔记】MySQL数据库高级版 - 索引优化、慢查询、锁机制等
- Jianan Yunzhi has completed the pre roadshow and is expected to land on NASDAQ on November 20
- @DateTimeFormat 接收不到时分秒,转换时报类型异常
- Super practical! After reading the kubernetes study notes hidden by Alibaba P9, call NB directly
- Backup table recovery table
猜你喜欢

Super practical! After reading the kubernetes study notes hidden by Alibaba P9, call NB directly

Getting started with typora: the most complete tutorial in the whole network

深度学习-视频行为识别:论文阅读——双流网络(Two-stream convolutional networks for action recognition in videos)

多表查询

EF框架简介

登录页面tableLayout(表格布局)

查看端口PID及结束进程

Salesforce runs all test classes and gets coverage reports

How do corporate giants such as Schneider Electric and L'Oreal make open innovation? Uncover secrets of demo World Innovation Summit

Introduction to ef framework
随机推荐
Salesforce runs all test classes and gets coverage reports
3. opencv几何变换
Backup table recovery table
You can't specify target table 'table name' for update in from clause error resolution in MySQL
图形界面编程
荣耀、小米发双十一战报:都称自己是冠军
Multi thread implementation loop
EF框架简介
CFA exam registration instructions
IDEA打包war包与war包位置
英特尔发布新一代Movidius VPU:性能提升10倍,功耗仅30W
vue使用keep-alive实现页面缓存
VSS tip: search all checked out files (search checked out files according to users)
XStream reports an error abstractreflectionconverter$unknownfield exception when parsing XML
Deep learning: Gan case exercise -minst handwritten digits
【云图说】 第249期 移动应用安全服务—App的体检中心,全面检测,安全上路!
江苏华存首发PCIe 5.0 SSD主控:台积电12nm工艺,2020年量产
Marvell公布旗下Arm服务器芯片路线图,下一代性能将比ThunderX2高两倍
SQL Server连接到服务器无效的解决办法
【学习笔记】数据库中锁的分类