从异常处理程序中返回包括下面两个基本操作:
(1)恢复被中断的程序的ARM处理器状态,即把SPSR_mode寄存器的内容复制到CPSR中。
(2)返回到发生异常的指令的下一条指令处执行,即把LR_mode寄存器的内容减去相应地偏移量后赋值给PC。
复位异常处理程序不需要返回,因为整个应用系统是从复位异常处理程序开始执行的。
异常返回时一个非常重要的问题是返回地址的确定,在异常发生时,内核已经自动地将返回地址保存到LR中,但是该LR中的值并不一定是正确的返回地址。实际上,当异常发生时,PC所指的位置对于各种不同的异常是不同的。同样,返回地址对于各种不同的异常也是不同的。
在ARM体系结构里,PC的值是当前执行指令的地址加8字节,也就是说,如果执行的指令是BL指令(假设指令地址是A),那么会将PC=A+8的保存到LR中,接下来ARM处理器会马上自动地对LR进行调整,即LR=LR-4=A+4。这样,最终保存在LR中的地址刚好是BL指令跳转后的返回地址。这样的调整机制在所有的LR自动保存操作中都存在,因此当异常响应过程内核自动保存返回地址到LR时,也进行了一次LR-4的自动调整。下面详细介绍各种异常中断处理程序的返回地址的计算。
1.软件中断异常和未定义指令异常处理程序的返回
软件中断异常和未定义指令异常是由当前执行指令自身产生的,当发生SWI和未定义指令异常时,PC的值还未更新,它指向当前指令后面的第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当SWI和未定义指令异常中断发生时,ARM处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令,因此返回操作可以通过下面的指令实现:
该指令将LR中的值复制到PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到CPSR中。
2.外部中断请求异常和快速中断请求异常处理程序的返回
通常,ARM处理器执行完当前指令后,查询外部中断请求引脚及快速中断请求引脚,并且查看系统是否允许外部中断请求异常及快速中断请求异常。如果有引脚有效,并且系统允许该异常产生,ARM处理器将产生外部中断请求异常或快速中断请求异常。当产生外部中断请求异常和快速中断请求异常时,PC的值已经更新,它指向当前指令后面的第3条指令(对于ARM指令来说,它指向当前指令地址加12个字节的位置;对于Thumb指令来说,它指向当前指令地址加6个字节的位置)。当产生外部中断请求异常和快速中断请求异常时,ARM处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令后的第2条指令。因此返回操作可以通过下面的指令实现:(www.xing528.com)
该指令将LR中的值减4后,复制到PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到CPSR中。
3.指令预取中止异常处理程序的返回
在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,ARM处理器产生指令预取中止异常。
当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常处理程序应该返回到产生该指令预取中止异常的指令处,而不是像前面两种情况下返回到产生异常的指令的下一条指令处。
指令预取中止异常是由当前执行的指令自身产生的,当指令预取中止异常产生时,PC的值还未更新,它指向当前指令后面的第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常产生时,ARM处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令实现:
该指令将LR中的值减4后,复制到PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到CPSR中。
4.数据访问中止异常处理程序的返回
跟指令预取中止异常一样,当发生数据访问中止异常时,程序要返回到该有问题的数据访问处,重新访问该数据。因此数据访问中止异常处理程序应该返回到产生该数据访问中止异常中断的指令处,而不是返回到当前指令的下一条指令处。
数据访问中止异常是由数据访问指令产生的,当数据访问中止异常产生时,PC的值已经更新,它指向当前指令后面的第3条指令(对于ARM指令来说,它指向当前指令地址加12个字节的位置;对于Thumb指令来说,它指向当前指令地址加6个字节的位置)。当数据访问中止异常发生时,ARM处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令后的第2条指令。因此返回操作可以通过下面的指令实现:
该指令将LR中的值减8后,复制到PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到CPSR中。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。