虚拟内存:概念
物理和虚拟寻址
- 物理寻址
- 物理地址 PA
- 主存被组织成一个由M个连续的字节大小的单元组成的数组
- 简单的寻址模式
- ( R )
- mem[reg[R]]
- D( R )
- mem[reg[R]+D]
- ( R )
- 虚拟寻址
- 虚拟地址 VA
- 地址翻译
地址空间
-
线性地址空间
- 地址空间中的整数是连续的
- 均假设是线性的
- 地址空间中的整数是连续的
-
虚拟地址空间
- N=2n
-
物理地址空间
- M=2m
虚拟内存作为缓存的工具
-
虚拟内存是存储在磁盘上的N个连续字节的数组
- 部分内容被缓存在DRAM中
-
页
- 虚拟页 VP
- 将虚拟内存分割为VP大小的块
- P=2p
- 虚拟页面有三种情况
- 未分配的
- VM系统还未分配的页,不占任何磁盘空间
- 缓存的
- 未缓存的
- 未分配的
- 物理页 PP
- 将物理内存分割为PP大小的块
- 大小也为P字节
- 虚拟页 VP
-
DRAM缓存是被大量的不命中开销驱动的
- DRAM缓存表示虚拟内存系统的缓存,它在主存中缓存虚拟页
- 虚拟页往往很大
- 一般是4KB
- linux 大页 2MB-1GB
- 一般是4KB
- 全相连
- 任何VP都可以放在任何PP中
- 极为复杂的替换算法
- 不在考虑范围
- 总是使用写回而不是直写
-
页表
- 页表条目(PTE)的数组
- 将虚拟页映射到物理页
- 虚拟地址空间的每个页在页表中一个固定偏移量的地方都有一个PTE
- PTE
- 有效位
- 表明该虚拟页是否被缓存在DRAM中
- n位地址字段
- 如果设置了有效位,地址字段表示DRAM中相应的物理页的起始位置
- 没有设置有效位
- 空地址表示未分配
- 未缓存则指向该虚拟页在磁盘上的起始位置
- 有效位
-
页命中
- VP2被缓存在DRAM中
- 访问VP2
- 地址翻译定位PTE2
- 检查设置了有效位
- 使用PTE中的物理内存地址
-
缺页
- DRAM缓存不命中
- 触发缺页异常
- 选择一个牺牲页
- 将未被缓存的VP缓存到牺牲页的位置并更新PTE
- 重启触发缺页异常的访问
- 命中
-
分配页面
- 在磁盘上创建空间并更新PTE
-
局部性原理
- 工作集
- 程序趋向于在一个较小的活动页面集合上工作
- 若工作集的大小超出了物理内存的大小,将产生抖动
- 性能急剧下降
- 工作集
虚拟内存作为内存管理的工具
-
每个进程有独立的虚拟地址空间
- 每个进程有独立的页表
-
VM简化链接
- 每个程序都有相似的虚拟地址空间
- 代码段、数据段、堆都从同样的地址开始
-
VM简化加载
- 为代码段和数据段分配虚拟页,把他们标记为未被缓存的
-
VM简化内存分配
- 程序要求额外的堆空间时
- 操作系统分配k个连续的虚拟内存页面并将它们映射到k个任意位置的物理页面
- 物理页面不需要连续
- 程序要求额外的堆空间时
虚拟内存作为内存保护的工具
- 在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问
地址翻译
-
N M P
-
n位的虚拟地址包括
- p位的虚拟页面偏移 VPO
- n-p位的虚拟页号 VPN
-
利用VPN选择适当的PTE
- 例如 VPN0选择PTE0,VPN1选择PTE1
-
将页表条目中的物理页号和虚拟地址中的VPO串联起来就得到了物理地址
-
由于PP和VP都是P字节所以PPO和VPO相同
-
页面命中
- CPU把虚拟地址发给MMU
- MMU通过虚拟地址生成PTE地址并请求
- 缓存/内存返回PTE
- MMU构造物理地址,并把它返回给缓存/内存
- 缓存/内存将数据返回给CPU
-
缺页
- 1-3步和命中一样
- 有效位为0,触发缺页异常
- 确定牺牲页,如果牺牲页在之前的操作中被修改过,则把它换出到磁盘
- 调入新的页面,更新PTE
- 返回到原来的进程,再次执行导致缺页的指令
-
利用TLB加速地址翻译
-
TLB是一个小的、虚拟寻址的缓存
- 每一行都保存着一个由单个PTE组成的块
-
匹配TLB的索引和标记来自VPN
- 如果TLB有T=2t个组,则TLB索引(TLBI)是由VPN的t个最低位组成的
- TLB标记(TLBT)是由VPN剩余的位构成
-
TLB命中
- CPU产生虚拟地址
- MMU从TLB取出对应PTE
- 根据PTE翻译出物理地址,发送给缓存/内存
- 缓存/内存将数据返回给CPU
-
TLB不命中
- 需从缓存中取出相应的PTE放在TLB中
- 很少见
-
-
多级页面
-
用单级页表会让页表的大小变得非常大
-
二级页表
- 一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的片
- 每一个片由1024个连续的页面组成
- 如果1024个页面均未分配则一级PTE i为空
- 若至少有一个页分配了,则一级PTE i指向一个二级页表的基地址
- 二级页表每个PTE负责映射一个4KB的虚拟内存页面
- 一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的片
-
k级页表地址翻译
- 虚拟地址被划分成k个VPN和一个VPO
- 每个VPN i是一个到第i级页表的索引
- 前k-1个页表,每个PTE都指向下一级的某个页表的基地址
- 第k级页表中每个PTE包含某个物理页面的PPN
-
地址翻译实例
酷睿i7/Linux内存系统
- linux使用的是4KB的页
- 酷睿i7采用四级页表层次结构
内存映射
- 将一个虚拟内存区域和一个磁盘的对象关联起来
- 虚拟内存可以映射到
- 文件系统中的普通文件
- 匿名文件
- 由内核创建的全是二进制0的文件
- 写时复制