Appearance
题目
某计算机按字节编址,虚拟地址为 16 位,页大小为 256B,页表项中包含装入位(P)、页框号(PPN)等字段。TLB 采用 4 路组相联映射,共有 16 个页表项,TLB 表项中包含标记(Tag)、有效位(V)等字段。在主存页表与 TLB 表项同步后,若主存页表中页号 22 对应的页表项中 P=0,PPN=2AH,则下列不可能出现在组号为 2 的 TLB 表项中的是( )。
错因
B
只看 PPN——发现 B 的 PPN=2AH 跟题目里"页号 22 的 PPN=2AH"巧合一致,就把 B 当成可疑选项。但 B 的 Tag=06H,对应页号 = ,不是页号 22;不同的虚页可以映射到相同的物理页框号(共享页、code page),且 V=1、PPN=2AH 与"页号 22 P=0"完全无关——B 是合法的 TLB 内容。
C
被"Tag=16H"看起来很大吓住,怀疑这个 Tag 不能放在组 2。其实 TLB Tag 字段长度 = 页号位数 − 组号位数 = 8 − 2 = 6 位,最大可表示到 0x3F = 63,0x16 = 22 完全在合法范围内。该项 V=0 表示无效,意味着这个槽里"曾经放过、现在已废"——TLB 项无效时其它字段(PPN)是垃圾值,可以是任意数,所以 C 完全可能出现。
D
可能误用了"V=0 时项不存在"的错觉,认为 D 也不可能出现。事实上 V=0 只是当前无效,TLB 槽里仍保留着上一次填进来的位组合——Tag、PPN 都可能是任意残留值。D 的 Tag=1AH(页号 106)、PPN=1CH 都属合法残留,不与题目给的"页号 22 信息"冲突。
总解析
第一步:算 TLB 字段宽度
| 量 | 计算 | 值 |
|---|---|---|
| 页内偏移位数 | 8 位 | |
| 页号位数 | 16 − 8 | 8 位 |
| TLB 组数 | 16 项 / 4 路 | 4 组 |
| 组号位数 | 2 位 | |
| Tag 位数 | 页号位数 − 组号位数 = 8 − 2 | 6 位 |
第二步:算页号 22 在 TLB 中的位置
把 8 位页号拆成 [Tag (6 位) | 组号 (2 位)]:
| 字段 | 比特 | 值 |
|---|---|---|
| 组号(低 2 位) | 10 | 2 |
| Tag(高 6 位) | 000101 | 0x05 |
所以页号 22 落在 TLB 组 2,对应的 Tag = 05H。
第三步:"页表与 TLB 同步" 的含义
题目说主存页表与 TLB 表项已同步。意思是:TLB 中存在的页表项必须和主存页表内容一致——但这里有重要区别:
"同步" 只对有效条目(V=1)做约束。V=0 的条目内容是历史残留 / 任意值,与页表当前状态无关。
所以同步后的约束是:
如果 TLB 组 2 中某项的 Tag = 05H 且 V=1,那么它的 PPN 必须等于主存页表中页号 22 的 PPN——而页号 22 的 P=0(未装入),意味着页表中根本没有有效的 PPN 可"同步"过来,TLB 中该位置如果 V=1 就矛盾了。
第四步:逐项核对组号 2 的 TLB 内容
| 选项 | Tag | 对应页号 | V | 含义 | 是否可能 |
|---|---|---|---|---|---|
| A | 05H | = 22 | 1 | 声称"页号 22 在 TLB 中有效",与"页表里 P=0(未装入)"矛盾 | 不可能 |
| B | 06H | = 26 | 1 | 是页号 26 的有效 TLB 项,与页号 22 无关 | 可能 |
| C | 16H | = 90 | 0 | V=0 无效项,其它字段是残留值,任意都行 | 可能 |
| D | 1AH | = 106 | 0 | V=0 无效项,残留值任意 | 可能 |
关键判据:
- 页号 → Tag:Tag = 页号 ÷ 组数 = 页号的高位部分;不同页号的 Tag 通常不同
- 同 Tag 才指同页:A 的 Tag=05H 唯一对应页号 22;B 的 Tag=06H 对应的是页号 26
- V=0 时所有其他字段都不受约束
最终答案是 A。
易错抓手:
- 不要看到 PPN 一样就判"冲突"——不同虚页映射到同一物理页是常见情况(共享页)
- V=0 的 TLB 项中 PPN、Tag 都是垃圾值,不能用"PPN 应等于 X" 反推
- 真正的冲突只发生在 V=1 且 Tag 指向已知"未装入"页号的情形