ARM异常和中断

ARM 357浏览


异常和中断

异常就是在程序运行过程中(USER mode),出现了一些异常情况,而中断是异常的一种情况.

模式和异常的对应关系

如图:

上图需要特别注意的就是,如果在程序执行过程中需要进行系统调用(程序正常运行在USER模式,而内核运行在SVC模式,user模式无法直接运行SVC模式的指令,因此需要通过异常的方式进入到特权模式. 故这里就通过SWI实现.),即 SWI软中断–>SVC.

异常处理

异常向量表

存储在内存固定区域,表中每一个表项都对应一个异常类型,存了一个跳转指令:LDR PC, handle(将需要调用的函数地址放到PC中,即可跳转到指定的地址执行)

异常优先级

  1. RESET
  2. Data Abort(数据异常)
  3. FIQ
  4. IRQ
  5. Prefetch Abort(指令预取异常)
  6. SWI(软件中断)
  7. Undefined Instruction(未定义指令)

异常处理流程

CPU(进入异常)

  1. 拷贝 进入异常前的模式的CPSR —-> SPSR_< mode>(对应的异常模式的SPSR,用以退出异常时恢复到当前现场);
  2. 在异常处理中,再重新设置异常模式的CPSR:
    • 改变处理器状态进入ARM状态;
    • 改变处理器模式进入相应的异常模式;
    • 设置中断禁止,禁止相应中断;
      (以上操作后,进入到SVC模式)
  3. 保存当前模式(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
  4. 设置PC为相应的异常向量;

程序员(退出异常,恢复)

  1. 从SPSR_< mode> 恢复 CPSR;(切换会原来的状态)
  2. 从LR_< mode> 恢复 PC;(让PC指向LR_SWI)

note:

这些操作只能在arm态下才能执行.

中断处理

ARM有两级中断FIQ,IRQ.
FIQ之所以快的原因:

  • 优先级非常高
  • FIQ禁止产生IRQ
  • 设计时,将FIQ放在异常向量表的末尾,因此可以直接将FIQ的异常处理函数紧跟放在其后,无需跳转;
  • 独有的私有寄存器,因此无需在中断前保护其他寄存器状态.