摘自 : 《ARM SOC体系结构》--steve furber
CPSR(cureent program status registers) : 当前程序状态寄存器。低五位用于定义当前操作模式。
CPSR[4:0] | 模式 | 用途 | 寄存器
10000 |用户 |正常用户模式 | 用户
10001 |FIQ |处理快速中断 | _fiq (fast interrupt )
10010 |IRQ |处理标准中断 |_irq (interrupt )
10011 |SVC | 处理软件中断(SWI)| _svc
10111 |中止 |处理寄存器故障 | _abt (abort)
11011 |未定义| 处理未定义的指令陷阱 | _und (undefine)
11111 |系统 | 运行特权操作系统任务 | 用户
SPSR(saved program status register): 程序状态保存寄存器。主要用于恢复用户状态到之前的状态,类似于中断的时候,保存的pc指针。
进入异常
当异常发生时,ARM尽量完成当前指令,然后脱离当前指令序列去处理异常。
处理顺序如下 :
1),进入特定的异常相应的操作模式
2),将引起异常指令的下一条指令的地址保存到新的模式的r14中(对的,这里是r14,异常返回是将r14恢复到r15)
3),将CPSR的原值保存到新模式的SPSR
4,),通过设置CPSR的第7位来禁止IRQ,如果异常位快速中断,还要设置CPSR的第6位来禁止快速中断
5),将PC强制赋值,使程序从表(arm 异常的向量地址)给出的相应的向量地址开始执行。
异常返回
一旦异常处理完毕,用户任务便恢复正常,这就要求异常处理程序代码精确的恢复异常发生是的用户状态。
1),所有修改过的用户寄存器必须从处理程序的堆栈中恢复
2),CPSR必须从相应的SPSR中恢复
3),PC必须变回到再用户指令流中相应的指令地址
异常的优先级:
1),复位
2),数据异常中止
3),FIQ
4),IRQ
5),预取指异常中止
6),SWI,未定义指令