跳转至

index

Note

考纲:

  1. 虚拟存储器的基本概念
  2. 页式虚拟存储器:基本原理,页表,地址转换,TLB(快表)
  3. 段式虚拟存储器的基本原理
  4. 段页式虚拟存储器的基本原理

虚拟存储器的基本概念

虚拟存储器的相关概念和工作原理

虚拟存储器并非独立的物理存储硬件,而是一套由硬件与操作系统协同实现的内存管理技术,是计算机层次化存储体系中的核心设计,其核心定位是解决以下痛点:

  1. 突破物理主存的容量限制:计算机物理主存的容量远小于外存,且不同设备的主存配置存在显著差异。虚拟存储器为程序员提供了远超物理主存大小的连续、统一编程地址空间,让程序开发彻底摆脱物理内存大小对程序设计的约束。
  2. 弥合CPU与外存的访问效率鸿沟:CPU无法直接对磁盘、固态硬盘等外存进行寻址访问,所有外存中的程序代码与数据,必须先载入主存才能被CPU读取和执行。虚拟存储器基于程序的局部性原理,通过主存缓存高频访问的外存数据,减少CPU对低速外存的直接依赖,大幅提升程序的整体执行效率。
  3. 支撑多进程的安全高效并发:现代通用操作系统需要同时运行多个用户进程,每个进程都需要独立、不受干扰的地址空间。虚拟存储器为每个进程提供了私有的、完全隔离的虚拟地址空间,从底层保障进程间互不干扰;即使多个进程的总代码与数据容量超过物理主存大小,也能在有限的主存资源中稳定、安全地并发运行。

从存储体系架构来看,虚拟存储器以物理主存(DRAM)为核心缓存、以联机工作的磁盘/固态硬盘等外存为后备存储载体,二者通过统一的地址编址体系整合为一个有机整体。对应用程序员而言,这套体系就像一个单一的、可被CPU直接访问的超大容量主存,开发过程中只需面向这套虚拟地址空间编写程序,使用统一的虚拟地址(VA, Virtual Address) 完成指令与数据的寻址,无需关注数据实际存储在主存还是外存中。

虚拟存储器的落地实现,必须依靠操作系统(OS)软件与内存管理单元(MMU, Memory Management Unit)硬件的深度协同,核心工作流程分为两大核心环节:

  1. 虚拟地址到物理地址的转换
    CPU执行程序时发出的是虚拟地址,首先会交由CPU芯片内部集成的MMU硬件处理。MMU会通过操作系统预设的页表/段表映射规则,将程序使用的虚拟地址(VA)转换为可被主存识别的物理地址(PA, Physical Address),完成寻址的核心转换。

1777479000078-28135e44-69b5-42ed-a8be-cacc13a20fbd.png

  1. 异常检测与闭环处理
    在地址转换的全过程中,MMU会同步完成地址合法性与数据可用性校验,识别两类核心异常场景并触发对应处理:
    • 若目标数据未载入主存(数据缺失):MMU会触发缺页异常,CPU随即从用户态陷入操作系统内核,由内核的缺页异常处理程序完成目标数据从外存到主存的载入,同时更新地址映射关系,处理完成后返回用户态,重新执行触发异常的原指令;
    • 若出现地址越界、访问权限不符等存储保护违规:MMU会触发内存保护异常,由操作系统对违规行为进行对应处理(如终止违规进程、抛出内存访问错误等),从底层保障内存访问的安全性与进程间的地址隔离。
虚拟地址到物理地址的转换是硬件还是软件完成的?

这个问题,关键在于区分两件事:"谁建立映射规则" 和 "谁执行翻译动作"。

结论:地址翻译本身是硬件(MMU)完成的。 OS 负责建立和维护页表,但"查表翻译"这个动作每次都由 MMU 硬件执行。

用一个比喻理解:把页表想象成一本字典:

  • OS(软件) = 编写字典的人,负责写入每一条词条(建立 VPN→PPN 的映射),在缺页时增加新词条,在进程切换时换一本新字典;
  • MMU(硬件) = 使用字典查词的人,每次 CPU 发出虚拟地址,MMU 自动翻字典、找到物理地址,整个过程在硬件电路里完成,速度极快。

字典是软件写的,但"查字典"这个动作是硬件做的。

两者的精确分工

题图

