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 共享相同的页表描述符格式,但使用不同的页表基址寄存器。
ARM64 Translation Regime 架构总览 EL3 Translation Regime (Secure Monitor) EL2 Translation Regime (Hypervisor) EL1 Translation Regime (Kernel) EL0 Translation Regime (Userspace) Linux 内核主要工作在 EL1/EL0 Non-Secure Regime,使用 TTBR0_EL1 和 TTBR1_EL1

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) 内核空间页表基址 保持不变
TTBR0_EL1 与 TTBR1_EL1 地址空间划分 用户空间 (TTBR0_EL1) 内核空间 (TTBR1_EL1) VA[63] = 0 / 1 硬件选择 TTBR0_EL1 (进程私有) TTBR1_EL1 (全局共享) 进程切换时仅更新 TTBR0_EL1,TTBR1_EL1 指向的内核页表保持不变

4.3 ASID 机制:减少 TLB 刷新的硬件优化

ASID(Address Space IDentifier) 是 ARM64 硬件提供的一种优化机制,用于区分不同进程的 TLB 条目。当进程切换时,如果不使用 ASID,操作系统必须刷新整个 TLB,否则新进程可能会错误地命中旧进程的 TLB 条目。

ASID 的工作原理:

  1. 每个进程被分配一个唯一的 ASID(通常由内核在创建进程时分配)。
  2. 在 TLB 条目中,除了虚拟地址到物理地址的映射外,还会记录该条目所属的 ASID。
  3. 当 MMU 进行地址转换时,不仅比较虚拟地址,还会比较当前进程的 ASID 与 TLB 条目中的 ASID。
  4. 只有 虚拟地址 和 ASID 都匹配时,才视为 TLB 命中。
关键区别:ASID 机制仅适用于 TTBR0_EL1(用户空间)的 TLB 条目。内核空间(TTBR1_EL1)的映射通常是全局的,不关联 ASID,因此在所有进程中共享。
特性 无 ASID 有 ASID
进程切换时 TLB 操作 必须刷新整个 TLB 无需刷新 TLB(仅切换 ASID)
TLB 条目区分 仅靠虚拟地址 虚拟地址 + ASID
性能影响 高(TLB 缺失率上升) 低(保留有效条目)
硬件支持 所有 ARMv8 处理器 ARMv8.0 及以上(可选,但普遍支持)
ASID 机制:TLB 条目区分与进程切换 进程 A (ASID=5) 进程 B (ASID=8) 进程切换 TLB 内容(进程切换后,未刷新) VA: 0x1000 → PA: 0x5000 | ASID=5 VA: 0x2000 → PA: 0x6000 | ASID=8 VA: 0x3000 → PA: 0x7000 | ASID=5 VA: 0x4000 → PA: 0x8000 | ASID=8 进程 B 运行时,MMU 只匹配 ASID=8 的 TLB 条目,ASID=5 的条目被忽略但保留在 TLB 中

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 个进程)。
TCR_EL1 控制字段与地址空间关系 TCR_EL1 寄存器 T0SZ (TTBR0 大小) T1SZ (TTBR1 大小) TG0/TG1 (粒度) IPS (PA 大小) 决定:虚拟地址宽度 | 页表层级数 | 物理地址宽度 | ASID 位数 例如:T0SZ=16 → 48位虚拟地址空间;TG0=10b → 4KB页粒度

4.5 硬件转换流程:从 VA 到 PA 的完整路径

结合上述硬件组件,ARM64 的地址转换硬件流程可以概括为以下步骤:

  1. VA 分类:MMU 检查虚拟地址的最高有效位,决定使用 TTBR0_EL1(用户空间)还是 TTBR1_EL1(内核空间)。
  2. TLB 查找:MMU 在 TLB 中并行查找与 VA 和当前 ASID(仅 TTBR0 条目)匹配的条目。
  3. TLB 命中:如果找到匹配条目,直接返回物理地址,转换完成。
  4. TLB 缺失:如果未命中,MMU 从对应的 TTBR 寄存器读取页表基址,启动硬件页表遍历。
  5. 页表遍历:MMU 根据 TCR 中配置的粒度、地址宽度和页表层级,逐级读取内存中的页表描述符。
  6. 权限检查:在遍历过程中,MMU 检查每个描述符的权限位(读/写/执行、EL0/EL1 访问等)。
  7. TLB 填充:遍历成功后,MMU 将 VA→PA 映射和 ASID 写入 TLB,并返回物理地址。
硬件 vs 软件:ARM64 的页表遍历完全由硬件 MMU 自动完成,无需软件介入。这与早期 ARM 架构(如 ARMv7)中需要软件辅助的 TLB 缺失处理形成鲜明对比,显著降低了 TLB 缺失的开销。
ARM64 硬件地址转换完整流程 1. VA 分类 (VA[63]) VA[63]=0 VA[63]=1 2. TLB 查找 (VA + ASID 匹配) TLB 命中 → 返回 PA TLB 缺失 → 页表遍历 3. 硬件页表遍历 (逐级读取) 填充 TLB + 返回 PA