Sv39 手工页表翻译做题方法(含 satp+hexdump 例题)
Sv39 手工页表翻译做题方法(含 satp+hexdump 例题)
这类题的核心不是“记答案”,而是把流程固定下来。下面给出一套可重复使用的方法,再用本题数据完整代入。
一、通用做题方法(模板)
1. 先从 satp 拿到根页表物理地址
- Sv39 下,
MODE=8。 satp[43:0]是根页表PPN。- 根页表物理地址:
root_pa = root_ppn << 12。
2. 用 hexdump 地址反推索引
任一层页表都满足:
pte_pa = table_base + index * 8index = (pte_pa - table_base) / 8
这样就能从 hexdump 里“某个非零 PTE 的地址”直接反推该层的 vpn2/vpn1/vpn0 索引。
3. 每看见一个 PTE,先做“叶子/非叶子”判断
- 看
X/W/R三位: - 若
X=W=R=0,是非叶子,指向下一级页表。 - 否则是叶子,当前层结束翻译。
再统一计算:
ppn = pte >> 10- 若非叶子:下一级页表基址
next_table_pa = ppn << 12 - 若叶子:得到物理页号,随后拼虚拟地址范围和页大小
4. 根据“停在哪一层”确定页大小
- L0 叶子:4KiB
- L1 叶子:2MiB
- L2 叶子:1GiB
5. 组装虚拟地址基址
- L0 叶子:
va_base = (vpn2<<30) | (vpn1<<21) | (vpn0<<12) - L1 叶子:
va_base = (vpn2<<30) | (vpn1<<21)(vpn0作为页内偏移) - L2 叶子:
va_base = (vpn2<<30)
6. 解析标志位(DAGUXWRV)
按 D A G U X W R V 顺序写即可:
V有效位R/W/X读写执行U用户态可访问G/A/D全局、访问、脏位
最终输出建议统一成 4 列:
- Virtual Address(虚拟页基址)
- Size(映射大小)
- PPN(物理页号)
- Flags(DAGUXWRV)
二、本题代入(satp + hexdump)
已知:
satp = 0x8000000000080400root_ppn = 0x80400- 根页表地址
= 0x80400 << 12 = 0x8040_0000
1) 根页表(L2)非零项
0x8040_0000->vpn2=0x0,PTE=0x0000000020100401(非叶子)-> L10x8040_10000x8040_04a8->vpn2=0x95,PTE=0x0000000020101401(非叶子)-> L10x8040_50000x8040_07f8->vpn2=0xff,PTE=0x0000000020100c01(非叶子)-> L10x8040_3000
2) L1 继续走
- L1
0x8040_1000:0x8040_1000处 PTE=0x0000000020100801,vpn1=0,非叶子 -> L00x8040_2000 - L1
0x8040_3000:0x8040_3ff8处 PTE=0x0000000020101001,vpn1=0x1ff,非叶子 -> L00x8040_4000 - L1
0x8040_5000:0x8040_56f0处 PTE=0x00000037ab400043,vpn1=0xde,叶子(2MiB)
3) L0 叶子项
- L0
0x8040_2000: 0x8040_2008->vpn0=1,PTE=0x000000002000001f(4KiB 叶子)0x8040_2010->vpn0=2,PTE=0x000000002000041f(4KiB 叶子)- L0
0x8040_4000: 0x8040_4ff8->vpn0=0x1ff,PTE=0x000000003777400b(4KiB 叶子)
三、最终有效映射表
| Virtual Address | Size | PPN | Flags(DAGUXWRV) |
|---|---|---|---|
| 0x0000_0000_0000_1000 | 0x1000 | 0x0000_0000_0008_0000 | —UXWRV |
| 0x0000_0000_0000_2000 | 0x1000 | 0x0000_0000_0008_0001 | —UXWRV |
| 0x0000_0025_5bc0_0000 | 0x20_0000 | 0x0000_0000_0dea_d000 | -A—-RV |
| 0x0000_003f_ffff_f000 | 0x1000 | 0x0000_0000_000d_ddd0 | —-X-RV |
补充:
- 上表
PPN列是物理页号,不是物理基址。 - 若题目要求物理基址:
PA_base = PPN << 12。
四、考试时的速查清单
- 先拆
satp:拿root_ppn与根页表地址。 - 用
index = (pte_pa - table_base)/8反推索引。 - 每个 PTE 都先看
X/W/R判断叶子或下钻。 - 叶子层级决定页大小(L0 4KiB, L1 2MiB, L2 1GiB)。
- 用对应公式拼
va_base。 - 统一输出四列表格,避免漏项。
This post is licensed under CC BY 4.0 by the author.