虚拟内存作为内存管理的工具
每个进程有独立的虚拟地址空间
每个进程有独立的页表
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的虚拟内存页面
k级页表地址翻译
虚拟地址被划分成k个VPN和一个VPO
每个VPN i是一个到第i级页表的索引
前k-1个页表,每个PTE都指向下一级的某个页表的基地址
第k级页表中每个PTE包含某个物理页面的PPN |