目录
异常
异常源
异常处理
异常向量表
安装设置异常向量表及保存现场指令
异常处理的返回
异常源与异常模式对应关系
异常响应优先级
ARM7-11 有7种基本工作模式,而 Cortex-A 系列处理器则额外支持 Monitor 模式:
- User:非特权模式,大部分任务执行在这种模式。
- FIQ:当一个高优先级(fast)中断产生时将会进入这种模式。
- IRQ:当一个低优先级(normal)中断产生时将会进入这种模式。
- Supervisor/SVC:当复位或软中断指令执行时将会进入这种模式。
- Abort:当存取异常时将会进入这种模式。
- Undef:当执行未定义指令时会进入这种模式。
- System:使用和 User 模式相同寄存器集的特权模式。
- Monitor:Cortex-A 特有模式,用于执行安全监控代码的模式;也是一种特权模式。
异常
异常是处理器处理特定事件的方式,中断是异常的一种形式。处理器遇到异常后会暂停当前的程序转而去处理异常(执行异常处理程序),处理完成后返回到被异常打断的代码处继续执行。
异常源
导致异常产生的事件有7个:
- Reset 复位异常:当 CPU 刚上电或按下 reset 重启键之后进入该异常,该异常在 SVC 模式下处理。
- IRQ/FIQ 一般/快速中断请求:CPU 和外部设备是分别独立的硬件执行单元,CPU 要想知道外部设备的运行状态,需要通过中断请求,根据请求的紧急情况分为一般中断和快速中断。
- PrefetchAbort 预取指令中止异常:该异常发生在 CPU 流水线取指阶段,如果目标指令地址是非法地址进入该异常,该异常在 Abort 模式下处理。
- Undef 未定义指令异常:该异常发生在流水线技术里的译码阶段,如果当前指令不能被识别为有效指令,产生未定义指令异常,该异常在 Undef 模式下处理。
- SWI 软件中断指令异常:该异常是应用程序自己调用时产生的,用于用户程序申请访问硬件资源时,例如:printf() 打印函数,该异常在 SVC 模式下处理。
- DataAbort 数据中止访问异常:该异常发生在要访问数据地址不存在或者为非法地址时,该异常在 Abort 模式下处理。
异常处理
异常处理的步骤(自动完成):
- 保存执行状态:将当前的 CPSR 保存到 SPSR_<mode> 中。
- 模式切换:进入 ARM 状态,并进入相应的异常模式,同时禁止相应中断。
- 保存返回地址:跳转到异常处理之前,将 PC 下一条指令地址保存到 LR_<mode> 中。
- 设置 PC 为相应的异常向量地址:修改 PC 切换到异常处理位置。
异常向量表
异常向量表是处于内存中的一段空间,为每个异常源分配了四个字节的存储空间。当产生了异常后 PC 的值会自动变成该异常源在异常向量表中的地址。我们可以在这段地址写一条跳转指令使其跳转到异常处理程序入口。
安装设置异常向量表及保存现场指令
- 安装异常向量表:我们可以通过简单的使用下面的指令来安装异常向量表:
b reset ; 跳入 reset 处理程序 b undef_handler ; 跳入未定义处理程序 b swi_handler ; 跳入软中断处理程序 b pref_handler ; 跳入预取指令处理程序 b data_handler ; 跳入数据访问中止处理程序 b res ; 跳入未使用程序 b irq_handler ; 跳入中断处理程序 b fiq_handler ; 跳入快速中断处理程序
- 保存执行现场:异常处理程序最开始,要保存被打断程序的执行现场,可以通过下面的栈操作指令实现保存现场:
stmfd sp!, {r0-r1, lr}
需要注意的是,在跳转到异常处理程序入口时,已经切换到对应异常模式下了,因此这里的SP是异常模式下的SP了,所以被打断程序现场(寄存器数据)是保存在异常模式下的栈里,上述指令将R0~R1全部都保存到了异常模式栈,最后将修改完的被打断程序返回地址入栈保存,之所以保存该返回地址就是将来可以通过类似:MOV PC, LR的指令,返回用户程序继续执行。
异常发生后,要针对异常类型进行处理,因此,每种异常都有自己的异常处理程序,中断异常处理过程通过系统中断处理来进行分析。
异常处理的返回
异常处理完成之后,返回被打断程序继续执行,具体操作如下:
- 恢复被打断程序运行时寄存器数据(从栈中恢复)。
- 恢复程序运行时状态 CPSR(恢复 SPSR_<mode> 到 CPSR)。
- 通过进入异常时保存的返回地址,返回到被打断程序继续执行(恢复 LR_<mode> 到 PC)。
异常源与异常模式对应关系
- 异常源:FIQ、IRQ、Reset/软中断、DataAbort/PrefetchAbort、Undef。
- 异常模式:FIQ、IRQ、SVC、Abort、Undef。
异常响应优先级
- 优先级:Reset、Data Abort、FIQ、IRQ、Prefetch Abort、SWI、Undefined instruction。
- 从高到低。