存储之虚拟内存
寻址方式
主存:由M个连续的字节大小的单元组成的数组。每个字节单元都有一个唯一的物理地址(Physical Address,PA)
物理寻址:CPU将想要访问的物理地址通过内存总线发送给主存,主存取出该地址处的数据,并返回给CPU
虚拟寻址:CPU生成的是虚拟地址(Virtual Address,VA),内存管理单元(Memory Management Unit,MMU)利用存放在主存中的查询表(即页表,由操作系统管理)将VA翻译成PA,所以该过程需要硬件与OS的紧密合作
地址空间
物理地址空间:\(\left \{ 0,1,...,M-1 \right \}\)
虚拟地址空间:假设系统为n位(32或64),\(\left \{ 0,1,...,2^n-1 \right \}\)
虚拟内存与物理内存的映射
考虑:虚拟内存是在磁盘上,物理内存即真实的主存,那么如何将虚拟内存中的数据缓存到物理内存中呢?
虚拟内存系统将虚拟内存分割为大小为P的虚拟页(Virtual Page,VP),类似地,物理内存被分割为大小为P的物理页(Physical Page,PP),也称为页帧(page frame)。
任意一个VP可能有三种状态:
- 未分配:VM系统还没有创建的页,所以不占用磁盘空间。
- 未缓存:已经分配,仍在磁盘中,没有缓存到物理内存。
- 已缓存:已经缓存到物理内存中,磁盘和主存中均存在。

比如在上图中,VP0和VP3还没有被分配。VP2、VP5和VP7已经分配,但是还没有缓存到主存中。VP1、VP4和VP6已经缓存在主存中。
SRAM缓存通常指cache,DRAM缓存通常指虚拟系统的缓存。由于磁盘要比DRAM慢10万多倍,并且从磁盘的一个扇区读取第一个字节非常耗时,DRAM缓存的不命中非常昂贵,所以具有以下特点:
- 虚拟页很大,通常是4KB~2MB。
- DRAM缓存是全相联的,即任何虚拟页都可以放置在任何的物理页中。
- 操作系统为DRAM缓存不命中提供了复杂精密的替换策略。
- DRAM缓存总是使用写回,而不是直写。
页表(page table)
虚拟内存系统如何确定虚拟页是否缓存以及缓存在哪个物理页中呢?
页表:存放在物理内存中的数据结构,将虚拟页映射到物理页。每次MMU将VA转换为PA时,都会读取页表。操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页。
页表就是一个页表条目(Page Table Entry,PTE)的数组,每个PTE包含一个有效位和一个n位的地址字段。n=0表示未缓存,地址字段为空表示未分配,地址非空时表示地址为该虚拟页在磁盘上的起始位置。n=1表示已缓存,地址字段表示主存中物理页的起始地址。

如上图中,一共有8个虚拟页,4个物理页,VP0和VP5还没有被分配,VP1、VP2、VP4和VP7已经被缓存在主存中,VP3和VP6已经分配但未被缓存。
缺页


页面分配
使用malloc,VP5的分配过程就是在磁盘上创建空间并更新PTE5

地址翻译过程
TLB(翻译后备缓冲器):MMU的一部分,加快VA到PA的转换速度...
无TLB时的地址翻译过程:

有TLB时的地址翻译过程:


浙公网安备 33010602011771号