背景

  • 假设虚拟地址长度为32位(简化示范)。

  • 页大小为4KB(12位偏移)。

  • 二级页表结构:

    • L1页表索引:10位

    • L2页表索引:10位

    • 页内偏移:12位

虚拟地址结构如下:

31 … 22 21 … 12 11 … 0
L1索引 L2索引 页内偏移

1. CPU访问虚拟地址

CPU需要访问某个虚拟地址VA,比如0x12345678。


2. 解析虚拟地址各字段

根据虚拟地址结构,CPU先将VA拆成三部分:

  • L1索引 = VA[31:22],用来在一级页表中索引

  • L2索引 = VA[21:12],用来在二级页表中索引

  • 页内偏移 = VA[11:0],是页内具体地址偏移


3. 通过CR3(或satp寄存器)拿到L1页表的物理基地址

操作系统把一级页表的物理页框地址存放在一个特殊寄存器(x86的CR3,RISC-V的satp)中。


4. 找一级页表项(L1 PTE)

用L1索引乘以页表项大小,找到一级页表中对应的PTE。

  • 这个PTE里存储的PPN是下一层页表(二级页表)的物理页号

  • PTE中还有权限位、有效位等,用来判断页表项是否有效。


5. 判断L1 PTE有效性

如果L1页表项无效,产生页表异常(page fault),操作系统介入处理。


6. 找二级页表(L2页表)

拿到L1 PTE中的PPN,换算成物理地址(PPN * 页大小),得到二级页表所在物理内存页的起始地址。


7. 找二级页表项(L2 PTE)

用L2索引乘以PTE大小,找到二级页表中对应的页表项。


8. 判断L2 PTE有效性

如果无效,产生页表异常。


9. 拿到L2页表项中的PPN

  • 这个PPN就是虚拟页真正映射到的物理页框号

  • L2页表项中的权限位用来判断访问权限(读、写、执行等)。


10. 计算物理地址

物理地址 = L2页表项PPN × 页大小 + 页内偏移


11. 访问物理内存

CPU根据计算出来的物理地址访问内存,完成读写。


12. 总结流程的关键点

  • L1页表项的PPN:指向二级页表的物理页框。它不是最终的物理页,而是“下一层页表”的地址。

  • L2页表项的PPN:指向虚拟地址最终映射的物理内存页框。

  • 通过两级索引逐层查页表,逐步定位最终物理页。