我是靠谱客的博主 自觉乌龟,最近开发中收集的这篇文章主要介绍arm el2与el3_ARMv8官方手册学习笔记(二) Exception levels,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.1 Exception elevl

Exception指的是cpu的某些异常状态或一些系统的事件,这些状态或事件会导致cpu执行一些预先设定的具有更高执行权限的软件(exception handler)。exception handler执行完毕后,需要返回产生异常的现场。

1.1.1 Exception levels

EL0下执行为非特权执行

EL2 用于支持虚拟化的非安全操作

EL3 提供了安全/非安全的切换机制

所有的架构实现必须包括EL0、EL1,EL2和EL3是可选的,为啥?

架构实现并不一定需要包括所有的ELx,比如只包括EL0/EL1/EL3也是允许的

异常切换的情况:

Ø 进入异常时,异常等级只能增加或保持不变;

Ø 从异常返回时,异常等级只能减少或保持不变。

Ø (AArch32)通过PSTATE的M位切换EL

1.1.2 execution state确定

1. 状态的确定

如果设计实现了EL3,则由EL3决定,SCR_EL3.RW = 1,EL2用AArch64;SCR_EL3 = 0,EL2用AArch32。

如果没有实现EL3,则通过EL2决定,HCR_EL2.RW为0时较低EL的执行状态为AArch32,为1时EL1的为64,EL0的由PSTATE.nRW决定

如果EL2不存在,则EL1为AArch64,EL0的状态由PSTATE状态决定。

2. execution state的切换

PE修改Execution state的方式有:Reset; Exception level切换。

产生Exception level的方法:

Ø AArch64时:产生1个exception,进入另一个EL;或当前EL处理完exception后返回到另一个EL。

Ø AArch32下,除了上述两种,还可以修改CPSR的M位来改变EL

若某个EL用了AArch32,则较低EL都必须是AArch32。AArch32 kernel上不能跑AArch64的Application。另外,AArch32模式下发生的exception可以route到使用AArch64的较高的EL下响应。

3. 不同的异常状态组合:

EL0、EL1、EL2,这种组合仅支持非安全态;

EL0、EL1、EL3,这种组合不支持虚拟化,异常等级和执行状态取决于EL3在AArch64还是AArch32

仅包含EL0、EL1,这种组合仅支持单一的安全态,或者是安全的(可访问非安全的memory)或者是非安全的。

EL0、EL1、EL2、EL3。

1.1.3 Security state

安全和非安全态,每一种都提供了对应物理内存地址空间。

安全态:PE可以访问安全态地址空间和非安全态地址空间。

非安全态:PE只能访问非安全态的物理地址空间;不能访问安全系统控制的资源。

如果设计实现中有EL3,则肯定有安全态和非安全态,注意:

Ø EL3只有安全态

Ø 非安全态到安全态的转换只能通过上报异常到EL3的方式

Ø 如果EL2存在,则EL2只有非安全态

如果设计实现没有EL3,则有一种安全状态:

Ø 如果设计没有EL2,则设计自己实现为安全态

Ø 如果设计实现了EL2,则为非安全态

1.1.4 AArch64的exception

常见的CPU异常:

1) reset;复位算是个超级异常;

2) undefined instruction;一条未定义的非法指令;

3) supervisor call;具体就是执行了 SVC 指令;

4) prefetch abort;CPU在预取指令时发生的错误;

5) data abort;数据异常,包含好几项内容;

6) irq interrupt;中断请求;

7) fiq interrupt;快速中断请求;

8) secure monitor call;具体就是执行了 SMC 指令;

9) hypervisor cll;具体就是执行了 HVC 指令;

10) virtual irq;虚拟irq;

11) virtual fiq;虚拟fiq;

Exception分为同步异常和异步异常:

1. 同步异常

synchronous exception(同步异常):异常的产生和cpu core执行的指令或试图执行的指令相关;硬件返回给handler的返回地址就是产生异常的指令所在的地址。(指令执行的时候才会触发);这个异常是precise的(见precise exception定义)

1) Data aborts from MMU

2) Alignment checking

3) Instruction aborts from MMU

4) SP and PC alignment checking

5) Undefined/Unallocated instructions

