是什么
-
定义:虚实地址转换与 Cache 映射 是计算机存储体系中两级独立的地址变换过程:第一级是由 MMU(TLB/页表) 将程序视角的 虚拟地址(VA) 翻译为物理硬件视角的 物理地址(PA);第二级是 Cache 控制器使用 物理地址(PA) 检索数据是否已缓存在高速 SRAM 中。
-
大白话:
-
映射到主存(虚实转换):虚拟地址是“网购收货名字”(虚的),页表/TLB 是“户籍通讯录”,把名字翻译成“真实门牌号”(物理地址)。
-
映射到 Cache(高速缓存寻址):拿到“真实门牌号”(物理地址)后,去“贴身背包”(Cache)里看有没有对应抽屉(组号)并核对标签(Tag)。
-
核心本质:虚拟地址绝不直接访问 Cache,必须先翻译出物理地址(或利用重叠位并行索引),再拿物理地址去检索 Cache。
-
核心内容
1. 搞懂本质:映射到“主存” vs 映射到“Cache”的区别
很多同学感到混乱,是因为把“页(Page)”和“块(Block/Line)”混为了一谈。这两级映射发生在不同介质之间,规则和目的完全不同:

页解决“地址怎么找到主存”,块解决“主存数据怎么放进Cache”
| 对比维度 | 映射到物理主存(分页虚存机制) | 映射到 Cache(高速缓存机制) |
|---|---|---|
| 操作目的 | 解决“内存不够大”和“多进程内存保护/隔离” | 解决“CPU 速度太快而主存太慢”的速度鸿沟 |
| 管理基本单位 | 页面(Page),通常很大(如 4KB / 8KB) | 块 / 行(Block / Line),通常很小(如 32B / 64B) |
| 处理硬件介质 | 虚存管理依靠 MMU、TLB(SRAM)、主存(DRAM)、外存磁盘 | Cache 控制器、Cache 数据与标记阵列(SRAM) |
| 低位偏移量 | 页内偏移(Page Offset) | 块内偏移(Block Offset) |
| 高位索引机制 | 查 TLB / 页表(以虚页号为索引,换取页框号) | 查 Cache 组号/行号(以物理地址中间位为索引,比对 Tag) |
2. 第一步:虚拟地址 物理地址(虚实转换)
划分规则
-
虚拟地址总位数
-
物理地址总位数
-
页面偏移位数 (==虚实地址中低 位完全相同,直接照抄==)
转换步骤
-
提取虚页号:截取虚拟地址的高 位。
-
查快表(TLB)/ 慢表(页表):
-
检查该虚页号项的 有效位(存在位) 是否为 1:
-
若有效位 :触发 缺页异常(Page Fault),操作系统进入内核调页。
-
若有效位 :读出对应的 页框号(物理页号 PPN)。
-
-
-
物理地址拼接:
3. 第二步:物理地址 Cache 寻址与组号定位
拿到物理地址后,抛开页面的概念,直接将这串二进制比特按照 Cache 的规则重新划分为 3 个字段:
物理地址 (P 位) = [ Cache Tag (高位) ] + [ Cache 组号 (中间位) ] + [ 块内地址 (低位) ]
-
块内地址位数():
-
Cache 组号位数():
(直接映射时 ,组数即总行数;全相联映射时无组号字段,即 )
-
Cache Tag 位数:
映射到 Cache 的组号计算公式
-
从物理地址看:直接截取物理地址从右向左的 第 位到第 位(中间 位)。
-
从主存块号看:
4. 第三步:如何判定是否命中 Cache?
硬件在判定 Cache 命中时,严格遵循 “两步走、双条件” 原则:
判定 Cache 命中不能只靠虚拟地址低位,必须结合物理地址的 Tag。
Step 1 (定位组) --> 根据物理地址中的“组号”选中 Cache 的对应组
Step 2 (并行比对) --> 将物理地址中的“Tag”与该组内所有行的 Tag 同时比对,并检查“有效位”
Cache 命中(Hit)的充要条件:
有效位 Valid (该行已载入有效数据)
Cache 行内存储的 Tag 物理地址解析出的 Tag(两者二进制完全一致)
❌ 未命中(Miss)场景:
有效位 (即使行内残留的 Tag 与目标 Tag 刚好相等也是 Miss!冷启动)。
有效位 但 Tag 不相等(发生冲突替换,当前行装的是别人的数据)。
5. 极速通关技巧:不用算物理地址直接求 Cache 组号(重叠位法)
在大部分 408 大题中:
-
页面大小通常为 4KB(12位) 或 8KB(13位)。
成立的充要条件
-
Cache 块大小(如 32B/64B 5/6位)+ 组号(如 3~6位)通常 位。
-
结论:Cache 组号字段完全落在“页内偏移量”的低位范围内。
-
神技:虚实地址转换时页内偏移完全不变,因此直接展开虚拟地址的低 12 位,提取对应的组号比特位,即可瞬间得出 Cache 组号,完全不用先查页表算物理地址!(这个只能得到组号,适用于表中没有该虚拟地址的Tag导致找不到页框号,只需要找组号的情况)
例题
-
题目:
某系统虚拟地址 32 位,物理地址 28 位,页面大小 4KB(12位)。数据 Cache 容量为 512B,采用 2 路组相联映射,主存块大小为 32B(5位)。
当前 TLB 命中,查得虚拟地址
0008 C040H对应的页框号为0040H(16位)。Cache 结构中第 2 组的存储内容为:
-
左路:
有效位 = 0,Tag = 00400H -
右路:
有效位 = 1,Tag = 01600H
-
求解该虚拟地址对应的物理地址。
-
该物理地址映射到 Cache 的哪一组?写入的 Tag 是什么?
-
此时访问 Cache 是否命中?为什么?
-
-
分析与过程:
-
虚实转换:
-
虚拟地址
0008 C040H:页内偏移为低 12 位040H,虚页号为高 20 位0008CH。 -
查得页框号为
0040H,直接拼接低 12 位偏移040H物理地址为0040 0040H(28位)。
-
-
物理地址切分与 Cache 组号定位:
-
块内偏移 。
-
Cache 总行数 。
-
Cache 组数 组号 。
-
Tag 位数 。
-
将物理地址
0040 0040H展开为二进制:-
高 20 位(Tag):
0000 0000 0100 0000 0000_2 = 00400H -
中间 3 位(组号):观察低 8 位
0100 0000_2(40H),其第 5~7 位为010_2 = 2(映射到第 2 组) -
低 5 位(块内地址):
00000_2 = 0
-
-
-
判定命中:
-
检索第 2 组:
-
左路:Tag 虽为
00400H,但 有效位为 0(无效)。 -
右路:有效位为 1,但 Tag 为
01600H00400H(不匹配)。
-
-
结论:Cache 未命中(Miss)。
-
-
-
规范答案:
-
物理地址为
0040 0040H。 -
映射到 Cache 的 第 2 组,写入的 Tag 为
00400H。 -
Cache 未命中。理由:该物理地址映射到 Cache 第 2 组,虽然左路 Tag 匹配但有效位为 0,右路有效位为 1 但 Tag 不匹配,两路均未满足命中条件。
-
成立的充要条件
例题
-
题目(2018 统考真题):
虚拟地址 32 位,页大小 4KB(12 位)。Cache 采用 2 路组相联映射,主存块大小为 32B(5 位),Cache 组数为 8 组(3 位组号)。
若 CPU 发出虚拟地址
0007 C260H,且在 TLB 与页表中均无法查得物理页号,求该地址映射到的 Cache 组号。 -
过程:
-
块内偏移占低 5 位(第 0~4 位),组号占 3 位(第 5~7 位),页内偏移占低 12 位(第 0~11 位)。
-
组号所在第 5~7 位完全落在低 12 位内(),虚实转换时不改变该字段。
-
虚拟地址低 12 位为
260H,展开为二进制:0010 0110 0000_2。 -
截取第 5~7 位为
011_2 = 3。
-
-
答案:
映射到的 Cache 组号为 3。
⚠️ 易错点
Warning
千万别拿虚拟地址直接查 Cache:Cache 存的是物理内存的副本(物理 Cache / PIPT),必须拿翻译出来的**物理地址(PA)**的 Tag 去和 Cache 里的 Tag 比较。
有效位为 0 却误判为命中:看到 Cache 行里的 Tag 和算出来的 Tag 一模一样就直接写命中——这是命题人最经典的陷阱!必须同时检查有效位是否为 1。
把页内偏移和块内偏移搞混:
虚实转换看页大小(如 4KB 12位);
Cache 寻址看块大小(如 32B 5位)。两者的低位位数完全不同。
十六进制边界拆分出错:截取物理地址中间 3 位组号时,千万不要直接看十六进制字符盲猜,务必把末尾两位的十六进制展开为 8 位二进制(如
40H = 0100 0000),再精准截取第 5~7 位。