ARMv7用户层发生指令异常的处理流程?是否每个进程都有一个APSR的副本?
2014-11-14 00:00
381 查看
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会由操作系统保存起来,等到切换回来时再恢复。
用户层程序正在执行时,遇到未定义的指令(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会由操作系统保存起来,等到切换回来时再恢复。
相关文章推荐
- ARMv7用户层发生指令异常的处理流程?是否每个进程都有一个APSR的副本?
- ARM用户层发生异常后软硬件协同处理流程
- ARM用户层发生异常后软硬件协同处理流程
- 多个进程同时等待网络的连接事件,当这个事件发生时,这些进程被同时唤醒,我们知道进程被唤醒,需要进行内核重新调度,这样每个进程同时去响应这一个事件,而最终只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠或其他。
- “System.NotSupportedException”类型的异常在 System.Data.Entity.dll 中发生,但未在用户代码中进行处理 其他信息: 在 LINQ to Entitie
- Win32程序发生异常时处理的流程
- 基本上每个消息都有一个Result,代表是否(正确)处理过了(但是是否继续传递,还得研究)
- 用Java实现的一个密码验证 以及Java异常处理流程和runtime异常以及checked异常之间的区别
- asp.net访问access 发生了未处理的异常 "操作必须使用一个可更新的查询"错误
- “System.BadImageFormatException”类型的未经处理的异常在 Castle.Windsor.dll 中发生 其他信息: 未能加载文件或程序集“Gis”或它的某一个依赖项。
- “System.TypeInitializationException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理
- “System.ArgumentNullException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- SQLserver2000 企业版 出现"进程51发生了严重的异常"错误的处理方法
- “System.IndexOutOfRangeException”类型的异常在 Stores.dll 中发生,但未在用户代码中进行处理
- 0xC0000005:读取某位置发生访问冲突;未处理的异常:用户断点
- “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- “System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理
- 编写一个Cirle类,包括构造方法,求圆的面积和周长,如果圆的半径小于0则抛出异常,让用户必须处理,半径必须大于0才可以
- System.Resources.MissingManifestResourceException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确