ARM 处理器异常处理机制详解

目录

异常

异常源

异常处理

异常向量表

安装设置异常向量表及保存现场指令

异常处理的返回

异常源与异常模式对应关系

异常响应优先级


ARM7-11 有7种基本工作模式,而 Cortex-A 系列处理器则额外支持 Monitor 模式:

  • User:非特权模式,大部分任务执行在这种模式。
  • FIQ:当一个高优先级(fast)中断产生时将会进入这种模式。
  • IRQ:当一个低优先级(normal)中断产生时将会进入这种模式。
  • Supervisor/SVC:当复位或软中断指令执行时将会进入这种模式。
  • Abort:当存取异常时将会进入这种模式。
  • Undef:当执行未定义指令时会进入这种模式。
  • System:使用和 User 模式相同寄存器集的特权模式。
  • Monitor:Cortex-A 特有模式,用于执行安全监控代码的模式;也是一种特权模式。

异常

异常是处理器处理特定事件的方式,中断是异常的一种形式。处理器遇到异常后会暂停当前的程序转而去处理异常(执行异常处理程序),处理完成后返回到被异常打断的代码处继续执行。

异常源

导致异常产生的事件有7个:

  1. Reset 复位异常:当 CPU 刚上电或按下 reset 重启键之后进入该异常,该异常在 SVC 模式下处理。
  2. IRQ/FIQ 一般/快速中断请求:CPU 和外部设备是分别独立的硬件执行单元,CPU 要想知道外部设备的运行状态,需要通过中断请求,根据请求的紧急情况分为一般中断和快速中断。
  3. PrefetchAbort 预取指令中止异常:该异常发生在 CPU 流水线取指阶段,如果目标指令地址是非法地址进入该异常,该异常在 Abort 模式下处理。
  4. Undef 未定义指令异常:该异常发生在流水线技术里的译码阶段,如果当前指令不能被识别为有效指令,产生未定义指令异常,该异常在 Undef 模式下处理。
  5. SWI 软件中断指令异常:该异常是应用程序自己调用时产生的,用于用户程序申请访问硬件资源时,例如:printf() 打印函数,该异常在 SVC 模式下处理。
  6. DataAbort 数据中止访问异常:该异常发生在要访问数据地址不存在或者为非法地址时,该异常在 Abort 模式下处理。
异常处理

异常处理的步骤(自动完成):

  1. 保存执行状态:将当前的 CPSR 保存到 SPSR_<mode> 中。
  2. 模式切换:进入 ARM 状态,并进入相应的异常模式,同时禁止相应中断。
  3. 保存返回地址:跳转到异常处理之前,将 PC 下一条指令地址保存到 LR_<mode> 中。
  4. 设置 PC 为相应的异常向量地址:修改 PC 切换到异常处理位置。
异常向量表

异常向量表是处于内存中的一段空间,为每个异常源分配了四个字节的存储空间。当产生了异常后 PC 的值会自动变成该异常源在异常向量表中的地址。我们可以在这段地址写一条跳转指令使其跳转到异常处理程序入口。

安装设置异常向量表及保存现场指令
  1. 安装异常向量表:我们可以通过简单的使用下面的指令来安装异常向量表:
    b reset   ; 跳入 reset 处理程序
    b undef_handler ; 跳入未定义处理程序
    b swi_handler    ; 跳入软中断处理程序
    b pref_handler  ; 跳入预取指令处理程序
    b data_handler   ; 跳入数据访问中止处理程序
    b res ; 跳入未使用程序
    b irq_handler   ; 跳入中断处理程序
    b fiq_handler  ; 跳入快速中断处理程序
  2. 保存执行现场:异常处理程序最开始,要保存被打断程序的执行现场,可以通过下面的栈操作指令实现保存现场:
    stmfd sp!, {r0-r1, lr}

    需要注意的是,在跳转到异常处理程序入口时,已经切换到对应异常模式下了,因此这里的SP是异常模式下的SP了,所以被打断程序现场(寄存器数据)是保存在异常模式下的栈里,上述指令将R0~R1全部都保存到了异常模式栈,最后将修改完的被打断程序返回地址入栈保存,之所以保存该返回地址就是将来可以通过类似:MOV PC, LR的指令,返回用户程序继续执行。

    异常发生后,要针对异常类型进行处理,因此,每种异常都有自己的异常处理程序,中断异常处理过程通过系统中断处理来进行分析。

异常处理的返回

异常处理完成之后,返回被打断程序继续执行,具体操作如下:

  1. 恢复被打断程序运行时寄存器数据(从栈中恢复)。
  2. 恢复程序运行时状态 CPSR(恢复 SPSR_<mode> 到 CPSR)。
  3. 通过进入异常时保存的返回地址,返回到被打断程序继续执行(恢复 LR_<mode> 到 PC)。
异常源与异常模式对应关系
  • 异常源:FIQ、IRQ、Reset/软中断、DataAbort/PrefetchAbort、Undef。
  • 异常模式:FIQ、IRQ、SVC、Abort、Undef。
异常响应优先级
  • 优先级:Reset、Data Abort、FIQ、IRQ、Prefetch Abort、SWI、Undefined instruction。
  • 从高到低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨笨小乌龟11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值