【ARM系列】ARM架构中断异常处理机制

DATE: 2019-9-13


1、参考

ARM中断处理过程
Linux中断 - ARM中断处理过程
ARM架构异常中断处理流程

2、 ARM架构异常中断介绍

2.1、ARM异常中断种类

ARM体系中异常中断如下面的介绍。

  • 复位(Reset):当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面两种情况下:系统加电时,系统复位时,跳转到复位中断向量处执行,称为软复位。

  • 未定义指令(Undefined):当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断。可以通过该异常中断机制仿真浮点向量运算。

  • 软中断(software interrupt):这是一个由用户定义的中断指令。可用于用户模式下的程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用。

  • 指令预取中止:如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断。

  • 数据访问中止:如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断。

  • 外部中断请求(IRQ):当处理器的外部中断请求引脚有效,而且CPSR寄存器中的I控制位被清除时,处理器产生外部中断请求异常中断。系统中各个外设通常通过该异常中断请求处理器服务。

  • 快速中断请求(FIQ):当处理器的外部快速中断请求引脚有效,而且CPSR寄存器中的F控制位被清除时,处理器产生外部中断请求(FIQ)异常中断。

2.2、 异常中断向量表及异常中断优先级

中断异常向量表中指定了个异常中断及其处理程序的对应关系。它通常存放在存储地址的低端。在ARM体系中,异常中断向量表的大小为32个字节。其中,每个异常中断占据4个字节大小,保留4个字节空间。

每个异常中断对应的中断向量表中的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通常这两种指令,程序将跳转到相应的异常中断处理程序处执行。

当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断。在ARM中通过给异常中断赋予一定的优先级来实现这种处理次序。当然有异常中断是不可能同时发生的,如指令预取中止异常和软中断(SWI)异常中断是由同一条指令的执行触发的,它们是不可能同时发生的。处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式。各异常中断的中断向量地址以及中断的处理优先级如下表所示。

中断向量地址 异常中断类型 异常中断模式 优先级
0x0 复位 特权模式(SVC) 1
0x4 未定义指令 未定义指令中止模式 6
0x8 软中断(SWI) 特权模式(SVC) 6
0xC 指令预取中止 中止模式 5
0x10 数据访问中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中断请求 外部中断模式 4
0x1C 快速中断请求 快速中断模式 3

2.3、异常中断使用的寄存器

各异常中断对应着一定的处理器模式。应用程序通常运行在用户模式下。ARM中的处理器模式如下表所示。

处理器模式 描述
用户模式(user) 正常程序执行的模式(用户态一般处于这种模式)
快速中断模式(FIQ) 用于高速数据传输和通道处理
外部中断模式(IRQ) 用于通常的中断处理
特权模式(SVC) 供操作系统使用的一种保护模式(一般内核态处于这种模式)
中止模式(abort) 用于虚拟存储及存储保护
未定义指令模式(undefined) 用于支持软件仿真硬件的协处理器
系统模式(system) 用于运行特权级的操作系统任务

3、ARM中断处理机制

ARM有七种异常中断类型,优先级、工作模式(有七种工作模式)、地址、功能都不一样。如其中软件中断SWI优先级为6,工作模式管理模式,异常向量地址为0x00000008,功能是用户定义的中断指令,可用于用户模式下的程序调用特权操作。

当中断产生后,除了复位中断立即中止当前指令外,其余情况都是处理器完成当前指令后,才去执行异常处理程序。

ARM处理器有多种processor mode,例如user mode(用户空间的AP所处于的模式)、supervisor mode(即SVC mode,大部分的内核态代码都处于这种mode)、IRQ mode(发生中断后,处理器会切入到该mode)等。对于linux kernel,其中断处理处理过程中,ARM 处理器大部分都是处于SVC mode。但是,实际上产生中断的时候,ARM处理器实际上是进入IRQ mode,因此在进入真正的IRQ异常处理之前会有一小段IRQ mode的操作,之后会进入SVC mode进行真正的IRQ异常处理。

3.1 中断处理过程

当一个IRQ产生时,会发生什么?

当一个IRQ产生后,CPU会首先自动跳转到IRQ的中断向量(这个中断向量是可设置的),在这个IRQ中断向量里又是一个跳转指令,CPU再次跳转,跳转后的代码主要完成的工作是保存一些寄存器,然后读取中断寄存器经过计算(这个计算并不是单纯的跟INTPND对应)得到中断号,然后跳转到一个中断处理的通用函数,并把中断号传过去(汇编向C传参数)。

在这个通用处理函数里,根据中断号找到我们自己设定的中断处理函数,然后执行。

(1)将CPSR的值保存到将要执行的异常中断对应的各自SPSR中,以实现对处理器当前状态、中断屏蔽及各标志位的保护。

(2)设置当前状态寄存器CPSR的相应位。设置CPSR中的M4~M0的5位,进入相应工作模式,设置I=1禁止IRQ中断,如果进入复位模式或FIQ模式,还要设置F=1以禁止FIQ中断。

(3)将引起异常指令的下一条地址(断点地址)保存到新异常工作模式的LR(R14)中,使异常处理程序执行完后正确返回原来程序处继续向下执行。

(4)给程序计数器PC强制赋值,转入向量地址,以便执行相应的处理程序。

每种中断异常模式对应两个寄存器SP和LR。

更详细的讲,linux的中断机制可以分为两部分:

  1. 定义的中断处理函数是如何注册到linux系统的?
  2. 当中断发生时,linux如何自动跳转并找出中断号,然后根据中断号来找到注册在该中断号上的中断处理函数并执行?

3.2 中断返回过程

从中断返回。如果是复位异常,系统自动从0x00000000开始重新执行程序,无需返回。

(1)首先恢复原来被保护的用户寄存器。

(2)将SPSR寄存器复制到CPSR中,使得原来CPSR状态从相应的SOSR中恢复,一恢复被中断的程序状态。

(3)根据异常类型将PC值恢复成断点地址,以继续执行用户原来运行着的程序。

(4)清除CPSR中的中断禁止标志I和F,开放外部中断和快速中断。

注意:(1)程序状态寄存器及断点地址的恢复必须同时进行。

(2)由于异常随机发生,所以要对异常向量进行初始化,即在异常向量的地址处放置一条跳转指令,跳转到异常处理程序。


THE END!

你可能感兴趣的:(ARM,中断,机制)