ARM32架构使用两级页表结构将虚拟地址转换为物理地址,以下为详细流程及案例分析:
ARM32页表映射流程
1.获取页目录基地址
MMU通过TTBR(Translation Table Base Register)寄存器获取当前进程的一级页表(L1页表,即页目录)基地址。
2.解析虚拟地址结构
虚拟地址(VA)被划分为三部分(以4KB页为例):
Bits[31:20]:一级页表索引(L1 Index),定位页目录项(PDE)。
Bits[19:12]:二级页表索引(L2 Index),定位页表项(PTE)。
Bits[11:0]:页内偏移(Offset),用于最终物理地址计算。
3.一级页表查询
计算页目录项地址:L1_Addr = TTBR_Base + L1_Index * 4
读取页目录项(PDE)。若PDE指向二级页表(L2页表),则继续;若指向1MB大页,直接计算物理地址。
4.二级页表查询
从PDE中获取二级页表基地址(L2_Base)。
计算页表项地址:L2_Addr = L2_Base + L2_Index * 4
读取页表项(PTE),获取物理页基地址(Physical Page Base)。
5.合成物理地址
物理地址 = (Physical_Page_Base << 12) + Offset
6.权限与异常检查
MMU检查AP(访问权限)、XN(执行权限)等属性位,若违反则触发缺页异常(Page Fault)。
案例分析:虚拟地址0x2000映射到物理地址0x3000
假设条件
页目录基地址(TTBR):0x80000000
二级页表基地址:0x90000000
页大小:4KB
虚拟地址:0x00002000(目标映射到物理地址0x3000)
步骤分解
1.虚拟地址划分
VA = 0x00002000 → 二进制:0000 0000 0000 0000 0010 0000 0000 0000
L1 Index (Bits[31:20]):0x000 → 索引0
L2 Index (Bits[19:12]):0x02 → 索引2
Offset (Bits[11:0]):0x000
2.一级页表查询
PDE地址 = 0x80000000 + 0 * 4 = 0x80000000
PDE内容:0x90000003(L2基地址=0x90000000,属性位0x3表示有效且可读写)。
3.二级页表查询
PTE地址 = 0x90000000 + 2 * 4 = 0x90000008
PTE内容:0x00003003(物理页基地址高20位=0x3,属性位0x3)。
物理页基地址 = 0x3 << 12 = 0x3000。
4.合成物理地址
物理地址 = 0x3000 + 0x000 = 0x3000。
关键点
地址对齐:物理页基地址必须按页大小对齐(如4KB对齐时,低12位为0)。
属性位:页表项的低12位存储权限(AP)、缓存策略(C/B)、执行权限(XN)等。
TLB加速:首次转换后,结果缓存至TLB,后续访问无需遍历页表。
异常处理:非法访问或权限错误会触发缺页异常,由操作系统处理。
流程图
虚拟地址0x00002000
│
├─L1 Index=0 → PDE地址0x80000000 → 指向L2基地址0x90000000
│
├─L2 Index=2 → PTE地址0x90000008 → 物理页基地址0x3000
│
└─Offset=0 → 物理地址0x3000
通过上述流程,ARM32 MMU高效完成虚拟地址到物理地址的转换,同时确保内存访问的安全性与灵活性。