ARM系列中断处理

ARM体系结构中断处理分为两个阶段:

    1.体系统一处理:同一系列芯片的中断处理方法一致

    2.体系独立处理:不同款芯片的处理方式完全不同

ARM9系列体系统一处理过程:

a.保存当前运算环境,比如标志位的值,返回地址,等等

b.模式的切换

c.程序跳转到一个固定的地址去执行

异常种类:

1.芯片复位SVC:当芯片发生时产生

2.未定义指令UND:指令不能被芯片识别时产生

3.软中断SVC:软件调用swi指令时产生,就是linux下系统调用时,system_call时会调用的指令

4.预取址终止ABT:没有权限访问存储器时产生

5.数据终止ABT:没有权限访问存储器时产生

6.中断IRQ(硬中断):硬件进行中断请求时发生

7.快速中断FIQ:硬件进行快速中断请求时发生

ARM处理器的模式(共7种)如下:

1. 终止模式(ABT)

2.中断模式(IRQ)

3.快速中断模式(FIQ)

4.管理模式(SVC)

5.系统模式(SYS)

6.未定义模式(UND)

7.用户模式(USR)

除了用户模式与系统模式之外的5中模式与上述异常是对应的,因此也叫作异常模式

然后将除用户模式之外的其余六种模式称为特权模式,这些都是在内核空间中的模式,所以与用户模式的区别也在此

各种模式都有相应的私有资源(寄存器),这也保证了,一个普通程序(进程)运行在用户模式或者系统模式下,这个时候来了个异常(中断),在处理完中断后,恢复到原有的执行环境中,这个点的保证就是靠着各自的私有资源保存了进入中断前的运行环境

各个模式对应的资源(即寄存器)(s3c2410为例)

其中模式共通持有的寄存器:R0,R1,R2,R3,R,4,R5,R6,R7,R8,R15,以及CPSR

用户和系统模公用一套寄存器:R0~R15,CPSR

终止模式:独自的R13,R14,SPSR

中断模式(IRQ):独自的R13,R14,SPSR

快速中断模式(FIQ):R9~R14,SPSR

管理模式(SVC):独自的R13,R14,SPSR

未定义模式(UND):独自的R13,R14,SPSR

这里是因为R13是堆栈指针,R14保存上一段程序的返回地址,是个模式执行处理都要有的寄存器,所以各个模式都包含了这两个寄存器

然后,快速中断显得有点特殊,因为他多了几个独自的寄存器,原因是为了保证快速中断的执行所必须的

由于R0~R12是共有寄存器,所以会引发一个问题:在模式切换的后,这几个寄存器怎么办,原有的寄存器值怎么办?

这里就要求在进行模式切换的时候要先将原有的寄存器存储到堆栈当中,从而避免修改这几个寄存器的值

R15寄存器代表了当前程序的运行位置,CPU没从R15寄存器指向的地址读出一条指令,者这个寄存器就自动加4字节,加4个字节是因为s3c2410的CPU是32位的,一次读取指令的大小是32位也就是4个字节,也因为R15的这个特性,可以mov r15,lr来实现跳转指令

CPSR与SPSR还有R15这几个寄存器不能存储运算结果的值,同时CPSR记录了程序当前的运行状态

CPSR各个位的含义,0~4位表示模式位,就是决定了管理模式,中断模式,终止模式and so on

I,F,T位,I与F是中断控制位,I是中断的为1屏蔽,为0允许,F位快速中断屏蔽位1屏蔽,0允许,T位指令模式位

N,Z,C,V位,N溢出标志位,Z进位标志位,C零标志,V负数标志

其余为保留位

CPSR保证了程序的正确执行,在一个程序正在执行,无故改变CPSR是非常危险的,但是当某个异常发生的时候,CPU必须终止一段程序的执行,跳转到别处执行另一段程序,这么一来就会带来一个问题,当程序处理完异常跳转会原来的地址时,CPSR可能就被修改了,就会影响程序的正常执行,这个怎么避免?

这就依靠特权模式下的SPSR寄存器了,当异常发生的时候,硬件首先自动的将上一个状态的CPSR寄存器的值保存到异常模式下的SPSR寄存器中,而到程序从异常退出的时候,会将SPSR中的值给回到CSPR,也就因此,每个特权模式下有SPSR寄存器

以上,就是各个寄存器与异常的关系

异常发生时的处理动作:

        1.将CPSR保存到SPSR中

        2.将PC寄存器保存到相应异常模式下的LR寄存器中

        3.将CPSR设置成相应的异常模式

        4.设置PC寄存器的值为相应处理程序的入口地址

        5.进行异常处理

指令执行流程:

    提取指令-》分析指令-》执行指令

执行某条指令必须的步骤,就是上面三步了

而执行这条指令每个步骤消耗一个机器周期,所以要消耗三个机器周期,效率很低,所以CPU就想一个机器周期执行多个动作,所以引出了流水线的概念,第一个周期A指令取指,第二个周期A指令分析,B指令取指,第三个周期A指令执行,B指令分析,C指令取指,从而提高效率,也是因此,PC计数器一直指向的是待取出的那条指令,所以PC指向当前运行的指令的地址+8的位置

异常向量表

5中异常模式,每一种异常模式都应该有唯一一个入口地址,这些入口地址彼此相邻,就是异常向量表

异常向量表是出现在固定位置的的内存空间,当某一个异常发生的时候,程序最终会到达相应的异常入口地址去执行存放在那里的指令。但是异常向量表的每一个入口地址只有4个字节,所以存放的指令一定是跳转指令,跳转到处理程序的一堆指令那里去

其实中断处理流程就是一个圈,就是进去的时候要保存原来的环境,出来的时候再回复原来的环境,然后根据向量表找到正确的进圈的入口,出圈的时候要根据PC计数器与LR计数器出圈





猜你喜欢

转载自blog.csdn.net/weixin_42135997/article/details/80999189