没志青年
发布于 2025-09-08 / 18 阅读
0

ARM 异常处理

异常的概念:

处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序。

异常处理机制:

不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同,比如:

  • 处理器遇到哪些事件认为是异常事件

  • 遇到异常事件之后处理器有哪些动作

  • 处理器如何跳转到异常处理程序、该怎么去处理异常

  • 处理完异常之后又如何返回到被打断的程序继续执行

等我们将这些细节的实现称为处理器的异常处理机制

导致异常产生的事件称为异常源

ARM有七类异常源

  • FIQ 快速中断请求引脚有效

  • IRQ 外部中断请求引脚有效

  • Reset 复位电平有效

  • Software Interrupt 执行swi指令

  • Data Abort 数据终止

  • Prefetch Abort 指令预取终止

  • Undefined Instruction 遇到不能处理的指令

FIQ、IRQ 是由外部硬件产生的,比如网卡数据包到达了就会产生一个中断,FIQ>IRQ优先级

前3个都是由硬件产生的,。

数据终止:比如CPU去访问内存数据,地址不正确或者地址无法访问

内存中既有指令又有数据,从内存中去指令时发生错误

异常模式:

在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

  • FIQ:FIQ

  • IRQ:IRQ

  • SVC:Reset、Software Interrupt

  • Abort:Data Abort、Prefetch Abort

  • Undef:Undefined Instruction

ARM产生异常后的动作(自动完成)

1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>,异常处理完后要回到前面的模式和状态(正常模式没有SPSR_mode)

2.修改CPSR的值

2.1.修改中断禁止位禁止相应的中断,同一个类型的中断同时只能处理一个,但是FIQ可以打断IRQ,优先级高,也就是相同的中断不能打断,如果是IRQ位,那么禁止IRQ,如果是FIQ,IRQ和FIQ都禁止

2.2.修改模式位进入相应的异常模式 产生异常

2.3.修改状态位进入ARM状态,不管是ARM指令还是Thumb指令,遇到异常都会切换到ARM指令状态

3.保存返回地址到对应异常模式下的LR_<mode>,要不然异常处理完了不知道回到哪个地址了

4.设置PC为相应的异常向量(异常向量表对应的地址),开始执行异常处理程序,前面的都是准备

上面自动跳转东安,异常处理程序使我们自己写的,

既然知道了固定的地址,能不能直接把异常处理程序写在那呢?

不行。只有4个字节,而异常处理程序远远超过4个字节,就会导致把后面的异常向量覆盖了,整个内核就G了,混乱,就直接卡死了。

异常向量表中放跳转指令

异常优先级

多个异常同时产生时的服务顺序

Reset

Data Abort

FIQ

IRQ

Prefetch Abort

Software Interrupt

Undefined instruction

FIQ的响应速度比IRQ快

1. FIQ在异常向量表位于最末

可直接把异常处理写在异常向量表之后,省去跳转

2. FIQ模式有5个私有寄存器(R8-R12)

执行中断处理程序前无需压栈保存寄存器,可直接处理中断(无需把用户模式的压栈,FIQ使用自己特有的寄存器,不是使用用户模式的)

3. FIQ的优先级高于IRQ

3.1 两个中断同时发生时先响应FIQ

3.2 FIQ可以打断RIQ,但RIQ不能打断FIQ

IRQ在驱动开发中常用,其它的大多还是CPU内核使用。