背景
-
假设虚拟地址长度为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:指向虚拟地址最终映射的物理内存页框。
-
通过两级索引逐层查页表,逐步定位最终物理页。