8.3 存储专题(二):TLB—页表—Cache 地址转换全流程

408 存储系统压轴题的完整解法——虚拟地址与物理地址的字段划分,TLB(组相联/全相联)的查找,页表与缺页,物理地址到 Cache 字段的再划分与命中判断,以及页表项地址、多级页表和 Cache 总容量的计算。

考查要求 ★★★ 重点掌握 虚页号/页内偏移TLB 组号与标记页框号拼接偏移Cache 标记/组号/块内地址有效位缺页与重新执行页表项地址两级页表

一次访存的全过程

带 TLB 和 Cache 的系统中,CPU 发出的是虚拟地址,最终访问 Cache 和主存用的是物理地址。中间要经过两次”查表”:先由 TLB(或页表)完成地址转换,再由 Cache 判断数据是否在高速缓存中。

命中缺失有效位为 1有效位为 0重新执行命中缺失虚拟地址虚页号 | 页内偏移① 查 TLB② 查页表在主存中缺页异常OS 从磁盘调页③ 物理地址页框号 | 页内偏移④⑤ 查 Cache从 Cache 取数访问主存并把块调入 Cache
一次访存:先转换地址,再访问 Cache

页内偏移在转换中原样复制,只有虚页号被替换为页框号。转换得到物理地址后,要按 Cache 的结构重新划分这串二进制位——这是很多同学容易卡住的地方:页框号与 Cache 标记的边界通常不重合。

字段划分

设虚拟地址 nvn_v 位、物理地址 npn_p 位、页大小 2p2^p B,TLB 有 2t2^t 组,Cache 有 2c2^c 组、块大小 2b2^b B(按字节编址):

地址字段划分(高位 → 低位)
虚拟地址虚页号(nv−pn_v - p 位)| 页内偏移(pp 位)
虚页号用于查 TLBTLB 标记(nv−p−tn_v - p - t 位)| TLB 组号(tt 位);全相联时整个虚页号都是标记
物理地址页框号(np−pn_p - p 位)| 页内偏移(pp 位)
物理地址用于查 CacheCache 标记(np−c−bn_p - c - b 位)| 组号(cc 位)| 块内地址(bb 位)

动手:逐步转换

下面的实验给出了某一时刻 TLB、页表(部分)和 Cache 标记阵列的内容。输入虚拟地址或点击示例按钮,逐步观察转换过程。示例覆盖了所有可能的组合:TLB 命中 / 缺失、缺页、Cache 命中 / 缺失,以及”标记相同但无效”的陷阱:

动画演示虚实地址转换全流程:TLB → 页表 → Cache
虚拟地址 000038AEHTLB 标记(18 位)—TLB 组号(2 位)—页内偏移(12 位)—TLB(快表)4 组 × 2 路 每项:有效位 / 标记 / 页框号组01 │ 00001H │ 0F2H0 │ 00000H │ 000H组11 │ 00029H │ 31FH1 │ 00000H │ 02DH组21 │ 00001H │ 07AH0 │ 00000H │ 000H组31 │ 0001FH │ 2A1H0 │ 00000H │ 369H页表(部分,在主存中)虚页号   有效位 页框号00000H1013H00001H102DH00002H0—00003H1369H00004H10F2H00005H1335H00006H107AH00007H0—0007FH12A1H000A5H131FH物理地址 页框号(12 位)—页内偏移(12 位)—Cache 标记(15 位)—组号(3 位)—块内地址(6 位)—Cache 标记阵列 每项:有效位 / 标记组01 │ 0A11H0 │ 0000H组11 │ 1D00H1 │ 0010H组21 │ 1B4CH1 │ 0D3AH组31 │ 03D4H1 │ 1200H组41 │ 016BH0 │ 0000H组50 │ 0000H0 │ 0000H组61 │ 0799H1 │ 0001H组71 │ 0A11H1 │ 18F8H
正在查找命中缺失 / 缺页
1/8地址结构:虚拟地址 32 位 = 虚页号 20 位 + 页内偏移 12 位;TLB 2 路组相联共 4 组:虚页号低 2 位为 TLB 组号,高 18 位为 TLB 标记;物理地址 24 位 = 页框号 12 位 + 页内偏移 12 位 = Cache 标记 15 位 + 组号 3 位 + 块内地址 6 位
综合题(408 真题改编,对应实验中的题型一)

某计算机采用页式虚拟存储管理,按字节编址,虚拟地址 32 位,页大小 4 KB,物理存储器 16 MB;TLB 采用 2 路组相联,共 4 组;Cache 采用 2 路组相联,共 8 组,主存块 64 B。某时刻 TLB、页表和 Cache 的部分内容如上面的实验所示。(1) 虚拟地址、物理地址各字段的位数是多少?(2) 用物理地址访问 Cache 时,地址被分为哪三个字段,各占多少位?(3) 虚拟地址 000038AEH 所在页面是否在主存中?物理地址是多少?Cache 是否命中?(4) 访问虚拟地址 000A53CAH 时,数据从何处得到?(5) TLB 起什么作用?

查看解答

(1) 页内偏移 log₂ 4K = 12 位,虚页号 32 − 12 = 20 位;物理地址 log₂ 16M = 24 位,页框号 24 − 12 = 12 位。

(2) 块内地址 log₂ 64 = 6 位,组号 log₂ 8 = 3 位,Cache 标记 24 − 3 − 6 = 15 位。

