是什么

  • 定义虚实地址转换与 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. 第一步:虚拟地址 物理地址(虚实转换)

划分规则

  • 虚拟地址总位数

  • 物理地址总位数

  • 页面偏移位数 (==虚实地址中低 位完全相同,直接照抄==)

转换步骤

  1. 提取虚页号:截取虚拟地址的高 位。

  2. 查快表(TLB)/ 慢表(页表)

    • 检查该虚页号项的 有效位(存在位) 是否为 1:

      • 若有效位 :触发 缺页异常(Page Fault),操作系统进入内核调页。

      • 若有效位 :读出对应的 页框号(物理页号 PPN)

  3. 物理地址拼接

3. 第二步:物理地址 Cache 寻址与组号定位

拿到物理地址后,抛开页面的概念,直接将这串二进制比特按照 Cache 的规则重新划分为 3 个字段:

物理地址 (P 位) = [ Cache Tag (高位) ] + [ Cache 组号 (中间位) ] + [ 块内地址 (低位) ]
  1. 块内地址位数(

  2. Cache 组号位数(

    (直接映射时 ,组数即总行数;全相联映射时无组号字段,即 )

  3. Cache Tag 位数

映射到 Cache 的组号计算公式

  • 从物理地址看:直接截取物理地址从右向左的 位到第 (中间 位)。

  • 从主存块号看

4. 第三步:如何判定是否命中 Cache?

硬件在判定 Cache 命中时,严格遵循 “两步走、双条件” 原则:

判定 Cache 命中不能只靠虚拟地址低位,必须结合物理地址的 Tag

Step 1 (定位组)   --> 根据物理地址中的“组号”选中 Cache 的对应组
Step 2 (并行比对) --> 将物理地址中的“Tag”与该组内所有行的 Tag 同时比对,并检查“有效位”

Cache 命中(Hit)的充要条件

  1. 有效位 Valid (该行已载入有效数据)

  2. 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 组的存储内容为:

    • 左路:有效位 = 0Tag = 00400H

    • 右路:有效位 = 1Tag = 01600H

    1. 求解该虚拟地址对应的物理地址。

    2. 该物理地址映射到 Cache 的哪一组?写入的 Tag 是什么?

    3. 此时访问 Cache 是否命中?为什么?

  • 分析与过程

    1. 虚实转换

      • 虚拟地址 0008 C040H:页内偏移为低 12 位 040H,虚页号为高 20 位 0008CH

      • 查得页框号为 0040H,直接拼接低 12 位偏移 040H 物理地址为 0040 0040H(28位)。

    2. 物理地址切分与 Cache 组号定位

      • 块内偏移

      • Cache 总行数

      • Cache 组数 组号

      • Tag 位数

      • 将物理地址 0040 0040H 展开为二进制:

        • 高 20 位(Tag):0000 0000 0100 0000 0000_2 = 00400H

        • 中间 3 位(组号):观察低 8 位 0100 0000_240H),其第 5~7 位为 010_2 = 2 (映射到第 2 组)

        • 低 5 位(块内地址):00000_2 = 0

    3. 判定命中

      • 检索第 2 组:

        • 左路:Tag 虽为 00400H,但 有效位为 0(无效)

        • 右路:有效位为 1,但 Tag 为 01600H 00400H(不匹配)

      • 结论Cache 未命中(Miss)

  • 规范答案

    1. 物理地址为 0040 0040H

    2. 映射到 Cache 的 第 2 组,写入的 Tag 为 00400H

    3. Cache 未命中。理由:该物理地址映射到 Cache 第 2 组,虽然左路 Tag 匹配但有效位为 0,右路有效位为 1 但 Tag 不匹配,两路均未满足命中条件。

成立的充要条件

例题

  • 题目(2018 统考真题):

    虚拟地址 32 位,页大小 4KB(12 位)。Cache 采用 2 路组相联映射,主存块大小为 32B(5 位),Cache 组数为 8 组(3 位组号)。

    若 CPU 发出虚拟地址 0007 C260H,且在 TLB 与页表中均无法查得物理页号,求该地址映射到的 Cache 组号。

  • 过程

    1. 块内偏移占低 5 位(第 0~4 位),组号占 3 位(第 5~7 位),页内偏移占低 12 位(第 0~11 位)。

    2. 组号所在第 5~7 位完全落在低 12 位内(),虚实转换时不改变该字段。

    3. 虚拟地址低 12 位为 260H,展开为二进制:0010 0110 0000_2

    4. 截取第 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 位。