ARMv7用户层发生指令异常的处理流程?是否每个进程都有一个APSR的副本?

1、用户层发生指令异常的处理流程?

用户层程序正在执行时,遇到未定义的指令(ARM不是别的指令)或者SWI软件中断指令(产生系统调用),就会产生异常,这里以未定义指令异常为例进行说明:

         一旦出现未定义指令异常,CPU会自动做如下操作:

(1)未定义模式(ARM其中运行模式的一种)下对应的lr(即R14)寄存器保存当前发生异常的指令下一条指令的地址。例如,在用户态有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:

         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的地址,至此未定义指令异常处理完毕。

 

2、是否每个进程都有一个APSR的副本?

不是的,一个模式对应一个APSR,该模式下的所有进程共享一个APSR。原因如下:

(1)APSR是CPSR的一个别名,即它们其实是一个东西,只是对于APSR,应用程序只能访问N(负数或小于)、Z(零)、C(进位或借位或扩展)、V(溢出)、Q(累计饱和位)和GE[3:0](大于等于标志位),应用程序通过这种机制间接访问CPSR,以上这些位在任何模式都能读写。(This is an application-level alias for the  Current Program Status Register ( CPSR),ARMARM 手册B1-1145)

各个进程有自己的状态寄存器(CPSR),但是同一时刻只有一个进程在执行,当进程切换时,与该进程相关的CPSR会由操作系统保存起来,等到切换回来时再恢复。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值