(3) 虚页号 = 00003H,页内偏移 = 8AEH。TLB 组号 = 3 mod 4 = 3,标记 = 0,第 3 组中没有有效且标记为 0 的项(有一项标记为 0 但有效位为 0),TLB 缺失;查页表第 3 项,有效位为 1,页面在主存中,页框号 369H。物理地址 = 3698AEH。

3698AEH = 0011 0110 1001 100 | 010 | 10 1110:标记 1B4CH,组号 2,块内地址 2EH。Cache 第 2 组中有有效且标记为 1B4CH 的行,Cache 命中。

(4) 000A53CAH:虚页号 = 000A5H = 0000 0000 0000 1010 01 | 01,TLB 组号 = 1,标记 = 29H。TLB 第 1 组中有有效项标记 0029H,TLB 命中,页框号 31FH,物理地址 31F3CAH。

31F3CAH = 0011 0001 1111 001 | 111 | 00 1010:标记 18F9H,组号 7。第 7 组的两行标记分别为 0A11H 和 18F8H,Cache 缺失。所以数据在主存中但不在 Cache 中,需从主存读出,同时把该块调入 Cache。

(5) TLB 是存放最近使用的页表项的高速缓存。地址转换时若 TLB 命中,就不必访问主存中的页表,节省了一次访存,从而加快了虚拟地址到物理地址的转换。

综合题(408 真题改编,对应实验中的题型二)

某计算机采用页式虚拟存储管理,按字节编址,虚拟地址 32 位,物理地址 24 位,页大小 8 KB;TLB 采用全相联映射;Cache 数据区 64 KB,按 2 路组相联组织,主存块 64 B。(1) 虚拟地址中虚页号、页内偏移各几位?TLB 标记几位?(2) 物理地址中 Cache 标记、组号、块内地址各几位?(3) 若 Cache 采用写回法和 LRU 替换,每个 Cache 行需要哪些控制位?Cache 总容量是多少?

查看解答

(1) 页内偏移 log₂ 8K = 13 位,虚页号 32 − 13 = 19 位。TLB 全相联,没有组号,虚页号整体作为标记:19 位。页框号 24 − 13 = 11 位。

(2) Cache 行数 64 KB / 64 B = 1024,组数 1024 / 2 = 512。块内地址 6 位,组号 9 位,标记 24 − 9 − 6 = 9 位。

(3) 每行需要:有效位 1 位、写回法的修改位(脏位)1 位、2 路组相联的 LRU 位 1 位,以及 9 位标记。总容量:

1024×(64×8+9+1+1+1)=1024×524=536 576 位=67 072 B≈65.5 KB1024 \times (64 \times 8 + 9 + 1 + 1 + 1) = 1024 \times 524 = 536\,576 \text{ 位} = 67\,072 \text{ B} \approx 65.5 \text{ KB}

页表项地址与多级页表

页表存放在主存中,CPU 中的页表基址寄存器保存当前进程页表的起始物理地址。查页表时:

页表项地址=页表基址+虚页号×页表项大小\text{页表项地址} = \text{页表基址} + \text{虚页号} \times \text{页表项大小}

虚拟地址空间很大时,一张页表会占用太多连续主存(32 位地址、4 KB 页、4 B 页表项时页表达 4 MB),因此采用两级页表:把页表本身也分页,用一张页目录记录各个页表页的位置。

字段页目录号页表索引页内偏移
位数(32 位地址、4 KB 页、4 B 页表项)101012

一个页面 4 KB 正好放 1024 = 2¹⁰ 个 4 B 的页表项,所以每级索引是 10 位。转换时:页目录基址 + 页目录号 × 4 → 页目录项,得到页表的页框号;页表起始地址 + 页表索引 × 4 → 页表项,得到页框号;最后拼接页内偏移。不命中 TLB 时,两级页表需要访问主存 2 次才能得到物理地址,再加上访问数据本身,共 3 次。

例题

某系统虚拟地址 32 位,页大小 4 KB,页表项 4 B,采用两级页表,页目录的起始物理地址为 00200000H。若虚拟地址为 00C03A7CH,则 CPU 要访问的页目录项的物理地址是多少?虚拟地址中页表索引的值是多少?

查看解答

00C03A7CH = 0000 0000 11 | 00 0000 0011 | 1010 0111 1100。页目录号 = 0000000011B = 3,页表索引 = 0000000011B = 3,页内偏移 = A7CH。

页目录项地址 = 00200000H + 3 × 4 = 0020000CH;页表索引为 3。

即时练习

即时练习5 题
点击选项即可作答
  1. 1
    某系统虚拟地址 32 位,页大小 4 KB,TLB 为 4 路组相联共 16 组。则虚拟地址中用作 TLB 标记的位数为( )。
  2. 2
    页大小 4 KB、按字节编址,虚拟地址 0001 2345H 对应的页表项中页框号为 0ABH,则物理地址为( )。
  3. 3
    物理地址 24 位,Cache 为 2 路组相联、共 8 组、块大小 64 B。物理地址 3698AEH 映射到 Cache 的组号是( )。
  4. 4
    采用 TLB 和两级页表的系统中,若一次访存时 TLB 缺失、页表项均在主存中、Cache 也缺失,则这次访问共访问主存( )次。
  5. 5
    下列关于 TLB 和 Cache 的叙述中,错误的是( )。
学完了吗?

标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。