ARM核的中断支持
重点引用了这篇文章:
~radetzki/Seminar06/08_report.pdf
ARM处理器有7种操作模式
User (usr)
|
Normal program execution mode
|
FIQ (fiq)
|
Fast data processing mode
|
IRQ (irq)
|
For general purpose interrupts
|
Supervisor (svc)
|
A protected mode for the operating system
|
Abort (abt)
|
A protected mode for the operating system
|
Undefined (und)
|
For undefined instructions
|
System (sys
|
Operating system privileged mode
|
ARM的寄存器根据不同的工作模式而不同,比如在user模式下有R0到R15等16个寄存器,其中R0到R12是通用寄存器,R13是栈寄存器,R15是PC寄存器(存正在执行的下一条指令),R14是subroutine link register。R16是CPSR(current program status register),这个寄存器被所有的模式共享,并且在模式切换的时候发挥主导作用。SPSR寄存器用来做CPSR的备份,全名叫Saved Program Status Register。
Subroutine Link Register用来返回PC指针到合适的位置,当异常发生时,基于当前PC指针和异常类型给它赋值。某些情况下它应该存储异常处理结束后返回的指令,而在某些情况下,它会返回一两个指令之前的部分。例如内存访问异常,当异常处理完成后,PC会指向同样的指令来重新尝试同一个内存位置。
另外ARM寄存器有一种Banked机制,它会在不同的模式使用不同的替补寄存器。。。但是场上一直都是16个队员(寄存器)。比如每个状态都有不同的物理寄存器来打“SPSR”这个位置。这样就会使模式之间的切换更快,开销更小。因此所有寄存器加起来有37个。如图所示:
异常和中断
ARM里定义能挂起所有当前执行指令的就是异常,所以中断其实是异常的一种。
每一个异常都有一个处理程序,并且都会导致ARM核进入一个模式。异常有如下几种,后面是处理异常时进入的模式
异常
|
模式
|
Fast Interrupt Request
|
FIQ
|
Interrupt Request
|
IRQ
|
SWI and RESET
|
SVC
|
Instruction fetch or memory access failure
|
ABT
|
Undefined Instruction
|
UND
|
中断分两种:外部和内部,外部的是硬件中断,分别是IRQ和FIQ,内部的是软件中断,是SWI。
所以可以看出ARM处理中断的模式有三个:SVC、IRQ和FIQ模式。
中断是如何分配的?
SWI用来进行系统调用
IRQ用来进行一般中断如时钟
FIQ保留给需要快速响应的设备如DMA
每个支持中断的系统都必须考虑两个问题,第一是如何处理多个中断?第二是如何减少中断延迟?
总的来说有两个方法:中断优先级和中断嵌套。将二者排列组合,有一些处理策略:
非嵌套不带优先级
非嵌套带优先级
嵌套不带优先级
嵌套带优先级
ARM核提供了各种策略实现的可能性,系统设计者可以在硬件实现,比如在中断控制器;也可以在软件实现,比如Linux。
ARM+Linux的中断处理
在ARM的CPSR中,有一个I位和一个F位,分别用来屏蔽IRQ和FIR,软件可以用指令来设置CPSR已开关中断。
关于IRQ和FIR的逻辑是:IRQ不能打断IRQ,只有FIR能打断IRQ,而且一段时间只能存在一个FIR。所以这是一个很简单的优先级带嵌套的处理策略。
而Linux没有FIR,只有IRQ。所以ARM+Linux是非嵌套并不带优先级的策略。linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。
关于时钟中断
时钟中断是由可编程定时/计数器产生的,比如8253或8254芯片,它有一个输入脉冲,有三个输出脉冲,第一个输出脉冲接到中断控制器上,形成时钟中断。在PC上,计时器和时钟中断是两个概念,计时器是CMOS芯片,而时钟中断是有8253产生的。时钟中断的时间精度需要矫正,所以Linux有一个TSC计数器,64位的,用来矫正时间。
详细的需要参考:
http://blog.csdn.net/wdzxl198/article/details/8874859
中断执行后,必然进行任务调度,这样,时钟中断就有了“心跳”的意义。Linux时钟中断是100次每秒,心跳频率。时钟中断提供了一切跟时间相关的所有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器,进程更新后的时间片为进程调度提供依据。
阅读(2453) | 评论(0) | 转发(0) |