AArch64 异常
Synchronous
Asynchronous
- IRQ
- FIQ
- SError
Synchronous exceptions include
- Service call: SVCs, SMCs and HVCs(covered later)
- Aborts from MMU
- SP and PC alignment checking
- Unallocated instructions
SError exceptions include
Asynchronous data abrots
Taking an exception
when an exception occurs:
- SPSR_ELn updated
- PSTATE updated (EL stays the same OR gets higher)
- Return address stared to ELR_ELn
- ESR_ELn updated with cause of exception
- Branches to the exception table
To return from an exception execute ERET instruction
- Restores PSTATE from SPSR_ELn
- Restores PC from ELR_ELn
ARM从ARMv8开始支持64位架构,当前的ARMv8只有A系列,ARMv8-A架构。
新增一套arm64位指令集称为A64,之前的32位arm指令集称为A32, thumb指令集称为T32。
定义AArch64/AArch32两套运行环境(称作Execution state)分别执行64/32位指令集。
A64和A32指令集的每个指令都是固定4字节的。
ARMv8的异常与以前的架构做了较大改动,以前的ARM,处理器可以处在多种工作模式(process mode),如 User,FIQ, IRQ, Abort, Undefined,System等,每个模式都是由1/2中相应的中断触发的。实际上粗略分只是两种特权模式(User属于非特权模式,其他的都是特权模式)。
在ARMv8中User,FIQ, IRQ, Abort, Undefined,System这些模式统统取消,被EL0,EL1,EL2,EL3四种特权特权模式取代(跟之前的特权模式/非特权模式相比,实际上特权级还是增加了的)。与x86的ring0-ring3刚好相反,在这四种模式中EL0是最低权限,一般给用户态程序用的。EL1稍高,一般给内核用的。EL2/EL3分别是Hypervisor(虚拟化相关)和secure monitor(安全相关)的模式,一般linux中是可以不用的。
因为需要兼容ARMv7,所以User,FIQ, IRQ, Abort, Undefined,System这些中断模式还是需要支持的,在ARMv8中就全部直接映射到EL1模式了(TODO: 应该是有个寄存器记录当前具体哪个模式)。
ARMv8异常模式如下图(摘自[1])。
不同EL级别之间的转换规则:
- EL转换只会发生在 异常发生 或者 异常返回 的时候。
- 异常发生时EL级别只能提升或不变。
- 异常返回时EL级别只能降低或不变。
- EL转换的目标级别称为”目标异常级别”,只能由异常自身特征,或配置系统控制寄存器决定。
- 目标异常级别不能使EL0。
- 不同的EL级别有些寄存器是不同的,如图(摘自[2])。
Execution state的变化
- AArch64提供31个(x0 - x30)64-bit的通用寄存器 提供64位的pc/lr/sp
- A32/T32的切换通过BX即可,但A32/A64的切换必须通过异常。
- EL0,EL1,EL2,El3之前的切换,分别通过指令svc,hvc,smc。
- 若下层系统为32bit(如EL1),则上层只能为32bit(如EL0),反之若下层位64bits,则上层可以为32/64bits。