简介
- ARMv8架构处理器有一套异常等级(Exception level)机制,分成4个等级(EL0 ~ EL3)。
- 处理器运行时会处于其中的某个等级并且可以进行等级切换。
资源差异
- 每个异常等级都拥有一些自己版本的特殊寄存器,例如:system ctrl 寄存器(sctlr_el1,sctlr_el2 …),程序状态寄存器(SPSR_EL1,SPSR_EL3,…)。
- 一些异常等级有些独有的特殊寄存器,例如:EL3 安全配置寄存器(Secure Configuration Register)(SCR_EL3),EL2 虚拟化配置寄存器(Hypervisor Configuration Register)(HCR_EL2)。
- 处理器一般会使用当前异常等级的特殊寄存器来实现不同等级之间的物理隔离。
权限差异
- 随着异常等级的提高,软件的访问权限也相应增加,因此异常等级又被称为安全等级。
- 当处理器在某个异常级别执行的时候,处理器能够访问下面的资源:
- 可用于当前异常级别和当前安全状态的资源集。
- 在当前的安全状态下,所有更低异常级别上可用的资源。
- 这意味着,异常等级为EL3时,处理器可以访问任何资源(包括安全状态和非安全状态下)。
初始等级
- 处理器上电之后运行在最高的异常等级EL3,即bl1处于EL3。
异常等级切换
- 该机制被命名为异常等级,是因为等级的切换只能通过同步异常实现,注意:不是通过中断实现的。
- 异常级别切换只能通过软件触发同步异常,或者同步异常处理返回后。
- 软件触发同步异常时,异常级别增加或者保持不变。
- 同步异常处理返回时,异常级别减小或者保持不变。
- 在发生异常即将进入或者从异常处理返回到另一个异常级别(包括异常级别不变的情况)时,待进入/返回的异常级别称之为目标异常级别。每个异常级别都有一个明确的目标异常级别,这个目标异常级别要么是默认定义的,要么是通过系统寄存器的相应bit定义的(注意没有异常级别的目标异常级别是EL0)。
软件触发同步异常
- 软件想要进入更高的异常等级时就需要使用ARM提供的以下3个汇编指令触发同步异常。
- SVC(Supervisor Call)
- 允许用户模式(EL0)下的程序请求os(EL1)服务,当用户空间程序通过系统调用陷入到内核空间的时候,最终是通过SVC指令进入到内核空间,即处理器异常等级从EL0切换成EL1。
- 汇编指令
svc
- HVC(Hypervisor Call)
- 允许操作系统(EL1)请求虚拟化(EL2)服务
- 当在ARMv8-A架构下,normal world, EL1尝试去访问EL2的时候,则会陷入到虚拟化层的,其中是通过HVC指令
- HVC指令用于生成同步异常,该异常由EL2中运行的管理程序处理。
- 参数和返回值通过寄存器传递,虚拟机监控程序还可以捕获住操作系统(EL1中的guest os)发出的SMC call,并且支持SMC call被模仿、传递给下一级或拒绝通过。
- 汇编指令
hvc
- SMC(Secure Moniter Call)
- 允许EL1/EL2程序请求安全(EL3)服务
- SMC 指令用于生成由EL3中运行的安全监视器代码处理的同步异常。
- 参数和返回值都通过寄存器中传递,
- 由安全监视器处理后指令可以传递给可信OS或安全软件堆栈中的某个其他实体。
- 汇编指令
smc
切换限制
- 当处理器在EL0(运行应用程序)等级时,不能直接切换到EL2(管理程序)或EL3(安全监视器),只能先切换到EL1,调用内核处理再切换到更高等级。
- 在操作系统内核(EL1),软件可以用HVC指令调用管理程序(EL2),或用SMC指令调用安全监视器(EL3),如果处理器有EL3(secure monitor)实现,EL3就能捕获到EL1的SMC请求,如果没有EL3实现,现象待确认。
- 管理程序代码(EL2)中,程序可以用SMC指令调用安全监视器(EL3)。
文章来源地址https://www.toymoban.com/news/detail-641677.html
异常处理返回
- 处于高异常等级的软件处理完低异常等级软件的请求后,可通过 eret 切换到低异常等级。
- eret
- 例如:bl31固件(secure monitor)处于EL3 收到其它异常等级的请求,处理完后, 可通过 eret 返回原有异常等级。
- 汇编指令
eret
默认软件模型
ELn | 应用范围 |
---|---|
EL0 | 运行普通用户程序 |
EL1 | 操作系统或者一些特权函数 |
EL2 | 运行虚拟化扩展的虚拟监控程序(Hypervisor Monitor) |
EL3 | 运行安全监控器(Secure Monitor) |
- EL0和EL1是必须实现的,EL2和EL3是可选的,而且实现的EL可以不连续,例如只实现了EL0、EL1和EL3。
- 疑问:是否可以只实现EL1?例如:跑RTOS。
文章来源:https://www.toymoban.com/news/detail-641677.html
到了这里,关于ARMv8 - 安全机制 - 异常等级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!