目录
异常的概念
ARM的异常源
异常优先级
异常模式
异常处理的过程
状态寄存器CPSR
异常向量表
异常的概念
异常是计算机系统中一种突发事件或错误情况,它打破了正常的程序执行流程,需要特殊处理。异常可能由硬件错误、软件错误或外部事件引发,例如访问无效的内存地址、除以零、非法指令、IO错误、中断等。
异常通常会导致程序执行的中断或终止,以防止继续执行可能会导致更严重错误的代码。当异常发生时,处理器会转移到一个预定义的异常处理程序或异常处理例程,其中包含了对异常进行处理的代码。
异常处理程序的主要目标是确保系统的稳定和可靠性。它可能包括一系列操作,如保存当前程序状态、获取有关异常的信息、恢复系统状态、记录异常日志、通知相关方等。处理程序还可以采取适当的措施来处理异常,如修复错误、重新启动系统、调用异常处理程序等。
异常是操作系统和编程语言中非常重要的概念,它们提供了一种机制来处理运行时错误和异常情况,以确保程序的正常执行和系统的稳定性。通过捕捉和处理异常,开发者可以编写更健壮、可靠的代码。
ARM的异常源
FIQ | 快速中断请求 引脚有效 |
IRQ | 外部中断请求 引脚有效 |
Reset | 复位电平有效 |
Software Interrupt | 执行swi指令 |
Data Abort | 数据终止 |
Prefetch Abort | 指令预取终止 |
Undefined Instruction | 遇到不能处理的指令 |
异常优先级
1、Reset(重置)
处理器上电或者复位时发生的异常
2、Data Abort(数据中止)
数据访问错误时发生的异常,一般是与Memory 误操作有关,如对不合法的内存地址、0地址写操作,或对一些Memory 越界操作。或者指令不支持
3、FIQ (快速中断)、IRQ (普通中断)
FIQ 具有更高的优先级,即当 FIQ 发生时,CPU 会在当前指令执行完成后立即响应 FIQ 中断,而忽略其他 IRQ 中断。这使得 FIQ 更适合处理紧急、实时性要求较高的中断。
4、Prefetch Abort(指令预取错误时发生的异常)
当CPU在执行指令时,发现指令缓存中没有下一条指令时,就会发生预取指中止异常。这种异常通常是由于程序中的错误或者硬件故障引起的。由于预取指中止异常的信息不够详细,因此很难定位和修复问题。
5、Software Interrupt(软件中断)
软件中断是一种由应用程序发起的中断,用于请求操作系统提供服务或执行某些操作。当应用程序需要访问受保护的资源或请求操作系统提供服务时,它会发出一个软件中断信号,这个信号会被CPU接收并暂时将控制切换到一个中断处理程序,内核中被中断挂起的进程将在中断被接受后恢复。软件中断可以被看作是同步事件,因为它是由应用程序主动发起的,而不是由外部设备触发的。
6、Undefined instruction(执行了未定义指令时发生的异常)
Undefined instruction异常是ARM处理器中的一种异常类型,当CPU遇到不认识的指令时,就会触发该异常。在异常处理函数中,可以对该异常进行处理,例如打印debug信息或者进行其他操作。
异常模式
异常处理的过程
1》保存执行状态当前程序的执行状态是保存在CPSR里面的,异常发生时,要保存当前的CPSR里的执行状态到异常模式里的SPSR里,将来异常返回时,恢复回CPSR,恢复执行状态。
2》模式切换
硬件自动根据当前的异常类型,将异常码写入CPSR里的M[4:0]模式位,这样CPU就进入了对应异常模式下。不管是在ARM状态下还是在THUMB状态下发生异常,都会强制切换到ARM状态下进行异常的处理,这是由硬件自动完成的,将CPSR[5] 设置为 0。同时,CPU会关闭中断IRQ(设置CPSR 寄存器I位),防止中断进入,如果当前是快速中断FIQ异常,关闭快速中断(设置CPSR寄存器F位)。
3》保存返回地址
当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。
4》跳入异常向量表
该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值修改为一个固定内存地址,这个固定地址叫做异常向量。
状态寄存器CPSR
异常向量表
- 异常向量表的本质是内存中的一段代码
- 表中为每个异常源分配了四个字节的存储空间
- 遇到异常后处理器自动将PC修改为对应的地址
- 因为异常向量表空间有限一般我们不会再这里写异常处理程序,而是在对应的位置写一条跳转指令使其跳转到指定的异常处理程序的入口
ARM的异常向量表的基地址默认在0x00地址但可以通过配置协处理器来修改其地址