4. ARM64 页表硬件架构:Translation Regime、TTBR0_EL1 与 TTBR1_EL1、ASID 机制
ARM64 的页表转换并非一个单一的硬件模块,而是由多个独立的 Translation Regime(转换体制) 协同完成。每个 Regime 拥有独立的页表基址寄存器(TTBR0/1)和转换控制寄存器(TCR),并服务于特定的异常等级(EL)和地址空间。理解这些硬件组件的分工与协作,是掌握地址转换全流程的关键。
4.1 Translation Regime:地址空间的硬件隔离
ARM64 架构定义了多个 Translation Regime,每个 Regime 负责一个特定的地址空间转换。这种设计实现了不同异常等级和不同安全状态(Secure/Non-Secure)之间的地址空间硬件级隔离。
| Translation Regime | 关联的异常等级 | 安全状态 | 典型用途 |
|---|---|---|---|
| EL3 Translation Regime | EL3 | Secure | 安全监视器(Secure Monitor)固件 |
| EL2 Translation Regime | EL2 | Non-Secure | 虚拟机监视器(Hypervisor) |
| EL1 Translation Regime | EL1 | Non-Secure | 操作系统内核(Linux Kernel) |
| EL0 Translation Regime | EL0 | Non-Secure | 用户空间应用程序 |
核心要点:在 Linux 内核运行的典型场景(Non-Secure EL1/EL0)中,硬件同时使用 EL1 Translation Regime(用于内核态)和 EL0 Translation Regime(用于用户态)。这两个 Regime 共享相同的页表描述符格式,但使用不同的页表基址寄存器。
4.2 TTBR0_EL1 与 TTBR1_EL1:内核与用户空间的硬件分界
在 EL1 Translation Regime 中,ARM64 提供了两个独立的页表基址寄存器:
- TTBR0_EL1:用于转换 低地址空间(通常为 0x0000_0000_0000_0000 到 0x0000_FFFF_FFFF_FFFF)。在 Linux 中,它被用于用户空间进程的页表。
- TTBR1_EL1:用于转换 高地址空间(通常为 0xFFFF_0000_0000_0000 到 0xFFFF_FFFF_FFFF_FFFF)。在 Linux 中,它被用于内核空间的页表。
硬件通过虚拟地址的最高有效位(VA bit)来决定使用哪个寄存器:
- 如果最高位为 0,则使用 TTBR0_EL1。
- 如果最高位为 1,则使用 TTBR1_EL1。
设计优势:这种硬件级的分割使得进程切换时,只需切换 TTBR0_EL1(指向新进程的用户页表),而 TTBR1_EL1 保持不变(始终指向内核页表)。这避免了每次系统调用或中断进入内核时都需要刷新 TLB 中内核映射的开销。
| 寄存器 | 地址空间范围 | Linux 用途 | 进程切换行为 |
|---|---|---|---|
| TTBR0_EL1 | 低地址空间 (VA[63]=0) | 用户空间页表基址 | 切换进程时更新 |
| TTBR1_EL1 | 高地址空间 (VA[63]=1) | 内核空间页表基址 | 保持不变 |
4.3 ASID 机制:减少 TLB 刷新的硬件优化
ASID(Address Space IDentifier) 是 ARM64 硬件提供的一种优化机制,用于区分不同进程的 TLB 条目。当进程切换时,如果不使用 ASID,操作系统必须刷新整个 TLB,否则新进程可能会错误地命中旧进程的 TLB 条目。
ASID 的工作原理:
- 每个进程被分配一个唯一的 ASID(通常由内核在创建进程时分配)。
- 在 TLB 条目中,除了虚拟地址到物理地址的映射外,还会记录该条目所属的 ASID。
- 当 MMU 进行地址转换时,不仅比较虚拟地址,还会比较当前进程的 ASID 与 TLB 条目中的 ASID。
- 只有 虚拟地址 和 ASID 都匹配时,才视为 TLB 命中。
关键区别:ASID 机制仅适用于 TTBR0_EL1(用户空间)的 TLB 条目。内核空间(TTBR1_EL1)的映射通常是全局的,不关联 ASID,因此在所有进程中共享。
| 特性 | 无 ASID | 有 ASID |
|---|---|---|
| 进程切换时 TLB 操作 | 必须刷新整个 TLB | 无需刷新 TLB(仅切换 ASID) |
| TLB 条目区分 | 仅靠虚拟地址 | 虚拟地址 + ASID |
| 性能影响 | 高(TLB 缺失率上升) | 低(保留有效条目) |
| 硬件支持 | 所有 ARMv8 处理器 | ARMv8.0 及以上(可选,但普遍支持) |
4.4 TCR 寄存器:控制页表转换的全局参数
TCR(Translation Control Register) 是每个 Translation Regime 的配置寄存器,它定义了页表转换的全局参数。对于 EL1 Regime,TCR_EL1 控制着 TTBR0_EL1 和 TTBR1_EL1 的行为。
TCR_EL1 的关键字段:
| 字段 | 位域 | 功能描述 |
|---|---|---|
| T0SZ | [5:0] | TTBR0 地址空间大小偏移量。地址空间大小 = 2^(64 - T0SZ) |
| T1SZ | [21:16] | TTBR1 地址空间大小偏移量。地址空间大小 = 2^(64 - T1SZ) |
| TG0 | [15:14] | TTBR0 的页粒度(4KB、16KB、64KB) |
| TG1 | [31:30] | TTBR1 的页粒度(4KB、16KB、64KB) |
| IPS | [34:32] | 中间物理地址大小(32位、36位、40位、48位、52位) |
| AS | [36] | ASID 大小(8位或16位) |
Linux 典型配置:在 4KB 页、48 位虚拟地址空间的配置下,T0SZ 和 T1SZ 通常设置为 16(64 - 48 = 16)。TG0 和 TG1 设置为 0b10(4KB 粒度)。AS 位决定 ASID 是 8 位(支持 256 个进程)还是 16 位(支持 65536 个进程)。
4.5 硬件转换流程:从 VA 到 PA 的完整路径
结合上述硬件组件,ARM64 的地址转换硬件流程可以概括为以下步骤:
- VA 分类:MMU 检查虚拟地址的最高有效位,决定使用 TTBR0_EL1(用户空间)还是 TTBR1_EL1(内核空间)。
- TLB 查找:MMU 在 TLB 中并行查找与 VA 和当前 ASID(仅 TTBR0 条目)匹配的条目。
- TLB 命中:如果找到匹配条目,直接返回物理地址,转换完成。
- TLB 缺失:如果未命中,MMU 从对应的 TTBR 寄存器读取页表基址,启动硬件页表遍历。
- 页表遍历:MMU 根据 TCR 中配置的粒度、地址宽度和页表层级,逐级读取内存中的页表描述符。
- 权限检查:在遍历过程中,MMU 检查每个描述符的权限位(读/写/执行、EL0/EL1 访问等)。
- TLB 填充:遍历成功后,MMU 将 VA→PA 映射和 ASID 写入 TLB,并返回物理地址。
硬件 vs 软件:ARM64 的页表遍历完全由硬件 MMU 自动完成,无需软件介入。这与早期 ARM 架构(如 ARMv7)中需要软件辅助的 TLB 缺失处理形成鲜明对比,显著降低了 TLB 缺失的开销。