热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

ARM各种异常返回地址的计算

首先,给出ARM的三级流水线结构图,这是后面分析的基础。上图中最左侧为指令的地址,根据三级流水线结构,当PC0X3008是时,正在执行的的指令是地址为0X3000的这条指令。在分别讲解各种异常之前,

首先,给出ARM的三级流水线结构图,这是后面分析的基础。

这里写图片描述

上图中最左侧为指令的地址,根据三级流水线结构,当PC=0X3008是时,正在执行的的指令是地址为0X3000的这条指令。

在分别讲解各种异常之前,有一条总的原则就是:无论发生什么异常(除复位),内核总是会首先将 PC-4 放到LR寄存器中。

1. 复位异常

复位异常中断处理程序不需要返回。在复位异常中断处理程序开始整个用户程序的执行,因而它不需要返回。

2. 未定义指令异常

指遇到了一条没有定义的指令导致执行时无法执行。

未定义指令异常中断是由当前执行的指令自身产生的,当产生中断时,程序计数器PC的值还未更新(未更新的意思就是PC还没有加4 呢);

以上面的流水线结构为例,地址为0X3000的指令(即第一条指令)执行时产生未定义异常,这时PC = 0X3008,内核将会把PC-4即0X3004放到LR_UND寄存器中。中断执行结束之后,我们实际上要执行的就是0X3004这条指令,所以直接用MOV PC,LR

3. 软件中断异常

由指令SWI引起的,程序在执行这一指令后,进入异常中断。

同样,未定义指令异常中断是由当前执行的指令自身产生的,当产生中断时,程序计数器PC的值还未更新;

具体实例与未定义指令异常相同,不再赘述。

4. 预取指异常

预取指异常与下面的数据访问异常是比较难以区分的。
由程序存储器引起的中止异常叫做预取指中止异常;
由数据存储器引起的中止异常叫做数据中止异常。

虽然预取指异常在取指阶段就会被标记出来,但是一定要到执行该指令的时候才会出现异常,因为这条指令可能根本就没有机会运行。当然数据中止异常也是要到指令执行阶段才出现的。

这两者之间还有一点共同点就是,当出现异常后,要重新再执行一次这条指令,这也是与其他异常不太一样的地方。

这两者之间的重要区别就在于:预取指异常是由于指令自身引起的,所以当产生中断时,程序计数器PC的值还未更新;但是数据中止异常的产生是由ALU产生的,当产生中断时,PC的值已经更新了(比如说0X3000产生数据异常,中断产生时,PC=0X000C了已经)!!

言归正传,举例说明。地址为0X3000的指令执行时产生预取指异常,这时PC = 0X3008,内核将会把PC-4即0X3004放到LR_ABT寄存器中。中断执行结束之后,我们实际上要执行的就是0X3000这条指令,所以用 SUBS PC,LR,#4

5. 数据中止异常

数据中止异常就是在执行指令时数据出现错误。

再次强调,数据访问异常中断由当前执行的指令在ALU里执行时产生,当数据访问异常中断发生时,程序计数器pc的值已经更新。

举例。地址为0X3000的指令执行时产生数据中止异常,这时PC = 0X300C,内核将会把PC-4即0X3008放到LR_ABT寄存器中。中断执行结束之后,我们实际上要执行的就是0X3000这条指令,所以用 SUBS PC,LR,#8

6. 中断请求(IRQ)异常

在此不解释何为中断请求异常。
注意,产生中断请求异常时,程序计数器pc的值也已经更新!

举例。地址为0X3000的指令执行时产生数据中止异常,这时PC = 0X300C,内核将会把PC-4即0X3008放到LR_IRQ寄存器中。中断执行结束之后,我们实际上要执行的就是0X3004这条指令,所以用 SUBS PC,LR,#4

7. 快速中断(FIQ)请求异常

与IRQ异常基本相同,不再赘述。

总结:

这里写图片描述


推荐阅读
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 华为鸿蒙系统官网2.0报名方法及适用设备
    本文介绍了华为鸿蒙系统官网2.0报名的适用设备、报名方法以及三种方式,包括在应用商店下载开发者联盟app、在官网中进行报名、在微信公众号中申请体验HarmonyOS 2.0 手机开发者Beta版本。同时提醒错过测试机会的用户可以等待后续的正式版发布。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 关于两个RTC时钟闹钟,求助?
    在系统启动2秒后,实时时钟(RTC)每3秒钟产生一个闹钟事件(Alarmevent),使系统进入停机模式以降低功耗设置实时时钟。 ... [详细]
  • mysql如何插入一列数据
    mysql插入一列数据的方法:首先打开终端;然后给表添加一列,代码为【altertableuseraddgendervarchar(2);】,其中列名为gender,类型为var ... [详细]
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 【具体报错信息】ErrorparsingD:\android-sdks\system-images\android-22\android-wear\armeabi-v7a\devi ... [详细]
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
author-avatar
诚实的大丈夫_196
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有