ARM64 CPU权限机制
第一类:权限规则
涵盖权限分层、切换规则及流程约束,是权限机制的设计规范。
1. 权限分层规则
- 异常级别(Exception Levels, EL)
-
- EL0(用户态) :
-
- 权限 :仅能执行非特权指令,访问受MMU限制的内存,无法直接访问系统寄存器(如
SCTLR_EL1
)。 - 应用场景:运行用户应用程序。
- 权限 :仅能执行非特权指令,访问受MMU限制的内存,无法直接访问系统寄存器(如
- EL1(内核态) :
-
- 权限 :可配置MMU、处理中断/异常、管理进程调度,访问所有系统寄存器(如
TTBR0_EL1
)。 - 应用场景:运行操作系统内核。
- 权限 :可配置MMU、处理中断/异常、管理进程调度,访问所有系统寄存器(如
- EL2(Hypervisor模式) :
-
- 权限 :控制虚拟机(VM)生命周期,隔离虚拟机内存(通过
VTTBR_EL2
),管理虚拟中断。 - 应用场景:运行Hypervisor(如KVM)。
- 权限 :控制虚拟机(VM)生命周期,隔离虚拟机内存(通过
- EL3(安全监控模式) :
-
- 权限:切换安全世界(Secure World)与非安全世界(Normal World),访问安全资源(如加密引擎)。
- 应用场景:运行安全监控固件(如ARM Trusted Firmware)。
- 权限范围约束:
-
- 高EL可访问低EL资源,反之禁止(如EL1可读写EL0内存,但EL0无法访问EL1的页表寄存器)。
- 安全世界与非安全世界隔离 :非安全EL(如EL1)无法直接访问安全EL3的资源(需通过
SMC
指令)。
2. 异常切换规则
- 触发条件:
-
- 主动切换:
-
- 系统调用 :用户程序执行
SVC
指令,触发EL0→EL1切换。 - 虚拟化管理 :虚拟机内核执行
HVC
指令,触发EL1→EL2切换。 - 安全监控 :非安全内核执行
SMC
指令,触发EL1→EL3切换。
- 系统调用 :用户程序执行
- 被动切换:
-
- 中断:IRQ(普通中断)、FIQ(快速中断)触发当前EL→目标EL(如EL0→EL1)。
- 异常:内存访问错误(Data Abort)、未定义指令(Undefined Instruction)等。
- 异步异常:SError(系统错误,如总线错误)。
- 入口点合法性验证:
-
- 中断向量表基址 :目标EL的向量表地址必须预先配置(如EL1的向量表由
VBAR_EL1
寄存器指定)。 - 目标EL的DABT/IRQ使能 :若目标EL未启用中断或异常处理(如
SCTLR_EL1.I=0
禁止IRQ),触发次级错误。
- 中断向量表基址 :目标EL的向量表地址必须预先配置(如EL1的向量表由
3. 切换流程规则
- 上下文保存与恢复:
-
- 自动保存寄存器(硬件完成):
-
- PC :保存到目标EL的
ELR_ELx
(如EL0→EL1时保存到ELR_EL1
)。 - 处理器状态 :保存到目标EL的
SPSR_ELx
(包括NZCV标志、DAIF掩码、EL级别)。
- PC :保存到目标EL的
- 手动保存寄存器(软件完成):
-
- 通用寄存器 :X0-X30由操作系统保存到当前EL的堆栈(如EL1使用
SP_EL1
)。 - 浮点/NEON寄存器 :若使用需手动保存(通过
STP
指令)。
- 通用寄存器 :X0-X30由操作系统保存到当前EL的堆栈(如EL1使用
- 堆栈切换:
-
- 独立堆栈指针 :每个EL拥有独立的堆栈寄存器(如EL0使用
SP_EL0
,EL1使用SP_EL1
)。 - 切换时机 :权限切换时硬件自动切换堆栈指针(如EL0→EL1时使用
SP_EL1
)。
- 独立堆栈指针 :每个EL拥有独立的堆栈寄存器(如EL0使用
- 权限降级返回:
-
- ERET指令 :从高EL返回低EL时,硬件自动从
ELR_ELx
恢复PC,从SPSR_ELx
恢复处理器状态。 - 状态恢复约束:返回前需确保低EL的上下文完整(如用户态堆栈未被破坏)。
- ERET指令 :从高EL返回低EL时,硬件自动从
第二类:硬件执行机制
涵盖实现权限规则的核心硬件模块及其协作流程。
1. 核心硬件模块
- 权限检查电路(Permission Check Circuitry) :
-
- 指令执行拦截 :在解码阶段检测非法指令(如EL0执行
MSR DAIFSet, #0xF
),触发Undefined Instruction异常。 - 寄存器访问控制 :通过逻辑门阻断低EL对高EL寄存器的访问(如EL0读
SCTLR_EL1
返回全零)。
- 指令执行拦截 :在解码阶段检测非法指令(如EL0执行
- 内存管理单元(MMU) :
-
- 页表权限字段:
-
- AP(Access Permissions) :定义内存区域的读写权限(如
AP=0b11
表示EL0只读,EL1可读写)。 - UXN/PXN:禁止用户模式(UXN)或当前EL(PXN)执行代码。
- NS(Non-Secure) :标记内存属于安全/非安全世界(由EL3控制)。
- AP(Access Permissions) :定义内存区域的读写权限(如
- 地址翻译与拦截:
-
- TLB查询 :若权限不匹配(如EL0写
AP=RO
页),触发Data Abort异常(错误码包含FAR寄存器地址)。
- TLB查询 :若权限不匹配(如EL0写
- 中断控制器(GICv3) :
-
- 中断路由:根据中断类型(IRQ/FIQ)和安全配置,将中断传递到目标EL(如安全中断仅路由到EL3)。
- 虚拟中断支持:为虚拟机提供虚拟中断号(vIRQ),由Hypervisor(EL2)管理。
- 系统寄存器组:
-
- EL专用寄存器:
-
- 控制寄存器 :如
SCTLR_EL1
(启用MMU/缓存)、HCR_EL2
(配置虚拟化)。 - 地址寄存器 :如
TTBR0_EL1
(页表基址)、VBAR_EL1
(中断向量表基址)。
- 控制寄存器 :如
- 状态寄存器 :如
DAIF
(中断掩码)、PSTATE
(当前处理器状态)。
- TrustZone相关模块:
-
- TZASC(TrustZone Address Space Controller) :总线防火墙,拦截非安全世界对安全内存的访问。
- 安全状态机:管理安全世界(Secure World)与非安全世界(Normal World)的切换,由EL3控制。
- 虚拟化支持模块:
-
- VTTBR_EL2:存储虚拟机页表基址,隔离不同VM的内存空间。
- CNTHCTL_EL2:控制虚拟计数器和定时器的访问权限。
2. 硬件执行流程(以中断处理为例)
- 中断触发:
-
- 外设发送中断信号至GIC,GIC根据中断配置(优先级、目标EL)生成IRQ信号。
- 权限验证与切换:
-
- CPU检测到IRQ信号,检查当前EL是否允许处理该中断(如EL0的IRQ是否被屏蔽)。
- 若允许,硬件自动切换至目标EL(如EL1),保存PC到
ELR_EL1
,状态到SPSR_EL1
,切换堆栈至SP_EL1
。
- 中断处理:
-
- CPU从
VBAR_EL1
指向的中断向量表跳转到IRQ处理函数。 - 内核读取GIC的
ICC_IAR1_EL1
寄存器获取中断号,执行设备驱动的中断服务例程。
- CPU从
- 中断结束:
-
- 内核写回GIC的
ICC_EOIR1_EL1
寄存器,标记中断处理完成。 - 通过
ERET
指令返回EL0,恢复ELR_EL1
和SPSR_EL1
,继续执行用户程序。
- 内核写回GIC的
3. 虚拟化切换流程(EL1→EL2)
- 虚拟机触发HVC指令:
-
- 虚拟机内核执行
HVC #0xABCD
,请求Hypervisor服务。
- 虚拟机内核执行
- 权限检查与切换:
-
- 硬件验证EL1是否允许触发HVC(由
HCR_EL2.HCD
配置),若允许则切换到EL2。 - 保存EL1的PC到
ELR_EL2
,状态到SPSR_EL2
,切换堆栈至SP_EL2
。
- 硬件验证EL1是否允许触发HVC(由
- Hypervisor处理:
-
- Hypervisor读取
ESR_EL2
获取HVC调用号,执行对应服务(如调整虚拟机内存映射)。
- Hypervisor读取
- 返回虚拟机:
-
- Hypervisor通过
ERET
指令返回EL1,恢复ELR_EL2
和SPSR_EL2
。
- Hypervisor通过
4. 安全监控切换流程(EL1→EL3)
- 非安全内核触发SMC指令:
-
- 执行
SMC #0x1234
,请求安全监控服务(如密钥管理)。
- 执行
- 权限检查与切换:
-
- 硬件验证SMC调用合法性,切换到EL3,保存上下文到
ELR_EL3
和SPSR_EL3
。
- 硬件验证SMC调用合法性,切换到EL3,保存上下文到
- 安全监控处理:
-
- EL3读取
X0
寄存器获取SMC功能号,执行安全服务(如加解密操作)。
- EL3读取
- 返回非安全世界:
-
- 安全监控程序通过
ERET
指令返回EL1,恢复非安全上下文。
- 安全监控程序通过
硬件协作示意图
+-------------------+ +-------------------+ +-------------------+
| 权限检查电路 | ←→ | MMU | ←→ | 中断控制器(GIC) |
| (指令/寄存器拦截)| (内存访问控制) | (中断路由/ACK) |
+-------------------+ +-------------------+ +-------------------+
↓ ↓ ↓
+-----------------------------------------------------------------------+
| CPU核心(流水线、状态机) |
| 执行流程:取指→解码→权限检查→执行/异常处理→上下文切换→写回 |
+-----------------------------------------------------------------------+
↑ ↑ ↑
+-------------------+ +-------------------+ +-------------------+
| TrustZone模块 | ←→ | 虚拟化模块 | ←→ | 系统寄存器组 |
| (TZASC/安全状态)| (VTTBR_EL2/CNTV) | (SCTLR_EL1/VBAR_EL1)|
+-------------------+ +-------------------+ +-------------------+