ARM架构的异常模型

一、异常级别

1、异常级别0(EL0)

        用户模式,是四个异常级别中权限最低的一个。

        目标软件:应用程序代码

        设计用途:运行绝大多数终端用户的软件,如文档编辑器、游戏和通讯应用。这些应用程序运行在一个受限的环境中,以减少它们对系统安全性和稳定性的潜在威胁。

2、异常级别1(EL1)

        操作系统内核模式。

        目标软件:丰富的操作系统 (OS),例如 Linux

        设计用途:执行系统管理和控制任务,包括进程调度、内存管理、硬件抽象和安全控制等。操作系统内核在这个级别上运行,以便它可以执行对硬件资源的直接操作和管理系统的全局状态。

3、异常级别2(EL2)

        超级用户模式(Hypervisor)。

        目标软件:虚拟机监视器(Hypervisor)或虚拟化管理软件。

        设计用途:支持在单个物理硬件上虚拟化多个操作系统实例。Hypervisor 控制物理资源的分配给虚拟机,并管理它们的执行,提供了一种安全和高效的方式来增加硬件的利用率和支持软件隔离。

4、异常级别3(EL3)

        安全模式(TrustZone),这是最高的异常级别。

        目标软件:固件和安全网关代码

        设计用途:提供系统的安全启动和运行时的安全服务,如加密操作和安全存储管理。EL3用于实现一个安全的执行环境,保护敏感操作和数据免受其他系统部分的干扰。

4、如何在两个异常级别之间切换?

(1)从EL0到EL1(系统调用)

        触发方式:应用程序(在EL0运行)通过执行特定的系统调用指令(如 SVC 在 ARM 中)请求操作系统服务,这会触发一个异常,将控制权转移到EL1。

        处理:处理器自动保存当前应用程序的上下文(如CPU寄存器状态),并加载为处理系统调用而设置的EL1环境(如异常向量表中指定的系统调用处理程序)。

        返回:完成服务后,操作系统通过执行特定的返回指令(如ERET)来恢复应用程序的上下文,并将控制权返回给EL0。

(2)从EL1到EL2(虚拟化时的异常或中断)

        触发方式:如果系统配置了虚拟化,并且某个操作需要Hypervisor的介入(如管理VM的资源分配),当这类操作发生时,系统会自动切换到EL2。

        处理:类似于系统调用的处理,处理器保存当前的操作环境并加载EL2的环境来处理请求或中断。

        返回:处理完请求后,通过执行返回指令切换回EL1或者根据需要返回到其他级别。

(3)从较低EL到EL3(安全操作)

        触发方式:在需要执行安全操作(如访问安全资源、执行加密操作)时,系统会通过安全监视器调用(SMC指令)切换到EL3。

        处理:EL3接管控制权,执行必要的安全操作,如安全认证、数据加解密等。

        返回:安全操作完成后,通过特定指令返回到调用级别,继续执行非安全操作。

(4)通用机制

        上下文保存与恢复:在每次级别切换时,当前级别的状态(如寄存器、程序计数器)被保存,以便在返回时恢复。

        特权指令执行:执行级别切换通常需要特权指令(如ERET、SMC),这些指令只能在更高的异常级别中执行。

        安全和访问控制:系统确保只有合法和安全的操作能够触发级别切换,通过硬件和软件机制防止未授权的访问。

二、特权类型

1、内存系统中的特权

2、从访问处理器资源的角度来看的特权

两种类型的特权都受到当前特权异常级别的影响

内存特权

        Arm 架构的 A-profile 实现了虚拟内存系统,其中内存管理单元 (MMU) 允许软件为内存区域分配属性。这些属性包括读/写权限,可以将其配置为允许特权访问和非特权访问的单独访问权限。当处理器在 EL0 中执行时启动的内存访问将根据非特权访问权限进行检查。来自 EL1、EL2 和 EL3 的内存访问将根据特权访问权限进行检查。

三、执行和安全状态

执行状态

        Armv8和Armv9-A支持两种执行状态:AArch32和AArch64

        改变执行状态

        处理元件 (PE) 只能在重置或异常级别更改时更改执行状态。当 PE 在异常级别之间移动时,可以更改执行状态,但是仅允许在 AArch32 和 AArch64 之间转换,但须遵守附加规则:

        1、当从较低的异常级别移动到较高的级别时,执行状态可以保持不变或更改为 AArch64

        2、当从较高的异常级别移动到较低的级别时,执行状态可以保持不变或更改为 AArch32

        Armv8-A 架构支持所有异常级别的 AArch32 和 AArch64 执行状态。对于 Armv9-A 处理器,所有 EL 都需要支持 AArch64。

安全状态

        安全状态定义了可以访问哪些已实现的异常级别、当前可以访问哪些内存区域以及如何在系统内存总线上表示这些访问。如果处于Non-secure状态,则PE只能访问Non-secure物理地址空间。在安全状态下,PE 可以访问安全和非安全物理地址空间。

        1、安全状态:在此状态下,处理元件 (PE) 可以访问安全和非安全物理地址空间以及存储寄存器的安全副本。

        2、非安全状态:这通常也称为正常世界。在这种状态下,PE只能访问非安全物理地址空间。 PE 只能访问允许非安全访问的系统寄存器。

        更改安全状态

         在 Armv8-A 中,EL3 始终处于 Secure 状态。在 Armv9-A 中,除非实现了 RME,否则 EL3 是安全状态的一部分。如果实现了 RME,根状态是 EL3 与其余安全状态的分离。

        领域管理扩展        

        Armv9-A 引入了对领域管理扩展 (RME) 的支持。实施 RME 时,支持两种附加安全状态:

        1、Realm状态:在此状态下PE可以访问非安全和Realm物理地址空间。

        2、根状态:在此状态下PE可以访问所有物理地址空间。根状态仅在 EL3 中可用。

        RME 将 EL3 与所有其他安全状态隔离。通过 RME,EL3 脱离安全状态并进入其自己的安全状态(称为根)。异常级别 3 托管平台和初始引导代码,因此必须受到安全、非安全和领域状态下的软件的信任。

下图显示了启用 RME 的 PE 中的安全状态,以及这些安全状态如何映射到异常级别:

四、参考

Documentation – Arm Developer

相关推荐

  1. C# 异步编程模型APM深入理解

    2024-04-01 21:56:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 21:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 21:56:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 21:56:01       82 阅读
  4. Python语言-面向对象

    2024-04-01 21:56:01       91 阅读

热门阅读

  1. FastAPI+React全栈开发13 FastAPI概述

    2024-04-01 21:56:01       27 阅读
  2. C# 字符串转json

    2024-04-01 21:56:01       32 阅读
  3. 医疗器械测试面试准备—质量部总监二面

    2024-04-01 21:56:01       54 阅读
  4. 蓝桥杯考前复习二

    2024-04-01 21:56:01       41 阅读
  5. 前端CSS样式(image)

    2024-04-01 21:56:01       39 阅读
  6. 2084: [蓝桥杯2023初赛] 整数删除

    2024-04-01 21:56:01       40 阅读
  7. Stable Diffusion 本地部署教程

    2024-04-01 21:56:01       40 阅读
  8. 学习记录之数学表达式(3)

    2024-04-01 21:56:01       29 阅读
  9. echarts初始化时只显示100px的问题

    2024-04-01 21:56:01       33 阅读