6) System calls

一般用于非特权模式下,向特权模式下申请调用服务。主要有:

Supervisor Call(SVC)指令:EL0的软件向EL1(OS service)申请软件服务;

Hypervisor Call(HVC)指令:主要被EL1(guest OS)请求hypervisor(EL2)服务

Secure monitor Caller(SMC)指令:EL3用来切换安全非安全世界

7) Synchronous external aborts.

外部异常是针对PE而言,

SVC/HVC/SMC指令

(1) Aborts

取指令失败Instruction aborts(已经预取且被执行时产生)

访问数据失败产生Data Abort,产生Abort的指令的虚拟地址放在FAR寄存器中

(2) System calls

使用该Ststem calls可以切换到较高EL,常用应用:

(3) 未定义指令

Ø 当前EL未allocated

Ø 或该指令下一条在更高的EL才能知晓

Ø 或该指令被disabled了

注意:如果PSTATE.IL位为1时,则执行任何指令都产生Undefined Instruction exception

1. 异步异常

asynchronous exception(异步异常),异常不是由CPU某条指令的执行直接产生。

1) IRQ

2) FIQ

3) System error(Serror):异步的data abort

这三种异步异常都可以在PASTATE里面mask位进行屏蔽。方法

precise exception:类似于同步异常中,可以精确的返回exception的具体位置的异常。在ARM64中,除了SError interrupt这种exception,其他的在AArch64态的exception都是precise exception。SError interrupt是否为精确异常由逻辑实现决定。

Precise的含义,在异常处理程序接收到PE状态和内存系统状态前,除了发生异常的位置处,PE已经执行了所有指令,之后没有执行任何指令,这种异常称为精确异常。

Reset

优先级最高的异常,无法mask。系统首次上电,watchdog以及软件控制都可以让cpu core历经一次reset。Reset有cold reset和warm reset(reset cpu core build-in的debug HW block)

1.1.5 Exception entry

任何情况下,任何异常导致的EL切换都不能切换到低等级,如果一个异步异常试图切换到较低EL,这个切换不会执行,且保持pending状态

安全状态的切换只能是异常从非安全的ELx切换到安全态的EL3

任何异常ELx的异常上报到EL3都不会改变SCR_EL3.NS安全标志位

当异常发生时(AArch64)工作:

1) PE的状态保存到对应的SPSR_ELx

2) 首选的异常返回地址保存到ELR_ELx中(异常上报到哪个ELx,就将返回地址保存在哪个ELR_Elx中)

3) PSTATE.{D,A,I,F}都设置为1

4) 如果为异常为同步异常或SError中断,则异常原因描述信息将会保存到ESR_ELx中(异常上报到哪个ELx,则保存到哪个ESR_ELx)

ESR(Exception Syndrome Register)用于保存异常原因因袭,包括EC、EL、ISS是三个域段,EC存储异常引发的原因,IL表示指令长度,ISS表征指令特定的意义

5) 当前程序转移到目标ELx执行,并且在异常向量入口地址开始执行,执行哪个异常向量由异常源ELx是较低的ELx还是当前(同一个ELx)决定

6) 使用的SP指针寄存器,是目标ELx的SP_ELx

1.1.6 首选的异常返回地址

AArch64中,首选异常返回地址保存到ELR_ELx中,其取值规则如下:

Ø 对于异步异常,这个地址是指发生异常时指令边界之后的指令地址,因此这个地址是(异常发生后)第一个没有执行或没有完成的指令的地址

Ø 对于系统调用以外的同步异常,这个地址是指生成异常指令的地址

Ø 对于产生异常的指令(SVC/HVC/SMC),这个地址是生成异常之后的第一个指令地址(如果异常生成指令被trapped、禁用或未定义,或没有足够的执行权限,则首选的异常返回地址为异常生成指令的地址)

那如果返回地址就是异常产生指令的地址,返回时返回到该地址会再次异常吗?

最后

以上就是自觉乌龟为你收集整理的arm el2与el3_ARMv8官方手册学习笔记(二) Exception levels的全部内容,希望文章能够帮你解决arm el2与el3_ARMv8官方手册学习笔记(二) Exception levels所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部