【ARM】中断汇总

Synchronous同步异常

同步异常的概念:
  • 异常是由执行或尝试执行指令产生的
  • 产生异常的那个位置是确定的,即每次执行到“那个指令处”就会产生异常是precise的

precise的概念:按照预期产生的异常称之precise,反之imprecise

同步异常有哪些

• 尝试执行UNDEFINED指令产生的任何异常,包括:
(1)、尝试在不适当的异常级别执行指令。
(2)、当指令被禁用时尝试执行指令。
(3)、尝试执行尚未分配的指令位模式。
• 非法执行状态异常。这些是由尝试执行指令引起的PSTATE .IL 为 1,(详细可参考D1-2486 页上的AArch64 状态的非法返回事件)
• 使用未对齐的 SP 导致的异常。
• 尝试使用未对齐的 PC 执行指令导致的异常。
• 由异常生成指令SVC、HVC或SMC引起的异常。
• 尝试执行系统寄存器定义为被捕获到更高的异常级别。(详细可参考可配置的指令使能和禁止,在D1-2510 页)
• 由内存地址转换系统生成的指令中止与尝试相关联从产生故障的内存区域执行指令。
• 内存地址转换系统生成的数据中止与尝试读取或写入产生故障的内存。
• 由地址未对齐引起的数据中止。
• 如果实施FEAT_MTE2,则由标记检查故障引起的数据中止。。
• 所有调试异常:
(1)、Breakpoint Instruction exceptions.
(2)、Breakpoint exceptions.
(3)、Watchpoint exceptions.
(4)、Vector Catch exceptions.
(5)、Software Step exceptions.
• 在支持捕获浮点异常的实现中,由捕获的IEEE 浮点异常引起的异常
• 在某些实现中,外部中止。外部中止是失败的内存访问,包括访问地址转换期间发生的内存系统的那些部分

armv8 Synchronous

在这里插入图片描述
方框圈起来的都是同步异常
圆圈中的大部分是同步异常,少数是SError

异常中断的优先级

异步异常

IRQ,FIQ,SError
IRQ,FIQ优先级相同

同步异常(armv8中有30多种同步异常)

数值越小优先级越高
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Armv8架构,在中断中,又触发了同步异常,那么ELR_ELX寄存器会被覆盖掉吗?

在 ARMv8 架构中,当一个异常发生时,Exception Link Register (ELR_ELx) 会被设置为异常发生时的
PC(Program Counter,程序计数器)值,以便在处理完异常后返回到异常发生前的执行状态。
然而,当在处理一个异常的过程中,如果再次发生了一个同步异常,那么新的同步异常会更改
ELR_ELx 的值,因为新的异常需要将其当前的 PC 值保存到 ELR_ELx 中。这意味着原有的 ELR_ELx 值
会被覆盖。
因此,如果你在处理一个异常时期望能够安全地嵌套处理另一个异常,你需要在进入异常处理程序
时手动保存 ELR_ELx 寄存器的内容,然后在返回前恢复它。否则,ELR_ELx 的值可能会被覆盖,从
而导致你无法正确返回到第一个异常发生时的执行点。

  • 如果是在异步异常中断的入口,还没来得及保存ELR_EL1呢,就触发了同步异常,那么此时ELR_EL1会被覆盖,程序将崩溃。
  • 在optee_os的代码的异步异常代码中似乎是没有保存ELR_EL1,所以在optee os的irq处理时,如果再次发生同步异常,那么此ELR_EL1会被覆盖,程序将崩溃。
  • 同步异常是可以抢占同步异常。在同步异常的代码中有将ELR_EL1保存到栈中。所以同步异常可以发生多次抢占,都是没关系的

smc/hvc/svc

系统调用模型

在这里插入图片描述
EL0到EL1的切换就是通过svc;
EL1到EL2的切换就是通过hvc;
EL2到EL3的切换就是通过smc;

smc&hvc&svc指令介绍

在这里插入图片描述

  • smc:Secure Monitor Call,可以执行在EL1,EL2,EL3,产生Secure Monitor Call Expectation,记录在ESR_ELx中,其中的EC_value0x17,表示是smc产生的异常,并直接taken到EL3中,。
  • hvc:Hypervisor Call
  • svc:Supervisor Call

Serror异步异常

Serror(也称System Error),是异步异常的一种,一般是来自External aborts,当memory system访问时bus上产生的External aborts。Serror是外部的信号接到了PE上,Serror一产生就是系统级的错误,是不可修复的。

  • data abort
  • prefetch abort
  • 访问内存被TZC挡住时,bus会返回的一个异常
    (data abort,prefetch abort大部分情况下是同步异常,少数是Serrror)
    在这里插入图片描述

虚拟中断示例

在这里插入图片描述
示例1
在这里插入图片描述
在这里插入图片描述
示例2
在这里插入图片描述
示例3
在这里插入图片描述
示例4
在这里插入图片描述

多系统之间中断的抢占

多系统软件模型

在这里插入图片描述
在这里插入图片描述

Arm Core对中断嵌套的支持

在这里插入图片描述

优先级掩码

数值越小优先级越高,设置一个Mask,数值比Mask小的中断可以进入,数值比Mask大的中断被屏蔽掉,不会被送到arm core中。

运行时优先级的设置

一个core中只能有一个中断处于Active,此时运行的这个中断的优先级叫做运行优先级,同时系统中有很多处于pending状态的优先级,如果此时来了一个优先级高于运行时的中断的优先级,那么这个中断就会抢占,先执行优先级高的中断,执行完成后再返回执行一开始的中断。

中断号优先级

在这里插入图片描述
在这里插入图片描述
比较优先级时只看g的数值部分,s部分是无效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值