如果 TLB 没命中,现代架构的 MMU 内部有一个叫 硬件页表漫游器 (Hardware Page Table Walker) 的部件。它会自动根据页表基址寄存器的地址,去主存中逐级读取页表项。这个过程不需要任何一条操作系统指令的干预,纯靠硬件状态机完成。

OS 写好页表之后就"退场"了。CPU 执行用户程序时,每一次内存访问都是 MMU 硬件在自动查表,OS 完全不介入——除非出现异常(缺页、越权)才被硬件打断、通知 OS 处理。

事情 执行者 时机
创建页表、写入映射关系 OS 软件 进程创建/缺页时
修改 PTBR 寄存器(切换页表) OS 软件 进程切换时
处理缺页异常(分配页、加载磁盘) OS 软件 缺页发生后
查 TLB,翻译地址,权限检查 MMU 硬件 每次访存
TLB 缺失时遍历页表 MMU 硬件 TLB 缺失时

Cache-主存层次与主存-辅存层次

现代计算机主要通过构建两个层次来全面优化存储系统:

1775291615980-48eb602e-2d8f-4021-b41f-cf2144877dd6.png

① Cache - 主存层次

  • 主要目的: 缓解 CPU 与主存速度不匹配的问题。
  • 实现方式: 数据调度完全由硬件自动完成。
  • 透明性: 对所有程序员(包括系统程序员和应用程序员)都是透明的(即程序员无需关心其内部数据调度逻辑)。

② 主存 - 辅存层次

  • 主要目的: 解决存储系统的容量不足问题(逐渐发展形成了虚拟存储系统,让程序员可以使用远大于实际主存的虚拟地址空间进行编程)。
  • 实现方式: 由硬件和操作系统共同完成。
  • 透明性: 对应用程序员透明,但对系统程序员不透明(系统程序员需要编写调度等底层逻辑)。

内存和外存的关系

⭐Cache-主存层次与主存-辅存层次的异同点

一、 两个层次的相同点

这两个层次在工作原理和管理机制上有以下核心共性:

  1. 理论基础: 都是基于程序访问的局部性特点,将相邻的局部信息从慢速存储器复制到快速存储器中。
  2. 需要解决映射问题: 都必须考虑慢速存储器和快速存储器之间的地址映射关系。
  3. 需要解决替换问题: 当快速存储器已满,且需要装入新块时,都需要考虑替换策略(把哪一块替换出去)。
  4. 缺失时的调入机制: 当在快速存储器中找不到所需信息(缺失)时,都需要从慢速存储器中将包含该信息的块调入到快速存储器中。

二、 两个层次的不同点

由于所处位置和引入目的不同,两者在具体实现上存在显著差异:

对比维度 Cache - 主存层次 主存 - 辅存层次
位置与访问权限 最靠近 CPU。CPU 可直接访问 Cache 和主存。 远离 CPU。CPU 不能直接访问辅存,辅存需与主存直接交换数据。
引入目的 解决速度问题:加快 CPU 访问信息的速度。 解决容量问题:采用虚拟存储器机制,扩大系统的存储容量,使编程不受内存大小限制。
交换的数据单位 称为主存块 (Block),通常较小,一般为 8 ~ 128B。 称为页 (Page),通常较大,一般为 4KB ~ 64KB(因缺页损失远大于 Cache 缺失,页太小会降低效率)。
缺失处理 由处理器(硬件)直接实现。 由操作系统(软件)实现。
映射方式 可灵活选择直接映射、全相联映射或组相联映射。 均采用全相联映射方式。
映射的实现介质 映射关系完全由硬件实现,使用 Cache 行中的标志 (Tag) 字段描述。 映射关系由操作系统实现,使用页表来描述。
写策略 可以采用直写 (Write-through) 和 回写 (Write-back) 两种策略。 都采用回写 (Write-back) 策略(因为直接写磁盘的开销过大,无法容忍直写策略)。

Note

cache与主存之间的数据交换单位是数据块,而页式虚拟存储器中,主存与辅存的数据交换单位是页面。cache由SRAM,主存由DRAM、辅存由磁盘等外设组成,容量关系为cache容量 << 主存容量 << 辅存容量,访问速度关系为cache访问速度 >> 主存访问速度 >> 辅存访问速度(主存比cache慢10~100倍,辅存比主存慢约10000倍)。

