cpu权限管理

ARM64 CPU权限机制


第一类:权限规则

涵盖权限分层、切换规则及流程约束,是权限机制的设计规范。


1. 权限分层规则
  • 异常级别(Exception Levels, EL)
    • EL0(用户态)
      • 权限 :仅能执行非特权指令,访问受MMU限制的内存,无法直接访问系统寄存器(如SCTLR_EL1)。
      • 应用场景:运行用户应用程序。
    • EL1(内核态)
      • 权限 :可配置MMU、处理中断/异常、管理进程调度,访问所有系统寄存器(如TTBR0_EL1)。
      • 应用场景:运行操作系统内核。
    • EL2(Hypervisor模式)
      • 权限 :控制虚拟机(VM)生命周期,隔离虚拟机内存(通过VTTBR_EL2),管理虚拟中断。
      • 应用场景:运行Hypervisor(如KVM)。
    • 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),触发次级错误。
3. 切换流程规则
  • 上下文保存与恢复
    • 自动保存寄存器(硬件完成):
      • PC :保存到目标EL的ELR_ELx(如EL0→EL1时保存到ELR_EL1)。
      • 处理器状态 :保存到目标EL的SPSR_ELx(包括NZCV标志、DAIF掩码、EL级别)。
    • 手动保存寄存器(软件完成):
      • 通用寄存器 :X0-X30由操作系统保存到当前EL的堆栈(如EL1使用SP_EL1)。
      • 浮点/NEON寄存器 :若使用需手动保存(通过STP指令)。
  • 堆栈切换
    • 独立堆栈指针 :每个EL拥有独立的堆栈寄存器(如EL0使用SP_EL0,EL1使用SP_EL1)。
    • 切换时机 :权限切换时硬件自动切换堆栈指针(如EL0→EL1时使用SP_EL1)。
  • 权限降级返回
    • ERET指令 :从高EL返回低EL时,硬件自动从ELR_ELx恢复PC,从SPSR_ELx恢复处理器状态。
    • 状态恢复约束:返回前需确保低EL的上下文完整(如用户态堆栈未被破坏)。

第二类:硬件执行机制

涵盖实现权限规则的核心硬件模块及其协作流程。


1. 核心硬件模块
  • 权限检查电路(Permission Check Circuitry)
    • 指令执行拦截 :在解码阶段检测非法指令(如EL0执行MSR DAIFSet, #0xF),触发Undefined Instruction异常。
    • 寄存器访问控制 :通过逻辑门阻断低EL对高EL寄存器的访问(如EL0读SCTLR_EL1返回全零)。
  • 内存管理单元(MMU)
    • 页表权限字段
      • AP(Access Permissions) :定义内存区域的读写权限(如AP=0b11表示EL0只读,EL1可读写)。
      • UXN/PXN:禁止用户模式(UXN)或当前EL(PXN)执行代码。
      • NS(Non-Secure) :标记内存属于安全/非安全世界(由EL3控制)。
    • 地址翻译与拦截
      • TLB查询 :若权限不匹配(如EL0写AP=RO页),触发Data Abort异常(错误码包含FAR寄存器地址)。
  • 中断控制器(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. 硬件执行流程(以中断处理为例)
  1. 中断触发
    • 外设发送中断信号至GIC,GIC根据中断配置(优先级、目标EL)生成IRQ信号。
  2. 权限验证与切换
    • CPU检测到IRQ信号,检查当前EL是否允许处理该中断(如EL0的IRQ是否被屏蔽)。
    • 若允许,硬件自动切换至目标EL(如EL1),保存PC到ELR_EL1,状态到SPSR_EL1,切换堆栈至SP_EL1
  3. 中断处理
    • CPU从VBAR_EL1指向的中断向量表跳转到IRQ处理函数。
    • 内核读取GIC的ICC_IAR1_EL1寄存器获取中断号,执行设备驱动的中断服务例程。
  4. 中断结束
    • 内核写回GIC的ICC_EOIR1_EL1寄存器,标记中断处理完成。
    • 通过ERET指令返回EL0,恢复ELR_EL1SPSR_EL1,继续执行用户程序。
3. 虚拟化切换流程(EL1→EL2)
  1. 虚拟机触发HVC指令
    • 虚拟机内核执行HVC #0xABCD,请求Hypervisor服务。
  2. 权限检查与切换
    • 硬件验证EL1是否允许触发HVC(由HCR_EL2.HCD配置),若允许则切换到EL2。
    • 保存EL1的PC到ELR_EL2,状态到SPSR_EL2,切换堆栈至SP_EL2
  3. Hypervisor处理
    • Hypervisor读取ESR_EL2获取HVC调用号,执行对应服务(如调整虚拟机内存映射)。
  4. 返回虚拟机
    • Hypervisor通过ERET指令返回EL1,恢复ELR_EL2SPSR_EL2
4. 安全监控切换流程(EL1→EL3)
  1. 非安全内核触发SMC指令
    • 执行SMC #0x1234,请求安全监控服务(如密钥管理)。
  2. 权限检查与切换
    • 硬件验证SMC调用合法性,切换到EL3,保存上下文到ELR_EL3SPSR_EL3
  3. 安全监控处理
    • EL3读取X0寄存器获取SMC功能号,执行安全服务(如加解密操作)。
  4. 返回非安全世界
    • 安全监控程序通过ERET指令返回EL1,恢复非安全上下文。

硬件协作示意图

+-------------------+ +-------------------+ +-------------------+

| 权限检查电路 | ←→ | MMU | ←→ | 中断控制器(GIC) |

| (指令/寄存器拦截)| (内存访问控制) | (中断路由/ACK) |

+-------------------+ +-------------------+ +-------------------+

↓ ↓ ↓

+-----------------------------------------------------------------------+

| CPU核心(流水线、状态机) |

| 执行流程:取指→解码→权限检查→执行/异常处理→上下文切换→写回 |

+-----------------------------------------------------------------------+

↑ ↑ ↑

+-------------------+ +-------------------+ +-------------------+

| TrustZone模块 | ←→ | 虚拟化模块 | ←→ | 系统寄存器组 |

| (TZASC/安全状态)| (VTTBR_EL2/CNTV) | (SCTLR_EL1/VBAR_EL1)|

+-------------------+ +-------------------+ +-------------------+

相关推荐
草捏子9 小时前
为什么CPU缓存偏偏是三级?少一级不够,多一级浪费?
cpu
用户33766763012405 天前
关于寄存器的秘密?流水线寄存器冲突的解决方案?原来真实寄存器的数量有可能上千个?
cpu
HyperAI超神经6 天前
【TVM教程】使用自定义调度规则(Sketch Rule)在 CPU 上自动调度稀疏矩阵乘法
人工智能·深度学习·矩阵·编程·cpu·计算机语言·tvm
A.sir啊1 个月前
计算机组成原理知识点精汇(一)计算机基础知识
硬件架构·cpu·计算机组成原理·冯诺依曼
问道飞鱼2 个月前
【知识科普】CPU,GPN,NPU知识普及
cpu·gpu·npu
Ronin-Lotus2 个月前
嵌入式硬件篇---CPU&GPU&TPU
嵌入式硬件·学习·cpu·gpu·tpu
zfj3212 个月前
学技术学英语:elasticsearch硬件相关的配置&优化技巧
网络·elasticsearch·全文检索·内存·cpu·磁盘
Jackilina_Stone2 个月前
【QNX】QNX侧查看CPU的信息
cpu·监测·qnx
久绊A2 个月前
理解CPU负载与使用率
服务器·网络·数据库·cpu