ARMv8中的异常级别
异常等级的定义
在 ARMv8 中,程序执行发生在四个异常级别中的一个。在AArch64中,异常级别决定了权限级别,其方式与ARMv7中定义的权限级别类似。因此在ELn执行对应于权限PLn。同样,数字越小,异常越低,权限越低。异常级别提供了软件执行权限的逻辑分离,适用于ARMv8架构的所有操作状态。它类似于并支持计算机科学中常见的分层保护域的概念。
以下是在每个异常级别上运行的软件的典型例子:
- EL0 普通用户应用程序。
- EL1 操作系统内核通常被描述为有特权的。
- EL2 虚拟化管理程序。
- EL3 低级别的固件,包括Secure Monitor。
一般来说,一个软件,如应用程序、操作系统的内核或管理程序,只占用一个异常级别。这一规则的一个例外是内核内的管理程序,如KVM,它在EL2和EL1之间运行。ARMv8-A提供两种安全状态:安全和非安全。非安全状态也被称为 “正常世界”。这使得操作系统(OS)可以在同一硬件上与受信任的操作系统并行运行,并提供对某些软件攻击和硬件攻击的保护。ARM TrustZone技术使系统可以在正常世界和安全世界之间进行划分。与ARMv7-A架构一样,安全监视器作为网关在正常世界和安全世界之间移动。
正常世界(对应于非安全状态)有以下特权组件构成:
-
Guest OS kernels
这种内核包括在非安全EL1中运行的Linux或Windows。当在虚拟化管理程序下运行时,rich os内核可以作为客人或主机运行,这取决于管理程序的模式。
-
Hypervisor
这在EL2下运行,始终是不安全的。当管理程员序存在并启用时,为rich os内核提供虚拟化服务。
安全世界有以下特权组件构成:
-
Secure firmware
在一个应用处理器上,这个固件必须是在启动时运行的第一件事。它提供了一些服务,包括平台初始化、受信任的操作系统的安装和安全监视器调用的路由。
-
Trusted OS
可信操作系统向普通世界提供安全服务,并为执行安全或可信的应用程序提供运行环境。
改变异常等级
在ARMv7架构中,处理器模式可以在特权软件控制下或在发生异常时自动改变。当异常发生时,内核会保存当前的执行状态和返回地址,进入所需的模式,并可能禁用硬件中断。
这在下面的表格中进行了总结。应用程序在最低的权限水平上运行,即PL0,以前的非特权模式。操作系统在PL1运行,而在具有虚拟化扩展的系统中的管理程序在PL2运行。安全监控器,作为在安全和非安全(正常)世界之间移动的网关,也在PL1运行。
在AArch64中,处理器模式被映射到Exception级别上,如下图所示。如同在ARMv7(AArch32)中,当出现异常时,处理器会改变到支持处理异常的异常级别(模式)。
异常级别之间的奇幻遵循以下规则:
- 移动到更高的异常级别,例如从EL0到EL1,表示软件执行权限的增加。
- 一个异常不能被带到较低的异常级别。
- 在EL0层没有异常处理,异常必须在更高的异常层处理。
- 一个异常会导致程序流程的改变。异常处理程序的执行在高于EL0的异常级别开始,从一个定义的向量开始,与所发生的异常有关。异常包括:
- 中断,如IRQ和FIQ。
- 内存系统中止。
- 未定义的指令。
- 系统调用。这些允许无特权的软件对操作系统进行系统调用。
操作系统的系统调用。 - 安全监控器或管理程序陷阱。
- 结束异常处理并返回到上一个异常级别是通过执行ERET指令进行的。
- 从异常中返回可以停留在同一个异常级别或进入一个较低的异常级别。它不能移动到更高的异常级别。
- 安全状态会随着异常级别的改变而改变,除了从EL3返回到非安全状态时。
- 点赞
- 收藏
- 关注作者
评论(0)