物理地址在页式虚存系统和不同 Cache 映射方式组合下,有以下几种拆分形态:
1. 虚存视角的物理地址(绝对通用)
只要操作系统/体系结构采用页式管理,物理地址高低位划分就固定为两段:
-
页内偏移位数:由页面大小(Page Size)决定,等于 。
-
页框号位数:。
2. Cache 视角的物理地址(按映射方式分类)
Cache 硬件对物理地址进行拆分时,低位永远是“块内地址”,高位根据映射规则进一步细分:
| Cache 映射方式 | 物理地址切分结构 | 关键字段位数计算 |
|---|---|---|
| 直接映射 | [ Cache Tag ] + [ Cache 行号 ] + [ 块内地址 ] | |
| K 路组相联映射 | [ Cache Tag ] + [ Cache 组号 ] + [ 块内地址 ] | |
| 全相联映射 | [ Cache Tag ] + [ 块内地址 ] | (无行号/组号) |
3. 两大视角在不同映射下的联合等式
-
在直接映射下:
-
在 K 路组相联映射下:
-
在全相联映射下:
4. 硬件重叠的关键结论(VIPT 技巧)
由于页面大小(如 4KB/8KB 12/13 位) Cache 块大小(如 32B/64B 5/6 位):
-
块内地址必然落在页内偏移的低位区间内。
-
若 Cache 组号/行号也完全落在页内偏移范围内(即 ),则可以直接使用虚拟地址的低位去检索 Cache 组号/行号,而不需要等待虚实地址翻译(TLB/MMU)完成。

虚拟地址不能直接找cache或者主存;要先转换成物理地址,通过快表或者页表找,然后cache里面如果没有(没命中的话)才去找主存
按硬件执行的先后顺序,整条链路可以精炼为下面两条路:
-
第一阶段:地址翻译(虚 实)
-
CPU 带着 虚拟地址 出发。
-
先查 快表(TLB):
-
TLB 命中 瞬间拿到 物理地址。
-
TLB 缺失 去主存查 页表(慢表):
-
页表命中(在内存) 拿到 物理地址,并顺手更新 TLB。
-
页表未命中(有效位=0) 触发 缺页中断/异常,由操作系统去外存(磁盘)把页面调入主存,再生成物理地址。
-
-
-
-
第二阶段:数据获取(查 Cache 访主存)
-
拿到 物理地址 后,去检索 Cache:
-
Cache 命中 极其高速地直接把数据/指令送给 CPU。
-
Cache 缺失 由硬件去 主存 对应地址调出一个数据块(Block)填入 Cache,并把目标数据送给 CPU。
-
-
408 考场上的一个“终极推论”(经常出选择题):
TLB 命中,页面一定在主存中吗?
一定在! 因为 TLB 是主存页表的缓存副本,TLB 命中说明页表项有效位必为 1,绝不可能缺页。
Cache 命中,TLB 一定命中吗?
不一定! Cache 是主存数据的副本,TLB 是地址映射的副本,两者的替换策略独立。有可能数据早在 Cache 里,但对应页表项刚从 TLB 里被淘汰了。
一、为什么“TLB 命中,页面一定在主存中”?
核心原因:TLB 里存的永远是“合法有效的主存页表项”。
-
装入时机:只有当一个页面已经在物理主存中(或者刚从磁盘调入主存成功,页表有效位置 1)时,硬件才会把这个虚页到实页的映射关系写进 TLB。
-
换出同步:如果操作系统要把某个页面淘汰换出到磁盘(发生 Page Out),操作系统会强制执行一条特权指令(如 TLB Invalidate / 清除对应 TLB 项),把 TLB 里对应的项直接抹掉或置为无效。
-
推导链条:
二、为什么“Cache 命中,TLB 不一定命中”?
核心原因:TLB 和 Cache 缓存的对象完全不同,且各自独立工作、独立淘汰。
-
TLB 缓存的是“地址翻译结果”:虚页号 物理页号(告诉 CPU 东西在哪)。
-
Cache 缓存的是“真实数据内容”:物理地址 数据块(真正的变量、指令)。
经典生活比喻
-
Cache 就像你的书包(里面装着实体书)。
-
TLB 就像你的便签纸(上面记着“高等数学在书包第 2 层”)。
你先把高数书装进了书包(数据进入了 Cache),并在便签纸上记了位置(映射进了 TLB)。
过了一会儿,便签纸写满了,你把关于高数书的那条笔记擦掉了(TLB 项被 LRU 算法替换淘汰)。
但此时,高数书依然稳稳当当地躺在你的书包里(Cache 里的数据没有被替换)!
下次你想读高数书时:
-
先看便签纸(查 TLB) 发现没记(TLB 未命中)。
-
去翻总目录/大字典(查主存页表) 查到了在书包第 2 层,并重新在便签上记一笔(更新 TLB)。
-
伸手去掏书包(查 Cache) 一掏就拿到了(Cache 命中)!
408 考场状态组合速查(四种情况)
| 组合状态 | 是否可能出现? | 场景解释 |
|---|---|---|
| TLB 命中 + Cache 命中 | 可能 | 最理想状态,虚实转换极速,数据秒读。 |
| TLB 命中 + Cache 未命中 | 可能 | 页面在内存中,但具体的数据块还没调入 Cache。 |
| TLB 未命中 + Cache 命中 | 可能 | TLB 表项被替换淘汰了,但之前读过的数据仍留在 Cache 中。 |
| TLB 命中 + 缺页异常 | ❌ 绝对不可能 | 只要 TLB 命中,页面必定在物理内存中。 |
| 缺页异常 + Cache 命中 | ❌ 绝对不可能 | 页面都没进内存,Cache 作为内存的子集绝不可能有该页的数据。 |