[ARM]AArch64异常

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级别之间的转换规则:

  1. EL转换只会发生在 异常发生 或者 异常返回 的时候。
  2. 异常发生时EL级别只能提升或不变。
  3. 异常返回时EL级别只能降低或不变。
  4. EL转换的目标级别称为”目标异常级别”,只能由异常自身特征,或配置系统控制寄存器决定。
  5. 目标异常级别不能使EL0。
  6. 不同的EL级别有些寄存器是不同的,如图(摘自[2])。

在这里插入图片描述
Execution state的变化

  1. AArch64提供31个(x0 - x30)64-bit的通用寄存器 提供64位的pc/lr/sp
  2. A32/T32的切换通过BX即可,但A32/A64的切换必须通过异常。
  3. EL0,EL1,EL2,El3之前的切换,分别通过指令svc,hvc,smc。
  4. 若下层系统为32bit(如EL1),则上层只能为32bit(如EL0),反之若下层位64bits,则上层可以为32/64bits。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值