8.3 存储专题(二):TLB—页表—Cache 地址转换全流程
408 存储系统压轴题的完整解法——虚拟地址与物理地址的字段划分,TLB(组相联/全相联)的查找,页表与缺页,物理地址到 Cache 字段的再划分与命中判断,以及页表项地址、多级页表和 Cache 总容量的计算。
一次访存的全过程
带 TLB 和 Cache 的系统中,CPU 发出的是虚拟地址,最终访问 Cache 和主存用的是物理地址。中间要经过两次”查表”:先由 TLB(或页表)完成地址转换,再由 Cache 判断数据是否在高速缓存中。
页内偏移在转换中原样复制,只有虚页号被替换为页框号。转换得到物理地址后,要按 Cache 的结构重新划分这串二进制位——这是很多同学容易卡住的地方:页框号与 Cache 标记的边界通常不重合。
字段划分
设虚拟地址 位、物理地址 位、页大小 B,TLB 有 组,Cache 有 组、块大小 B(按字节编址):
| 地址 | 字段划分(高位 → 低位) |
|---|---|
| 虚拟地址 | 虚页号( 位)| 页内偏移( 位) |
| 虚页号用于查 TLB | TLB 标记( 位)| TLB 组号( 位);全相联时整个虚页号都是标记 |
| 物理地址 | 页框号( 位)| 页内偏移( 位) |
| 物理地址用于查 Cache | Cache 标记( 位)| 组号( 位)| 块内地址( 位) |
动手:逐步转换
下面的实验给出了某一时刻 TLB、页表(部分)和 Cache 标记阵列的内容。输入虚拟地址或点击示例按钮,逐步观察转换过程。示例覆盖了所有可能的组合:TLB 命中 / 缺失、缺页、Cache 命中 / 缺失,以及”标记相同但无效”的陷阱:
某计算机采用页式虚拟存储管理,按字节编址,虚拟地址 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 命中,就不必访问主存中的页表,节省了一次访存,从而加快了虚拟地址到物理地址的转换。
某计算机采用页式虚拟存储管理,按字节编址,虚拟地址 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 位标记。总容量:
页表项地址与多级页表
页表存放在主存中,CPU 中的页表基址寄存器保存当前进程页表的起始物理地址。查页表时:
虚拟地址空间很大时,一张页表会占用太多连续主存(32 位地址、4 KB 页、4 B 页表项时页表达 4 MB),因此采用两级页表:把页表本身也分页,用一张页目录记录各个页表页的位置。
| 字段 | 页目录号 | 页表索引 | 页内偏移 |
|---|---|---|---|
| 位数(32 位地址、4 KB 页、4 B 页表项) | 10 | 10 | 12 |
一个页面 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。
即时练习
- 1某系统虚拟地址 32 位,页大小 4 KB,TLB 为 4 路组相联共 16 组。则虚拟地址中用作 TLB 标记的位数为( )。
- 2页大小 4 KB、按字节编址,虚拟地址 0001 2345H 对应的页表项中页框号为 0ABH,则物理地址为( )。
- 3物理地址 24 位,Cache 为 2 路组相联、共 8 组、块大小 64 B。物理地址 3698AEH 映射到 Cache 的组号是( )。
- 4采用 TLB 和两级页表的系统中,若一次访存时 TLB 缺失、页表项均在主存中、Cache 也缺失,则这次访问共访问主存( )次。
- 5下列关于 TLB 和 Cache 的叙述中,错误的是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。