定义:
在cpu执行程序(指令),有可能会出现意外情况,需要去解决对应的意外情况,就叫做异常 。
1、异常源
在ARM体系结构中设计了7种异常源,ARM架构就需要对这些异常源进行处理,只要执行程序指令时产生对应的异常就会执行对应的异常处理。
只要发生对应的异常时,处理器就会把PC寄存器设置为特定的存储器地址。这个地址被放在称为向量表的范围内,向量表内就是一些跳转操作。即CPU设计了一个向量表来表示每一种异常的处理方式,只要产生异常,pc寄存器就会被设置为向量表中的对应异常的地址,执行异常向量表中的对应指令(跳转执行,执行对应的处理办法)
异常源:
异常 | 什么时候执行 |
Reset | 上电就执行 |
undef | 当流水线中某个非法指令被执行 |
(undefined) swi | 当程序执行软中断指令时执行 |
(supervisor svc) prefetch | 当指令从内存进行存取指令失败时执行 |
(abort) data | data 当指令从内存存取数据失败时执行 |
(abort) irq | irq 一般中断 fiq 快速中断 |
2、异常产生时发生的硬件操作
步骤:
1、保存执行状态 把cpsr寄存器的内容复制到对应产生异常的模式下的spsr;
2、模式切换
a、由硬件自动把cpsr中的模式[4:0]设置为与异常相对应的值 ;
b、处理器设置为ARM状态,执行ARM指令 c、禁止中断,如进入FIQ模式自动把IRQ中断禁止。
3、保存返回地址 把当前的下一条指令的地址(PC寄存器)保存到 lr_mode 寄存器(异常模式下);
4、跳入异常向量表 强制设置pc寄存器为对应异常向量地址。
3、异常向量表
异常向量表是一段特定的内存空间,每一种ARM异常都在异常向量中设定出来,对应一个字长空间(4Byte-32bit),刚好就是一条ARM指令大小。当产生异常时,cpu会强制把pc的值设置为异常对应的固定内存地址。
注: 当产生异常后硬件能够完成的操作就只是跳转到异常向量表(pc赋值为异常向量地址),剩下的异常处理都是程序员去完成,通常都是在异常向量中写一条跳转指令,表示产生异常应该怎么做,跳转到对应的地址(异常处理的地址)执行。
4、异常处理(自己实现)
步骤:
1、保存执行现场(进入异常之前的寄存器的值) 把寄存器的值保存到对应异常模式下的栈(内存)(入栈),sp寄存器存栈地址;
2、执行对应的异常操作;
3、恢复之前现场 当异常处理完,要返回异常之前的状态,继续执行 a、恢复之前的寄存器数据(从sp对应的栈出栈存储到对应寄存器) b、恢复程序运行是的状态cpsr c、通过异常进入时保存的返回地址(lr寄存器),可以返回到被打断的程序继续执行。