概述
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复