因此,页式虚拟存储器的缺页处理代价远大于cache未命中的处理代价,所以页面大小通常设置得更大,主流为4KB,也支持更大容量的页面;而cache与主存之间的数据块大小通常为16B、32B、64B等,远小于虚拟页面大小。

由于缺页处理代价极高,主存与辅存之间采用全相联映射方式以提升命中率;同时因辅存访问速度远低于主存,写操作默认采用写回法,而非直写法。

虚拟地址空间 vs 物理地址空间

  • 虚地址VA(Virtual Address):应用程序视角中的连续逻辑地址,构成统一的虚拟内存空间,也叫逻辑地址;
  • 物理地址PA(Physical Address):硬件实际使用的内存单元地址;

通过内存管理单元MMU和页表的动态转换,连续的虚拟地址可被映射到分散的物理地址上。

页式虚拟存储器

页式虚拟存储器概述(更详细的内容见 OS 第三章)

在页式虚拟存储器中,主存和虚拟地址空间被划分为大小完全相等的页面(简称页),外存与主存之间以页为单位交换信息:

  • 虚拟页VP(Virtual Page):虚拟地址空间中的页,简称虚页,也叫逻辑页;
  • 物理页PP(Physical Page):主存空间中的页,简称实页,也叫页框、页帧。

页式虚拟存储器采用请求分页的核心思想:

  • 仅将进程中活跃的页面(包含当前访问的指令/数据)从辅存调入主存,非活跃页面保留在辅存中;
  • 当访问的指令/数据所在页面不在主存时,触发缺页异常,由操作系统从辅存将缺失页面调入主存。

虚拟页式存储器采用全相联映射,即每个虚拟页可存放到主存中任意一个空闲物理页。

页表

对于每个进程,都需要建立虚拟页与主存物理页/磁盘存储位置的映射关系,该关系通过页表PT(Page Table) 记录。程序被加载到主存运行时成为进程,进程是程序的执行实例,是操作系统资源分配和调度的基本单位。

采用虚拟存储器的系统中,操作系统会为每个进程创建独立的页表,实现虚拟地址空间到物理地址空间的映射。页表中的每一行称为一个页表项,核心字段及说明如下:

字段名称 别名 核心作用与取值规则
有效位 装入位 + 有效位=1:虚拟页已从辅存调入主存,存放位置字段存储物理页号;
+ 有效位=0:虚拟页未调入主存,若存放位置为NULL表示未分配物理内存,不为NULL 时记录该页在磁盘上的起始地址
脏位 修改位 标记虚拟页是否被修改,配合写回法使用:
+ 脏位=1:页面已被修改,替换时需写回辅存;
+ 脏位=0:页面未被修改,可直接替换无需写回
引用位 替换控制位/使用位 记录页面的访问情况,配合替换策略使用: LRU算法中作为LRU位
访问权限位 保护位 定义页面的访问权限,实现存储保护,可选权限:可读可写、只读、只可执行

1777481378828-c4af14fd-ed15-4e99-8a4c-3a3673b353b4.png

PTBR 页表基址寄存器

PTBR 是一个硬件寄存器,存储当前进程页表在物理内存中的起始地址(根地址)。

MMU 每次翻译虚拟地址时,都以 PTBR 中的值为起点,去内存中找页表、完成地址翻译。它是 MMU 与页表之间的"入口指针"。(CPU 给出虚拟地址 VA,可划分为虚拟页号VPN + 页内偏移offset,页表项地址 = PTBR + VPN × 页表项大小 ,访问主存中的页表得到页表项,将里面的物理页号和页内偏移拼接在一起得到物理地址。)

进程切换时 PTBR 的变化:每个进程都有自己独立的页表,存在内存的不同位置。操作系统在进程切换时,只需修改 PTBR 的值,MMU 就能立刻切换到新进程的地址空间。这是虚拟存储器实现进程地址空间隔离的核心机制,进程 A 和进程 B 可以使用完全相同的虚拟地址,但因为 PTBR 不同,翻译出的物理地址完全不同,互不干扰。

PTBR 存储的是物理地址,这一点很关键:PTBR 中存放的必须是物理地址,而不是虚拟地址。

