ARM体系结构对中断的支持简述
ARM异常简介
ARM体系结构的异常共有reset, undefined instruction, software interrupt, prefetch abort, data abort, IRQ和FIQ七种。
- Reset异常一般由处理器的reset引脚被设置(开机或模拟开机重置效果)触发,也可由软件跳转到reset中断向量 (0x0000)触发。
- Undefined instruction异常发生在处理器无法识别当前执行的指令时。
- SWI (Software Interrupt)是用户定义的中断指令,即陷入指令。
- Prefetch abort异常的原因是从非法地址取指,但在流水线执行到该指令时才被触发。
- Data abort异常由试图对非法地址读或写触发。
- IRQ指外部中断请求 (External Interrupt Request),当处理器的外部中断请求引脚被设置且CPSR寄存器中的I位为0 (enable) 时被触发。
- FIQ指外部快速中断请求 (External Fast Interrupt Request),当处理器的外部快速中断请求引脚被设置且CPSR寄存器中的F位为0 (enable)时被触发。
ARM的中断向量表置于内存映射的底部,每个表项32位,存放一条跳转到中断处理程序的分支指令。
下表展示了各异常类型的中断向量地址、处理器模式和优先级。
向量地址 | 异常类型 | 异常模式 | 优先级 (1为最高,6为最低) |
---|---|---|---|
0x0 | Reset | Supervisor (SVC) | 1 |
0x4 | Undefined Instruction | Undef | 6 |
0x8 | Software Interrupt (SWI) | Supervisor (SVC) | 6 |
0xC | Prefetch Abort | Abort | 5 |
0x10 | Data Abort | Abort | 2 |
0x14 | Reserved | - | - |
0x18 | Interrupt (IRQ) | Interrupt (IRQ) | 4 |
0x1C | Fast Interrupt (FIQ) | Fast Interrupt (FIQ) | 3 |
如上表所示,异常会导致处理器模式改变。因此每个异常处理程序都独有寄存器的一个子集,称为banked registers, 其中每个模式都具备的是r13_mode (Stack Pointer), r14_mode (Link Register), SPSR_mode (Saved Program Status Register). 例如:r13_fiq是FIQ模式的Stack Pointer, r14_svc是Supervisor模式的Link Register, SPSR_abt是Abort模式的Saved Program Status Register. Banked registers的特点是不必在上下文切换时压入栈,因为每个模式的banked registers在物理上是分离的。FIQ模式的banked registers数量多于其他模式,因此上下文切换更快——也就是“快速”的由来。
中断处理流程中硬件负责的工作
进入中断处理程序前:
- 保存现场:将CPSR (Current Program Status Register)拷贝到即将进入的处理器模式的SPSR中;保存当前处理器模式、中断屏蔽寄存器、条件标志。
- 修改CPSR中处理器模式位,以进入对应的模式。
- 将本模式对应的banked registers映射进来。
- 关中断:任何异常均需关IRQ, 发生FIQ或Reset异常时需关FIQ.
- 将lr_mode设置为返回地址。
- 将PC设为对应的中断向量中的中断处理程序入口地址。
从中断处理程序返回:
总的来说,为将控制重新移交给发生异常的位置,需从spsr_mode中复原CPSR, 并从lr_mode中复原PC. 注意lr_mode中存放的返回地址值并不一定是发生异常时的PC值,而是根据异常类型而定。若中断处理程序将部分寄存器压入栈中,还需复原这些寄存器。
参考资料:
[1] http://osnet.cs.nchu.edu.tw/powpoint/Embedded94_1/Chapter 7 ARM Exceptions.pdf
[2] http://www.ic.unicamp.br/~celio/mc404-2013/arm-manuals/ARM_exception_slides.pdf