加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

ARM用户层发生异常后软硬件协同处理步骤

发布时间:2021-11-22 11:13:51 所属栏目:PHP教程 来源:互联网
导读:我这里是要简单说一下,在ARM平台的用户层发生异常后的软硬件协同处理流程,是个大致的概况,对宏观了解后,具体细节内容网上有很多,可以自行查询。 用户层程序正在执行时,遇到未定义的指令(ARM不是别的指令)或者SWI软件中断指令(产生系统调用),就会

我这里是要简单说一下,在ARM平台的用户层发生异常后的软硬件协同处理流程,是个大致的概况,对宏观了解后,具体细节内容网上有很多,可以自行查询。
 
用户层程序正在执行时,遇到未定义的指令(ARM不是别的指令)或者SWI软件中断指令(产生系统调用),就会产生异常,这里以未定义指令异常为例进行说明:
 
一旦出现未定义指令异常,CPU会自动做如下操作:
 
(1)未定义模式(ARM七种运行模式的一种)下对应的lr(即R14,不同的运行模式有不同的lr寄存器)寄存器保存当前发生异常的指令下一条指令的地址。例如,在用户态有A B C 三条指令顺序执行,指令A发生未定义指令异常,则指令B的地址就会由CPU保存到未定义模式下的lr寄存器中,用于异常返回。
 
(2)CPU修改CPSR寄存器,进入未定义模式:
 
CPSR[4:0]=0b11011  /*将CPSR的低五位置位11011,正好对应未定义指令模式*/
 
(3)因为ARM异常只能在ARM状态处理,所以要将状态修改为ARM指令集状态:
 
CPSR[5]=0
 
(4)CPU根据发生的异常是未定义指令异常,将PC置为0x0000 0004(也有可能是0xffff0004,在这里不做分析):
 
PC=0x00000004
 
以上是CPU在做,剩下的都是操作系统完成,我这里只说个大概,具体细节见我写的另一个文档:
 
该地址对应的正是一条跳转指令:b        vector_und + stubs_offset。该指令会跳转到相应的异常处理函数去执行,函数执行结束后会调用ret_to_usr函数,从SVC模式返回到USR模式,在这个函数中最后一条指令是:MOVS PC,LR。该指令将当前状态的LR寄存器赋值给PC,并且将当前模式寄存器SPSR拷贝到CPSR中(指令中MOV后的S位)
 
(5)LR保存的就是上面指令B的地址,至此未定义指令异常处理完毕。
 
对于其他几个异常,如中断、快速中断、数据中止等异常,除了返回地址、PC值等不同外,处理流程大致相同。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读