原因很简单:MMU 翻译地址时,需要先找到页表,如果页表的地址本身也是虚拟地址,就形成了"先有鸡还是先有蛋"的死循环——翻译虚拟地址需要页表,找页表又需要先翻译虚拟地址。

PTBR 与 TLB 的关系:每次通过 PTBR 查页表都要访问内存,代价很高(数十~数百周期)。TLB 正是为了减少这种开销而存在的:

有 TLB 时:                          无 TLB(或TLB缺失)时:

CPU发出VA                            CPU发出VA
    │                                   │
    ▼                                   ▼
查 TLB(快,1~4周期)              PTBR + VPN → 页表项地址
    │                                   │
  命中                               访问内存取页表项(慢,~100周期)
    │                                   │
    ▼                                   ▼
直接得到PA                          得到PA
(完全不需要 PTBR 和内存)

TLB 命中时,PTBR 完全用不上;只有 TLB 缺失时,MMU 才通过 PTBR 去内存查页表。TLB 的本质是对"PTBR + 页表查询"这个慢操作的缓存。

多级页表下 PTBR 的含义:如果系统使用多级页表,PTBR 存储的是最顶层页表(页目录)的物理基址。

Note

一句话总结: PTBR 是 MMU 访问页表的入口指针,存储当前进程页表根的物理地址。进程切换时 OS 修改 PTBR,即完成地址空间切换;TLB 命中时 PTBR 被绕过,TLB 缺失时 MMU 从 PTBR 出发遍历页表完成翻译。

地址映射及转换

对于采用虚存机制的系统,指令中给出的地址是虚拟地址,所以,CPU执行指令时,首先要将虚拟地址转换为主存物理地址,才能到主存取指令和数据。地址转换(address

translation)工作由 CPU 中的存储器管理部件(MMU)来完成。

由于页式虚拟存储器中,物理页与虚拟页大小完全一致,因此二者的页内偏移位数完全相同,简称页内偏移字段。

- 物理地址 = 物理页号 + 物理页内偏移
- 虚拟地址 = 虚拟页号 + 虚拟页内偏移

虚拟存储器容量大于主存容量,因此虚拟页号的位数大于物理页号的位数。

分页式虚拟存储管理方式下,地址变换过程如下图所示。首先 MMU根据页表基址寄存器的内容,找到主存中对应的页表起始位置(即页表基地址),然后将虚拟地址高位字段中的虚页号作为索引,找到对应的页表项,若装入位(有效位)为1,则取出物理页号,和虚拟地址中的页内地址拼接,形成访问主存时实际的物理地址;若装入位为0,则说明缺页,需要操作系统进行缺页处理。

页表属于进程控制信息,存放在进程地址空间的内核区,每个进程的页表常驻主存。页表基址寄存器PTBR 记录页表在主存中的首地址,进程切换时仅需修改PTBR的值,即可完成页表的快速切换。

虚拟地址到物理地址转换流程

最基础的访存流程
页面命中时的访问流程

1777634778371-7d701981-8fab-488c-9874-9c46e307ce31.png

  1. CPU送出指令中的虚拟地址,交由MMU进行地址转换;
  2. MMU通过PTBR和虚拟地址中的虚拟页号,生成页表项地址,访问主存中的对应页表项;
  3. 主存向MMU返回页表项;
  4. 页表项有效位=1,确认页面已调入主存,通过物理页号+页内偏移拼接物理地址,访问主存对应数据;
  5. 主存向CPU返回目标数据。
页面缺失(缺页)时的访问流程

步骤1~3与页面命中流程完全一致;
4. 页表项有效位=0,MMU触发缺页异常,调用操作系统内核的缺页异常处理程序;
5. 若主存已满,通过替换算法选定待淘汰页面;若该页面脏位=1,需先将页面写回磁盘,否则直接丢弃;
6. 缺页处理程序(由硬件和操作系统协作完成)从磁盘调入目标页面到主存,更新页表对应表项;
7. 缺页处理完成后,返回原进程,重新执行触发缺页的指令,此次执行将命中页面,按命中流程的步骤 2-5 完成访存。

1777642069440-8a35d258-e57c-4f94-aed5-39863937119e.png

【2022-15】某计算机主存地址为24位,采用分页虚拟存储管理方式,虚拟地址空间大小为4GB,页大小为4KB,按字节编址。某进程的页表部分内容如下表所示。当CPU访问虚拟地址00082840H,虚-实地址转换的结果是( )。

