![8cec079c534157d94a918f94732a6f5a.png](https://img-blog.csdnimg.cn/img_convert/8cec079c534157d94a918f94732a6f5a.png)
一、物理和虚拟寻址
![76f2ed2d76004bdd0c88a53802488658.png](https://img-blog.csdnimg.cn/img_convert/76f2ed2d76004bdd0c88a53802488658.png)
早期的PC使用物理寻址,现代处理器使用虚拟寻址。
![9ee7d667f6ae383acfbb93d2df0d72d5.png](https://img-blog.csdnimg.cn/img_convert/9ee7d667f6ae383acfbb93d2df0d72d5.png)
CPU芯片上叫做内存管理单元(MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
二、地址空间
地址空间是一个非负整数地址的有序集合:
- 虚拟地址空间
- 物理地址空间 —— 对应于系统中实际拥有的DRAM容量
主存中的每字节都有一个选自虚拟地址空间的虚拟地址和选自物理地址空间的物理地址。
三、虚拟内存
虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址。
VM系统将虚拟内存(磁盘)分割为虚拟页(Virtual Page, VP),物理内存(DRAM)被分割为物理页(Physical Page, PP)。
虚拟页可以分为:
- 未分配的 —— 还没有和磁盘中的某个磁盘空间建立对应关系
- 缓存的 —— 虚拟页中的数据已缓存到物理内存
- 未缓存的 —— 虚拟页中的数据还未缓存到物理内存
3.1、DRAM缓存的组织结构
由于访问磁盘的开销很大(磁盘比DRAM慢大约100000多倍),所以DRAM缓存不命中的开销很大。所以虚拟内存的特征:
- 虚拟页往往很大,通常是4KB~2MB。
- DRAM缓存是全关联的,即任何虚拟页都可以放置在任何的物理页中。
- DRAM缓存不会直写回磁盘,它会尽可能将写回磁盘的操作延迟。
3.2、页表
操作系统软件、MMU(内存管理单元)中的地址翻译硬件和存放在物理内存中的页表联合提供虚拟内存的逻辑操作机制(是否页命中、如何替换牺牲页等等)。
页表将虚拟页映射到物理页,每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。
页表就是一个页表条目(Page Table Entry, PTE)的数组。
![e9aca23a37069d18fe1841bb0b49d338.png](https://img-blog.csdnimg.cn/img_convert/e9aca23a37069d18fe1841bb0b49d338.png)
3.3、页命中
地址翻译硬件将虚拟地址作为一个索引来定位PTE,并根据有效位判断是否页命中(虚拟页的数据是否缓存到物理内存中)。如果页命中则从相应PTE中读取物理内存地址。
3.4、缺页
页不命中称为缺页,此时会触发一个缺页异常,缺页异常调用内核中的缺页异常处理程序。(异常控制流机制-故障)
异常处理程序将对应的虚拟页复制到物理内存中的牺牲页(按需页面调度),随后重新启动导致缺页的指令(返回到当前指令),此时页命中。
3.5、分配页面
调用malloc产生的底层操作是在磁盘中分配虚拟页,并更新页表中对应的PTE。
3.6、局部性
局部性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面集合上工作,这个集合叫做工作集。
如果工作集的大小超出了物理内存的大小,那么这时页面将不断地自DRAM换进换出(抖动),导致程序性能下降。
四、虚拟内存作为内存管理的工具
操作系统为每个进程提供了一个独立的页表,以此来为每个进程提供一个独立的虚拟地址空间。因此每个进程都使用相同的内存映像格式。
![574d550f8227c22407e7521c3115a978.png](https://img-blog.csdnimg.cn/img_convert/574d550f8227c22407e7521c3115a978.png)
多个虚拟页面可以映射到同一个共享物理页面上。
VM简化了链接和加载、代码和数据共享,以及应用程序的内存分配:
- 简化链接 —— 由于地址空间的一致性,所以允许链接器生成完全链接的可执行文件,这些可执行文件是独立于物理内存中代码和数据的最终位置的。
- 简化加载 —— 使得容易向内存中加载可执行文件和共享对象文件。
- 简化共享 —— 操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个副本,而不是在每个进程中都包括单独的内核和C标准库的副本。
- 简化内存分配 —— 操作系统没有必要分配k个连续的物理页面,页面可以随机地分散在物理内存中。
五、虚拟内存作为内存保护的工具
用户进程对虚拟地址空间中的数据读写有权限约束:
- 不能修改只读代码段
- 不能读、写内核的代码
- 不能读、写其他进程的私有内存
- 不能修改与其他进程共享的虚拟页面,除非所有共享者显式地允许它这么做(进程间通信)
内部进制是通过在PTE上添加额外的许可位来实现读、写的权限约束。
![1cf1ad3bb349606ff8d4e3f7fac22b45.png](https://img-blog.csdnimg.cn/img_convert/1cf1ad3bb349606ff8d4e3f7fac22b45.png)
- SUP位表示进程是否必须运行在内核(超级用户)模式下才能访问该页。
- READ位和WRITE位控制对页面的读和写访问。
六、地址翻译
![f14e3d4cb318566cddf25c3bb440c6c7.png](https://img-blog.csdnimg.cn/img_convert/f14e3d4cb318566cddf25c3bb440c6c7.png)
地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射:
![9ee8ae45c5e4c387148612cdeff5caa0.png](https://img-blog.csdnimg.cn/img_convert/9ee8ae45c5e4c387148612cdeff5caa0.png)
![769ed4a7ff3babc43f59d6db6b3c38d1.png](https://img-blog.csdnimg.cn/img_convert/769ed4a7ff3babc43f59d6db6b3c38d1.png)
页表基址寄存器(Page Table Base Register,PTBR)指向当前页表。
通过虚拟页号(Virtual Page Number,VPN)找寻对应的物理页号(Physical Page Number,PPN)。
虚拟页面偏移(Virtual Page Offset,VPO)和物理页面偏移(Physical Page Offset,PPO)是相同的。
物理地址是由物理页号和虚拟页面偏移串联起来得到的。
1)页面命中时,执行的步骤(完全由硬件来处理):
![413786b47dd09a7774a9721cb24ea51f.png](https://img-blog.csdnimg.cn/img_convert/413786b47dd09a7774a9721cb24ea51f.png)
2)缺页时,执行的步骤(硬件和操作系统内核协作完成):
![adb0c3092a9a2faa5bcd623a1fa8fa31.png](https://img-blog.csdnimg.cn/img_convert/adb0c3092a9a2faa5bcd623a1fa8fa31.png)
6.1、结合高速缓存和虚拟内存
大多数系统使用物理寻址来访问SRAM高速缓存。
高速缓存无需处理保护问题,因为访问权限的检查是地址翻译过程的一部分。
![db570073a526b229000f9ca03e1445a3.png](https://img-blog.csdnimg.cn/img_convert/db570073a526b229000f9ca03e1445a3.png)
6.2、利用TLB加速地址翻译
MMU中包括了一个关于PTE的小的缓存,称为翻译后备缓冲器(Translation Lookaside Buffer, TLB)。
TLB是一个用于缓存PTE的设备,其中每一行都保存着一个由单个PTE组成的块。
![018bf2969fc6bdbce3eacd3dfe601e94.png](https://img-blog.csdnimg.cn/img_convert/018bf2969fc6bdbce3eacd3dfe601e94.png)
从虚拟页号中提取用于与TLB构成映射的信息:
- TLB索引(TLBI) —— 组选择或者集合选择,有
个组或集合。
- TLB标记(TLBT) —— 行匹配
在TLB中命中PTE和没有命中PTE时执行的步骤:
![da97ac3ca6aca55723422d6a11d8addb.png](https://img-blog.csdnimg.cn/img_convert/da97ac3ca6aca55723422d6a11d8addb.png)
6.3、多级页表
使用一个单独的页表来进行地址翻译,会导致页表非常大,因此通常使用层次结构的页表(多级页表)。
![47684de794ca81fafd16226b51c84f99.png](https://img-blog.csdnimg.cn/img_convert/47684de794ca81fafd16226b51c84f99.png)
多级页表相当于树结构,它从两个方面减少了内存要求:
- 如果一级页表中的一个PTE是空的,相应的二级页表就不会存在
- 只有一级页表才需要总是在主存中。虚拟内存系统可以在需要时创建、页面调入或调出二级页表。
通过将不同层次上页表的PTE缓存起来,使得带多级页表的地址翻译并不比单级页表慢很多。