| 项目 | 值 |
|---|---|
| 核心概念 | 将页表本身分页,用层次化结构节省内存 |
| 关键公式 | 总虚拟地址位数 V $=$ 一级页号 $+$ 二级页号 $+$ 偏移 |
| 访存次数 | n 级页表无 TLB 需 n+1 次访存 |
| 考试频率 | ⭐⭐⭐⭐⭐ |
多级页表是为了解决单级页表过大的问题而引入的。核心思想是将页表本身也分页,用层次化的页表结构节省内存。
| 问题 | 说明 |
|---|---|
| 页表太大 | 32 位地址空间 + 4KB 页面 → 需要 $2^{20}$ 个页表项(4MB 页表) |
| 连续存储 | 单级页表要求页表项连续存储 |
| 浪费内存 | 大部分虚拟地址空间未使用,但页表项必须全部存在 |
| 解决方案 | 多级页表:只在需要时才分配页表页 |
单级页表:VPN → PPN(一次查表) 二级页表: 一级页号 → 二级页表基址 → 二级页号 → PPN(两次查表)
| 字段 | 说明 | 位数计算 |
|---|---|---|
| 一级页号(页目录号) | 索引一级页表(页目录表) | 取决于设计 |
| 二级页号 | 索引二级页表 | 取决于设计 |
| 页内偏移 | 页面内的字节偏移 | $\log_2(\text{页面大小})$ |
| 参数 | 公式 |
|---|---|
| 页内偏移位数 | $d = \log_2(\text{页面大小})$ |
| 总虚拟地址位数 | $V = \text{一级页号} + \text{二级页号} + \text{偏移}$ |
| 一级页表项数 | $2^{\text{一级页号位数}}$ |
| 二级页表项数 | $2^{\text{二级页号位数}}$ |
| 每个页表项大小 | 通常 4 字节(32 位系统) |
| 一页能放的页表项数 | $\dfrac{\text{页面大小}}{\text{页表项大小}}$ |
| 访存次数 | n 级页表需要 n+1 次访存(无 TLB 时) |
某系统 32 位虚拟地址,页面大小 4KB,采用二级页表,每个页表项 4 字节。地址划分:一级页号 10 位,二级页号 10 位,偏移 12 位。
32位虚拟地址: | 一级页号(10位) | 二级页号(10位) | 页内偏移(12位) |
页表大小:一级页表 $1024 \times 4\text{B} = $ 4KB(恰好 1 页);每个二级页表同样 4KB;最多 1024 个二级页表。
访存次数:无 TLB 时需要 3 次——①查页目录表(一级页表)得二级页表地址;②查二级页表得物理页框号;③访问目标数据。
64 位系统,页面大小 8KB,页表项 8 字节,采用四级页表。
64位虚拟地址(实际使用53位): | 一级(10) | 二级(10) | 三级(10) | 四级(10) | 偏移(13) |
某系统虚拟地址 32 位,页面大小 4KB,页表项大小 4B,二级页表,设计使得每级页表恰好占一页。
| 一级页号(10) | 二级页号(10) | 偏移(12) |
验证:一级 $2^{10} \times 4\text{B} = 4\text{KB} = 1$ 页 ✓;二级同理 ✓。
上述二级页表系统,无 TLB 时访问一个数据需要 3 次访存(页目录表 → 二级页表 → 目标数据);有 TLB:命中 1 次访存,未命中 3 次 + 将结果写入 TLB。
某系统虚拟地址 36 位,页面大小 16KB,要求每级页表恰好占一页,页表项大小 4B。
| 一级页号(10) | 二级页号(12) | 偏移(14) |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。