\(\begin{array} {|c|c|c|}\hline \text{虚页号}&\text{实页号(页框号)}&\text{存在位}\\\hline \text{82}&\text{024H}&0\\\hline \dots&\dots&\dots\\\hline \text{129}&\text{180H}&1\\\hline \text{130}&\text{018H}&1\\\hline \end{array}\)

A. 得到主存地址02 4840H

B. 得到主存地址18 0840H

C. 得到主存地址01 8840H

D. 检测到缺页异常

解析

采用分页虚拟存储管理方式,虚拟地址格式为公式 。

虚拟地址空间大小为公式,页大小为公式,按字节编址,页内地址占低12位,虚拟地址占32位,虚页号占高32-12=20位。

虚拟地址 公式 ,虚页号为00082H=8×16+2=130,查该进程页表得,虚页号130对应的存在位为1,实页号为018H,主存地址为24位,实页号占高24-12=12位,查表得到的实页号正好12位,高位不需要去0或者补0,拼接得到主存地址公式 。

本题选C。

【2019-14】下列关于缺页处理的叙述中,错误的是()。
A.缺页是在地址转换时CPU检测到的一种异常
B.缺页处理由操作系统提供的缺页处理程序来完成
C.缺页处理程序根据页故障地址从外存读入所缺失的页
D.缺页处理完成后回到发生缺页的指令的下一条指令执行

解析

答案:D。

缺页处理完成后,会重新执行触发缺页的指令,而非跳转到下一条指令。


结合cache的访存流程

主存中的数据可分为两类:存储页表内容的页表块、存储程序数据的数据块。cache会缓存主存中的高频访问数据,因此常用的页表块也会被载入cache。

最理想情况

页表项在cache中命中、数据也在cache中命中,仅需2次cache访问即可获取数据。

  1. CPU发出虚拟地址,交由MMU转换;
  2. MMU通过PTBR和虚拟页号生成页表项地址,在cache中查找对应页表项;
  3. 页表项命中,cache向MMU返回页表项;
  4. 页表项有效位=1,拼接得到物理地址,通过物理地址在cache中查找目标数据块;
  5. 数据块命中,向CPU返回目标数据。

1777643207401-d59e816c-73fe-4d82-afd6-30c38de87b2e.png

较糟糕情况

无缺页(页面在主存中),但页表项在cache中缺失、数据也在cache中缺失,需2次主存访问获取数据。

  1. CPU发出虚拟地址,交由MMU转换;
  2. MMU通过PTBR和虚拟页号生成页表项地址,在cache中查找对应页表项;
  3. 页表项在cache中缺失,通过页表项地址访问主存获取页表项;
  4. 将页表项所在数据块载入cache
  5. 向MMU返回页表项;
  6. 页表项有效位=1(页表项所在页面已载入主存),该页表项中的存放位置字段里记录了物理页号,再结合虚拟页号末尾的页内偏移字段,拼接得到物理地址,在cache中查找目标数据块;
  7. 数据块在cache中缺失,通过物理地址访问主存获取数据块;
  8. 将目标数据所在数据块载入cache
  9. 向CPU返回目标数据。

1777644703840-3ec1346c-eee8-4ca9-9bb0-345a7eb77426.png

最糟糕情况

在较糟糕情况的基础上,访问目标数据块触发缺页异常,需访问磁盘获取数据,访存性能损耗最大。(前面 6 步与较糟糕情况一样,但是后面访问主存也缺失,因此得从磁盘将对应页面调入内存和 cache)

综上,虚拟存储技术会对存储器的访问性能产生影响。

使用快表TLB加速地址转换

cache虽然可以缓存部分经常访问的页表块,但这种数据块的粒度较大,并不能充分利用虚拟存储器访问的局部性。为了进一步降低虚拟存储器地址转换的硬件开销,现代处理器都维护着一个转换旁路缓冲区(Translation Look-aside Buffer,TLB),用于缓冲经常访问的页表项。

TLB本质上就是一个容量较小的cache,为提高查找速度,大多采用全相联或组相联方式,且采用随机替换算法。TLB离CPU更近,访问速度更快,所以通常将TLB表称为快表,而将主存中的页表称为慢表。

全相联方式的TLB工作逻辑

