ARM异常和中断
2016-08-01 14:43
218 查看
异常和中断
模式和异常的对应关系
异常处理
异常向量表
异常优先级
异常处理流程
CPU进入异常
程序员退出异常恢复
note
中断处理
上图需要特别注意的就是,如果在程序执行过程中需要进行系统调用(程序正常运行在USER模式,而内核运行在SVC模式,user模式无法直接运行SVC模式的指令,因此需要通过异常的方式进入到特权模式. 故这里就通过SWI实现.),即 SWI软中断–>SVC.
Data Abort(数据异常)
FIQ
IRQ
Prefetch Abort(指令预取异常)
SWI(软件中断)
Undefined Instruction(未定义指令)
在异常处理中,再重新设置异常模式的CPSR:
改变处理器状态进入ARM状态;
改变处理器模式进入相应的异常模式;
设置中断禁止,禁止相应中断;
(以上操作后,进入到SVC模式)
保存当前模式(user)的返回地址到异常模式中的LR_< mode>(LR_SWI);
返回地址: 这个返回地址指的是,异常到达时,正在执行的指令的下一条指令的地址;
这里cpu进入异常处理时,默认操作为:
因此,针对不同的异常在恢复pc时操作是不一样的:
SWI/Undef: 直接取回lr中的指令地址即可, 即
IRQ/FIQ/Prefetch Abort: 在取回时,还需手动-4, 即
Data Abort: 重新执行当前指令,因此手动-8, 即
设置PC为相应的异常向量;
从LR_< mode> 恢复 PC;(让PC指向LR_SWI)
FIQ之所以快的原因:
优先级非常高
FIQ禁止产生IRQ
设计时,将FIQ放在异常向量表的末尾,因此可以直接将FIQ的异常处理函数紧跟放在其后,无需跳转;
独有的私有寄存器,因此无需在中断前保护其他寄存器状态.
模式和异常的对应关系
异常处理
异常向量表
异常优先级
异常处理流程
CPU进入异常
程序员退出异常恢复
note
中断处理
异常和中断
异常就是在程序运行过程中(USER mode),出现了一些异常情况,而中断是异常的一种情况.模式和异常的对应关系
如图:上图需要特别注意的就是,如果在程序执行过程中需要进行系统调用(程序正常运行在USER模式,而内核运行在SVC模式,user模式无法直接运行SVC模式的指令,因此需要通过异常的方式进入到特权模式. 故这里就通过SWI实现.),即 SWI软中断–>SVC.
异常处理
异常向量表
存储在内存固定区域,表中每一个表项都对应一个异常类型,存了一个跳转指令:LDR PC, handle(将需要调用的函数地址放到PC中,即可跳转到指定的地址执行)异常优先级
RESETData Abort(数据异常)
FIQ
IRQ
Prefetch Abort(指令预取异常)
SWI(软件中断)
Undefined Instruction(未定义指令)
异常处理流程
CPU(进入异常)
拷贝 进入异常前的模式的CPSR —-> SPSR_< mode>(对应的异常模式的SPSR,用以退出异常时恢复到当前现场);在异常处理中,再重新设置异常模式的CPSR:
改变处理器状态进入ARM状态;
改变处理器模式进入相应的异常模式;
设置中断禁止,禁止相应中断;
(以上操作后,进入到SVC模式)
保存当前模式(user)的返回地址到异常模式中的LR_< mode>(LR_SWI);
返回地址: 这个返回地址指的是,异常到达时,正在执行的指令的下一条指令的地址;
这里cpu进入异常处理时,默认操作为:
lr= pc-4(结合三级流水线)
因此,针对不同的异常在恢复pc时操作是不一样的:
SWI/Undef: 直接取回lr中的指令地址即可, 即
mov pc,lr
IRQ/FIQ/Prefetch Abort: 在取回时,还需手动-4, 即
subs pc, lr,#4
Data Abort: 重新执行当前指令,因此手动-8, 即
subs pc, lr ,#8
设置PC为相应的异常向量;
程序员(退出异常,恢复)
从SPSR_< mode> 恢复 CPSR;(切换会原来的状态)从LR_< mode> 恢复 PC;(让PC指向LR_SWI)
note:
这些操作只能在arm态下才能执行.中断处理
ARM有两级中断FIQ,IRQ.FIQ之所以快的原因:
优先级非常高
FIQ禁止产生IRQ
设计时,将FIQ放在异常向量表的末尾,因此可以直接将FIQ的异常处理函数紧跟放在其后,无需跳转;
独有的私有寄存器,因此无需在中断前保护其他寄存器状态.