计算系统安全速成之虚拟内存与物理内存【9】

文章目录

  • 多个进程共享系统资源的场景,如何实现各进程独立访问内存?解决方案:虚拟内存。

地址空间

  • 虚拟寻址系统系统结构: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

  • 虚拟内存具有如下优势:
  1. 提高内存利用率:使用DRAM作为虚拟地址空间部分区域的缓存。
  2. 简化内存管理:每个进程拥有相同的统一线性地址空间。
  3. 实现地址空间隔离:防止一个进程干扰另一个进程的内存,用户程序无法访问特权内核信息和代码。

虚拟内存作用:缓存工具

  • 虚拟内存模型概念上,虚拟内存是存储在磁盘上的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触发缺页异常,切换至监督模式(内核态),调用软件缺页处理程序。

缺页异常处理

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

  1. 异常响应:缺页导致异常中断,页面错误处理程序启动。
  2. 选择牺牲页:页面错误处理程序选定一个待淘汰的页(如VP 4)。
  3. 页面置换:将目标虚拟页(如VP 3)从磁盘调入空闲物理页,更新页表项(PTE)使其指向新的物理页,设置有效位。


  1. 恢复执行:重新执行引发异常的指令,此次访问将命中缓存(页面已在内存)。
  2. 完成缺页处理,返回用户态:页面错误处理程序执行中断返回指令(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:物理页号

地址翻译:页命中

操作流程(整个过程无需中断)

  1. CPU 发送虚拟地址给 MMU
    1. MMU 从内存中的页表获取 PTE
  2. MMU 将物理地址发送至缓存/内存
  3. 缓存/内存返回数据给处理器

地址翻译:缺页处理

缺页异常流程

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

虚拟内存与缓存的集成

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

TLB 访问机制

  • MMU 使用虚拟地址中的 VPN 部分访问 TLB。

TLB 命中

命中时的操作

  1. CPU 发出虚拟地址到MMU
    1. MMU 使用 TLB 快速获取 PTE
  2. MMU直接生成物理地址,并范文Cache或Memory
  3. 返回数据给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/缓存均未命中


相关推荐
缘友一世2 天前
计算系统安全速成之链接:理解程序的构建过程【7】
汇编·计算机系统
缘友一世5 天前
计算系统安全速成之内存层次结构【5】
计算机系统·存储器
缘友一世5 天前
计算系统安全速成之内存布局与缓冲区溢出攻击【4】
安全·系统安全·计算机系统
_Minato_8 天前
数据库知识整理——数据库控制功能
数据库·经验分享·笔记·软考·计算机系统
_Minato_22 天前
计算机系统知识总结——指令系统
经验分享·软考·计算机系统
kyle~1 个月前
计算机系统---USB的四种传输方式
运维·c++·计算机系统
kyle~2 个月前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
DebugKitty3 个月前
硬件开发2-ARM基本概要
arm开发·mmu·soc·指令集·计算机系统·alu
danzongd4 个月前
浅谈C++ const
c++·内存·优化·汇编语言·计算机系统·寄存器