虚拟内存
- 虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,为每个进程提供一个大的、一致的、私有的地址空间
- 虚拟内存的三个能力:
- 将主存看成是存储在磁盘上的地址空间的高速缓存,在主存中保留只保留活动区域,根据需要在主存和磁盘之间来回传送数据
- 为每个进程提供一致的地址空间,简化内存管理
- 保护每个进程的地址空间不被其他进程破坏
- 计算机内存被组织成M个连续的字节大小的单元组成的数组,每个字节都有一个唯一的物理地址,使用物理地址访问内存称为物理寻址
- 虚拟寻址,CPU生成一个虚拟地址(Virtual Address,VA)来访问内存,这个虚拟地址在被传送到内存之前,先转换为物理地址
- 将一个虚拟地址转换成为物理地址的过程称为地址翻译
- CPU芯片上的内存管理单元,利用存放在主存中的查询表来翻译虚拟地址,该表的内容由操作系统管理
- 地址空间是非负整数地址的有序集合:{0,1,2,3,…},如果地址空间的整数是连续的,我们可以成之为线性地址空间,假设使用的是线性地址空间,在一个带虚拟内存的系统中,CPU从一个有N=2^n-1个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间:{0,1,2,…,N-1},称为n位地址空间
- 系统的物理地址空间对应物理内存的M个字节:{0,1,2,3,…,M-1}
- 允许每个对象有多个独立的地址,每个地址都来自不同的地址空间
- 在任何时刻,虚拟内存被分为三个互不相交的子集:未分配的、缓存的、未缓存的
- DRAM缓存组织:因为对磁盘访问时间都很长,DRAM缓存通常使用写回而不是直写
- 虚拟内存作为内存保护工具
- 在PTE上添加额外的许可位来控制对一个虚拟页面内容的访问
- SUP表示进程必须运行在内核模式下才能访问该页,READ和WRITE控制页面的读写。如果违反许可条件会处罚保护故障,”段错误“
- 虚拟内存作为内存管理的工具
- 操作系统通常为每个进程都提供一个独立的页表,有一个独立的虚拟地址空间,多个虚拟页面可以映射到同一个共享物理页面上
- VM简化了链接和加载、代码和数据共享,以及应用程序的内存分配
- 简化链接:独立的地址空间允许每个进程的内存映像使用相同的基本格式,简化了连接器的设计和实现,允许链接器生成完全连接的可执行文件
- 简化加载:容易向内存中加载可执行文件和共享对象文件。将一组连续的虚拟也映射到任意一个文件中的任意位置的表示法称为内存映射,Linux提供mmp系统调用,允许应用程序自己做内存映射
- 简化共享:操作系统将不同进程中的适当的虚拟页面映射到相同的物理页面
- 简化内存分配:当一个运行在用户进程中的程序要求额外的堆空间时,操作系统分配一个适当数字个连续的虚拟内存页面,页面可以随机的分散在物理内存中
页
- MMU(内存管理单元)中的地址翻译硬件和一个存放在物理内存中叫做页表的数据结构,判断虚拟页是否缓存在DRAM的某个地方及之后的措施,这个功能是由软硬件联合提供的,包括操作系统软件
- 页表将虚拟页映射到物理页,每次地址翻译器将虚拟地址转换为物理地址时都会读取页表,操作系统负责维护页表的内容,以及磁盘与DRAM之间来回传送页
- 虚拟空间中每个页在页表中的一个固定偏移量处都有一个PTE,PTE由一个有效位和n位地址字符串组成,有效位表明虚拟页是否被缓存在DRAM中。
- 如果设置了有效位,地址字段就表示DRAM中相应的物理页的起始位置
- 如果没有设置有效位,空地址表示虚拟页还没被分配
- 页面命中,使用PTE中的物理内存地址构造出这个字的物理地址
- 处理器生成一个虚拟地址,传送给MMU
- MMU生成一个PTE地址,并从高速缓存/主存请求得到它
- 高速缓存/主存向MMU返回PTE
- MMU构造物理地址,传送给高速缓存/主存
- 高速缓存/主存返回请求的数据字给处理器
- DRAM缓存不命中称为缺页,缺页异常调用内核中的缺页异常处理程序,程序会选择一个牺牲页VP4,把它复制回磁盘,修改页表条目,然后从磁盘中复制VP3,复制VP3到内存中的PP3,更新PTE3,再次调用导致缺页的指令
- 缺页,硬件和操作系统内核一起完成**
- 处理器生成一个虚拟地址,传送给MMU
- MMU生成一个PTE地址,并从高速缓存/主存请求得到它
- 高速缓存/主存向MMU返回PTE
- PTE中有效位是0,触发异常,传递到缺页异常处理程序
- 缺页处理程序确定物理内存牺牲页,如果页面已经被修改了,换出到磁盘
- 缺页处理程序页面调入新的页面,更新内存的PTE
- 缺页处理程序返回到原来的进程,再次执行导致缺页的指令
- 磁盘和内存之间的传送页的活动叫做交换或者页面调度,当有不命中发生时,才换入页面这种策略称为按需页面调度,现代计算机系统都使用按需调度
- 局部性原则保证在任意时刻,程序趋向于在一个较小的活动页面集合上工作,这个集合称为工作集或者是常驻集合。良好的局部性保证虚拟内存系统能够工作的很好
地址翻译
- CPU中的一个控制寄存器(Page Table Base Register,PTBR)指向当前页表
- n位虚拟内存包含两个部分:一个p位的虚拟页面偏移(virtual page offset,VPO)和一个n-p位的虚拟页号(virtual page number,VPN)
- MMU利用VPN来选择适当的PTE,将页表条目中的物理页号和虚拟地址中的VPO串联起来,得到相应的物理地址
- 物理页面偏移(PPO)和VPO是相同的
利用TLB加速地址翻译
- MMU包括一个关于PTE的小的缓存,称为翻译后备缓冲器,每行都保存着单个PTE组成的块。
- TLB每一行都保存着单个PTE组成的块。
- 用于组匹配和行匹配的索引和标记字节是从虚拟地址中的虚拟页号中提取出来的。
- TLB索引位和标记位组成了VPN
- TLB命中时包含的步骤:
- CPU产生虚拟地址
- MMU从TLB中取出相应的PTE
- MMU将这个地址翻译成一个物理地址,并发送到高速缓存和主存
- 高速缓存和主存讲请求的字节返回CPU
- TLB不明中时,MMU必须从L1缓存中取出相应的PTE,新取出的PTE存放在TLB中,可能会覆盖一个已经存在的条目