文章目录
- 地址空间
- 虚拟内存作用:缓存工具
- 虚拟内存作用:内存管理工具
- 虚拟内存作用:内存保护工具
- 地址转换
-
- 虚拟内存地址翻译
- 地址翻译:页命中
- 地址翻译:缺页处理
- 虚拟内存与缓存的集成
-
- [TLB 访问机制](#TLB 访问机制)
- [TLB 命中](#TLB 命中)
- [TLB 未命中](#TLB 未命中)
- 多级页表
- 简单内存系统

- 多个进程共享系统资源的场景,如何实现各进程独立访问内存?解决方案:虚拟内存。
地址空间
- 虚拟寻址系统系统结构:CPU生成虚拟地址(VA),内存管理单元(MMU)将其转换为物理地址(PA),主存存储实际数据。

- 地址空间可以分为:线性空间、虚拟空间、物理空间。
- 线性地址空间:连续非负整数地址集合: 0 , 1 , 2 , 3 ... {0, 1, 2, 3...} 0,1,2,3...
- 虚拟地址空间:包含 N = 2 n N = 2^n N=2n个虚拟地址的集合: 0 , 1 , 2 , ... , N − 1 {0, 1, 2, ..., N−1} 0,1,2,...,N−1
- 物理地址空间:包含 M = 2 m M = 2^m M=2m个物理地址的集合: 0 , 1 , 2 , ... , M − 1 {0, 1, 2, ..., M−1} 0,1,2,...,M−1
- 虚拟内存具有如下优势:
- 提高内存利用率:使用DRAM作为虚拟地址空间部分区域的缓存。
- 简化内存管理:每个进程拥有相同的统一线性地址空间。
- 实现地址空间隔离:防止一个进程干扰另一个进程的内存,用户程序无法访问特权内核信息和代码。
虚拟内存作用:缓存工具
- 虚拟内存模型概念上,虚拟内存是存储在磁盘上的N字节连续数组。其内容被缓存在物理内存(DRAM)中,缓存块称为"页"(Page),大小通常为 P = 2 p P = 2^p P=2p 字节。
- 虚拟页(VP)存储于磁盘
- 物理页(PP)缓存在DRAM中
- 分类状态:未分配、已缓存、未缓存

DRAM缓存组织特点
- 大页面尺寸:通常为4KB
- Linux支持"巨页"(Huge Pages):默认2MB,最大可达1GB
- 全相联结构:任意虚拟页可映射到任意物理页
- 映射函数复杂,不同于普通缓存
- 使用高级复杂的替换算法
- 替换逻辑过于复杂,难以完全硬件实现,采用写回策略而非写直达。
支持数据结构:页表
- 页表功能,由页表项(PTE)组成的数组,用于映射虚拟页到物理页。属于每个进程的内核数据结构,驻留在DRAM中。
- 结构组成:每个页表项包含物理页号或磁盘地址,标记位指示页面是否有效(在内存中)。

页面命中
- 页面命中:对虚拟内存中已在物理内存中的字的引用(即DRAM缓存命中)。
- 页面查找流程
- 内存管理单元(MMU)根据虚拟地址查找页表。
- 若对应页表项(PTE)有效且指向物理页,则发生命中。
- 直接访问物理内存完成读写操作。

缺页异常
- 缺页异常:对尚未加载到物理内存中的虚拟内存字的引用(即DRAM缓存未命中)。
- 触发条件:用户访问当前位于磁盘上的内存页,MMU检测到无效PTE,触发缺页异常。

- 异常产生流程:用户代码尝试写入某个内存位置,该内存所在页当前驻留在磁盘,MMU触发缺页异常,切换至监督模式(内核态),调用软件缺页处理程序。

缺页异常处理
- 异常响应:缺页导致异常中断,页面错误处理程序启动。
- 选择牺牲页:页面错误处理程序选定一个待淘汰的页(如VP 4)。
- 页面置换:将目标虚拟页(如VP 3)从磁盘调入空闲物理页,更新页表项(PTE)使其指向新的物理页,设置有效位。
- 恢复执行:重新执行引发异常的指令,此次访问将命中缓存(页面已在内存)。
- 完成缺页处理,返回用户态:页面错误处理程序执行中断返回指令(iret),类似于ret指令,同时恢复特权级别,控制权交还给引发故障的指令,再次执行时不再发生缺页。

- 异常响应:缺页导致异常中断,页面错误处理程序启动。

- 选择牺牲页:页面错误处理程序选定一个待淘汰的页(如VP 4)。
- 页面置换:将目标虚拟页(如VP 3)从磁盘调入空闲物理页,更新页表项(PTE)使其指向新的物理页,设置有效位。


- 恢复执行:重新执行引发异常的指令,此次访问将命中缓存(页面已在内存)。

- 完成缺页处理,返回用户态:页面错误处理程序执行中断返回指令(iret),类似于ret指令,同时恢复特权级别,控制权交还给引发故障的指令,再次执行时不再发生缺页。
c
int a[1000];
main ()
{
a[500] = 13;
}

分配新页面
- 新页面分配:为虚拟内存分配一个新的虚拟页(如VP 5),在页表中创建对应PTE,初始标记为无效,后续访问将触发缺页,从而将其加载进内存。

虚拟内存的性能
- 尽管虚拟内存看似低效,但得益于局部性原理得以高效运行。
- 任一时刻程序倾向于访问一组活跃的虚拟页,称为"工作集"。时间局部性越强,工作集越小。
- 性能影响因素
- 若工作集大小 < 主存容量 → 单进程性能良好(冷启动缺页后)
- 若工作集大小 > 主存容量 → 出现"抖动"(Thrashing):页面频繁换入换出
- 多进程环境下,若总工作集 > 主存容量 → 同样导致抖动
虚拟内存作用:内存管理工具
- 核心理念:每个进程拥有独立的虚拟地址空间,进程可将内存视为简单的线性数组,映射函数将虚拟地址分散到物理内存中,合理的映射策略可提升局部性。
- 地址转换:不同进程的虚拟地址空间可映射到不同或相同的物理页,支持共享只读库代码等场景。

- 内存管理优势:简化内存分配和多进程间共享。
- 简化内存分配:每个虚拟页可映射到任意物理页,同一虚拟页可在不同时刻映射到不同物理页。
- 进程间共享:多个进程可通过映射同一物理页实现代码与数据共享(如PP 6)。
虚拟内存作用:内存保护工具
- 权限控制机制:扩展PTE以包含权限位,MMU在每次内存访问时检查这些权限。
- 权限位说明
| 权限 | 说明 |
|---|---|
| READ | 允许读取 |
| WRITE | 允许写入 |
| EXEC | 允许执行 |
| SUP | 需要内核模式(超级用户权限) |

地址转换
虚拟内存地址翻译
虚拟与物理地址空间
- 虚拟地址空间 V = 0 , 1 , ... , N -- 1 V = {0, 1, ..., N--1} V=0,1,...,N--1
- 物理地址空间 P = 0 , 1 , ... , M -- 1 P = {0, 1, ..., M--1} P=0,1,...,M--1
- 映射函数 M A P : V → P ∪ ∅ MAP: V → P ∪ {∅} MAP:V→P∪∅
- M A P ( a ) = a ' MAP(a) = a' MAP(a)=a'表示虚拟地址 a 的数据位于物理地址 a ' a' a'
- M A P ( a ) = ∅ MAP(a) = ∅ MAP(a)=∅ 表示数据不在物理内存中(无效或在磁盘上)
基本参数
- N = 2 n N = 2^n N=2n:虚拟地址空间中的地址数量
- M = 2 m M = 2^m M=2m:物理地址空间中的地址数量
- P = 2 p P = 2^p P=2p:页大小(字节)
虚拟地址组成部分
- VPO:虚拟页偏移
- VPN:虚拟页号
物理地址组成部分
- PPO:物理页偏移(与 VPO 相同)
- PPN:物理页号

地址翻译:页命中
操作流程(整个过程无需中断)
- CPU 发送虚拟地址给 MMU
-
- MMU 从内存中的页表获取 PTE
- MMU 将物理地址发送至缓存/内存
- 缓存/内存返回数据给处理器

地址翻译:缺页处理
缺页异常流程
- CPU 发送虚拟地址给 MMU。
-
- MMU 从内存读取页表项(PTE)。
- 检测到有效位为 0,MMU触发缺页异常。
- 处理程序识别被替换页(若为脏页,则将其写回磁盘)
- 处理程序将新页调入内存,并在内存中更新 PTE
- 处理程序返回原始进程,并重新执行引发缺页异常的指令


虚拟内存与缓存的集成
- MMU 进行地址翻译可能涉及多次内存访问,PTE 可能未命中,需从内存加载,数据本身也可能在缓存中未命中,存在双重未命中风险(PTE 和数据均未命中)。
- 解决方案:利用 转换后备缓冲区(TLB)加速地址翻译。引入 TLB,MMU 内的小型组相联硬件缓存,直接缓存完整的页表项(PTE),实现快速虚拟页号到物理页号的映射。

- 新增 TLB 相关字段
- TLBI:TLB 索引
- TLBT:TLB 标签
TLB 访问机制
- MMU 使用虚拟地址中的 VPN 部分访问 TLB。

TLB 命中
命中时的操作
- CPU 发出虚拟地址到MMU
-
- MMU 使用 TLB 快速获取 PTE
- MMU直接生成物理地址,并范文Cache或Memory
- 返回数据给CPU

TLB 未命中
- 未命中处理流程:TLB 查找失败,MMU 需从内存中加载对应 PTE,加载后将其填入 TLB,继续完成地址翻译
- TLB 未命中代价较高,但发生频率低(因局部性原理)

多级页表
- 采用两级或多级页表结构
- 第一级页表:每个 PTE 指向一个第二级页表(常驻内存)
- 第二级页表:每个 PTE 指向实际数据页(可换入换出)

k 级页表的地址翻译流程
- 页表基址寄存器(PTBR)指向第一级页表
- 虚拟地址划分为 VPO 和多个层级的 VPN(VPN₁ 到 VPNₖ)
- 逐级查找:从第一级到第 k 级页表
- 最终获得 PPN
- 结合 VPO 得到完整物理地址
- 物理地址格式为 PPN + PPO

简单内存系统
复习


- 14位虚拟地址
- 12位物理地址
- 页面大小 = 64字节(2^6字节 → p=6)

- 虚拟地址划分:高8位为VPN(虚拟页号),低6位为VPO(虚拟页内偏移)。
- 物理地址划分:高6位为PPN(物理页号),低6位为PPO(物理页内偏移)。
地址翻译实例一:0x03D4
- 16个条目,4路组相联
- 每组4个条目 → 共4组(16/4=4)
- TLBI = 2位( l o g 2 4 log₂4 log24),TLBT = 6位

- VPN= ( 00001101 ) 2 (00001101)_2 (00001101)2
- Set=TLBI= ( 01 ) 2 (01)_2 (01)2= 1
- Tag=TLBT= ( 000011 ) 2 (000011)_2 (000011)2=03
- 同时对应的Valid=1说明命中。




地址翻译实例二:TLB/缓存均未命中