全相联模式下,虚拟地址划分为:虚拟页号 + 虚拟页内偏移。MMU将虚拟页号与TLB内所有页表项的tag标记进行并行比较,若tag匹配且有效位=1,则TLB命中,直接获取物理页号,与页内偏移拼接得到物理地址。

1778000730135-31f91a8c-b51e-40dd-bb19-146491a9612c.png

组相联方式的TLB工作逻辑

组相联模式下,虚拟地址划分为:TLB标记 + TLB组索引 + 虚拟页内偏移。
以2路组相联为例:

  1. MMU通过TLB组索引定位到对应的TLB组(每组包含2个页表项);
  2. 将TLB标记与组内2个表项的标记并行比较,结果与有效位做逻辑与运算,生成选择信号;
  3. 选中的物理页号与页内偏移拼接,得到最终物理地址。

1778002469106-84a4289f-f5c3-4d29-8b6b-564a256fc2d0.png

基于TLB、cache的完整访存流程

采用虚拟存储器技术的计算机,需要硬件(MMU、TLB等)与操作系统协同工作:

  1. 操作系统引导完成前,CPU使用物理地址访问主存,处于实地址模式(实模式);
  2. 操作系统引导完成后,CPU进入保护模式(虚地址模式),使用虚拟地址访问主存。

1778005561748-a2b0944e-ee46-49fa-8d58-3e81ef64b92e.png

关键说明:cache缺失处理由硬件完成;缺页处理由操作系统(软件)完成;TLB缺失处理可由硬件完成,也可由操作系统通过TLB缺失异常处理程序(软件)完成。

下面该流程图为假设 TLB 采用全相联 随机替换策略, cache 采取组相联 LRU 替换策略时的访存流程

db4ffcbb062a4ea449b3459bf07ca021.svg

TLB、页表、cache命中/缺失的组合情况
场景分类 TLB 页 cache 可能性 核心说明
最好情况:
不访问主存
命中 命中 命中 可能 TLB命中则页一定命中,数据在主存,就可能在cache中

访问主存1次
命中 命中 缺失 可能 TLB命中则页一定命中,数据在主存,但可能不在cache中
缺失 命中 命中 可能 TLB缺失但页可能命中,数据在主存,就可能在cache中
访问主存2次 缺失 命中 缺失 可能 TLB缺失但页可能命中,数据在主存,但可能不在cache中
最糟情况:
访问磁盘+至少2次主存访问
缺失 缺失 缺失 可能 TLB缺失、页缺失,数据不在主存,必然不在cache中


不可能出现的情况
命中 缺失 缺失 不可能
页缺失,说明信息不在主存,TLB 中一定没有该表项
命中 缺失 命中 不可能
缺失 缺失 命中 不可能 页缺失则数据不在主存,必然不在cache中

Cache 与 TLB 对比

对比维度 Cache TLB
缓存对象 主存中的数据/指令块 内存页表中的页表项
查询 key 物理地址(块号部分) 虚拟页号 VPN
输出结果 数据内容 物理页号 PPN + 权限
解决问题 CPU与主存速度差 每次地址翻译都要访问主存页表的开销
位置 CPU 芯片内(L1/L2/L3) MMU 内部
典型容量 32KB ~ 32MB(多级) 32 ~ 1024 项(1~2级)
映射方式 直接/组相联/全相联 全相联或组相联
缺失处理 硬件自动完成 硬件或OS(视架构)
进程切换 无需刷新 需刷新

一句话区分:Cache 加速"取数据",TLB 加速"找地址"。

在访存流程中的位置

1778134481339-e5675733-ca0b-4a71-ac0c-771aae78fcf5.png

二者缺失后的处理方式

这是两者最显著的差异:

ef2da7013b059b331c2f5ccf8cb69457.svg

关键区别:Cache 缺失永远由硬件处理;TLB 缺失在某些架构下需要 OS 介入,缺页时必须 OS 介入。

进程切换时的行为不同
事件 Cache TLB
进程切换 不需要刷新,物理地址是全局唯一的,不同进程的 Cache 内容可以共存 需要刷新,否则新进程会用到旧进程的翻译结果
原因 Cache 的 key 是物理地址,物理地址全局唯一 TLB 的 key 是虚拟地址,不同进程的相同虚拟地址映射到不同物理地址