Post

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 * 8
  • index = (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 = 0x8000000000080400
  • root_ppn = 0x80400
  • 根页表地址 = 0x80400 << 12 = 0x8040_0000

1) 根页表(L2)非零项

  • 0x8040_0000 -> vpn2=0x0,PTE=0x0000000020100401(非叶子)-> L1 0x8040_1000
  • 0x8040_04a8 -> vpn2=0x95,PTE=0x0000000020101401(非叶子)-> L1 0x8040_5000
  • 0x8040_07f8 -> vpn2=0xff,PTE=0x0000000020100c01(非叶子)-> L1 0x8040_3000

2) L1 继续走

  • L1 0x8040_10000x8040_1000 处 PTE=0x0000000020100801vpn1=0,非叶子 -> L0 0x8040_2000
  • L1 0x8040_30000x8040_3ff8 处 PTE=0x0000000020101001vpn1=0x1ff,非叶子 -> L0 0x8040_4000
  • L1 0x8040_50000x8040_56f0 处 PTE=0x00000037ab400043vpn1=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 AddressSizePPNFlags(DAGUXWRV)
0x0000_0000_0000_10000x10000x0000_0000_0008_0000—UXWRV
0x0000_0000_0000_20000x10000x0000_0000_0008_0001—UXWRV
0x0000_0025_5bc0_00000x20_00000x0000_0000_0dea_d000-A—-RV
0x0000_003f_ffff_f0000x10000x0000_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.
- 浏览 - 访客