对ARM异常(Exceptions)的理解
1 .对 ARM 异常( Exceptions )的理解
所有的系统引导程序前面中会有一段类似的代码,如下:
.globl _start                    ;系统复位位置
_start: b       reset            ;各个异常向量对应的跳转代码
        ldr     pc, _undefined_instruction ;未定义的指令异常
        ldr     pc, _software_interrupt     ;软件中断异常
        ldr     pc, _prefetch_abort          ;内存操作异常
        ldr     pc, _data_abort               ;数据异常
        ldr     pc, _not_used                  ;未使用
        ldr     pc, _irq                       ;慢速中断异常
        ldr     pc, _fiq                       ;快速中断异常
从中我们可以看出, ARM 支持 7 种异常。问题时发生了异常后 ARM 是如何响应的呢?第一个复位异常很好理解,它放在 0x0 的位置,一上电就执行它,而且我们的程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。那么怎么会执行到后面几个异常处理函数呢?
看看书后,明白了 ARM 对异常的响应过程,于是就能够回答以前的这个疑问。
当一个异常出现以后, ARM 会自动执行以下几个步骤:
( 1 )把下一条指令的地址放到连接寄存器 LR( 通常是 R14) ,这样就能够在处理异常返回时从正确的位置继续执行。
( 2 )将相应的 CPSR( 当前程序状态寄存器 ) 复制到 SPSR (备份的程序状态寄存器)中。从异常退出的时候,就可以由 SPSR 来恢复 CPSR 。
(3) 根据异常类型,强制设置 CPSR 的运行模式位。
( 4 )强制 PC (程序计数器)从相关异常向量地址取出下一条指令执行,从而跳转到相应的异常处理程序中。
至于这些异常类型各代表什么,我也没有深究。因为平常就关心 reset 了,也没有必要弄清楚。
ARM 规定了异常向量的地址:
   b       reset            ; 复位 0x0
ldr pc, _undefined_instruction ;未定义的指令异常 0x4
       ldr     pc, _software_interrupt     ;软件中断异常    0x8
       ldr     pc, _prefetch_abort          ;预取指令    0xc
       ldr     pc, _data_abort               ;数据        0x10
       ldr     pc, _not_used                  ;未使用      0x14
       ldr     pc, _irq                       ;慢速中断异常   0x18
        ldr   pc, _fiq                       ;快速中断异常    0x1c
这样理解这段代码就非常简单了。碰到异常时,PC会被强制设置为对应的异常向量,从而跳转到相应的处理程序,然后再返回到主程序继续执行。
这些引导程序的中断向量,是仅供引导程序自己使用的,一旦引导程序引导Linux内核完毕后,会使用自己的中断向量。
嗬嗬,这又有问题了。比如,ARM发生中断(irq)的时候,总是会跑到0x18上执行啊。那Linux内核又怎么能使用自己的中断向量呢?原因在于Linux内核采用页式存储管理。开通MMU的页面映射以后,CPU所发出的地址就是虚拟地址而不是物理地址 。就Linux内核而言,虚拟地址0x18经过映射以后的物理地址就是0xc000 0018。所以Linux把中断向量放到0xc000 0018就可以了。
另外,说一下MMU。说句实话,还不是很明白这个MMU机理。
  (1 )安全性:规定访问权限
 (2) 提供地址空间:把不连续的空间转换成连续的。
第2点是不是实现页式存储的意思?
2005 年6月9日 晚
补充一下:  05/06/14

.globl _start ;系统复位位置
_start: b reset ;各个异常向量对应的跳转代码
ldr pc, _undefined_instruction ;未定义的指令异常

……

_undefined_instruction :
.word undefined_instruction

也许有人会有疑问,同样是跳转指令,为什么第一句用的是 b reset;
而后面的几个都是用ldr?

为了理解这个问题,我们以未定义的指令异常为例。

当发生了这个异常后,CPU总是跳转到0x4,这个地址是虚拟地址,它映射到哪个物理地址
取决于具体的映射。
ldr pc, _undefined_instruction
相对寻址,跳转到标号_undefined_instruction,然而真正的跳转地址其实是_undefined_instruction的内容——undefined_instruction。那句.word的相当于:
_undefined_instruction dw undefined_instruction (详见毕设笔记3)。
这个地址undefined_instruction到底有多远就难说了,也许和标号_undefined_instruction在同一个页面,也许在 很远的地方。不过除了reset,其他的异常是MMU开始工作之后才可能发生的,因此undefined_instruction 的地址也经过了MMU的映射。
在刚加电的时候,CPU从0x0开始执行,MMU还没有开始工作,此时的虚拟地址和物理地址相同;另一方面,重启在MMU开始工作后也有可能发生,如果reset也用ldr就有问题了,因为这时候虚拟地址和物理地址完全不同。

因此,之所以reset用b,就是因为reset在MMU建立前后都有可能发生,而其他的异常只有在MMU建立之后才会发生。用b reset,reset子程序与reset向量在同一页面,这样就不会有问题(b是相对跳转的)。如果二者相距太远,那么编译器会报错的。

对ARM异常(Exceptions)的理解相关推荐

  1. ARM CORTEX-M3 内核架构理解归纳

    ARM CORTEX-M3 内核架构理解归纳 来源:网络 个人觉得对CM3架构归纳的非常不错,因此转载 基于<ARM-CORTEX M3 权威指南>做学习总结: 在我看来,Cotex-M3 ...

  2. 函数指针数组在ARM异常中断处理中的应用

    介绍一种简洁.高效.灵活的ARM异常中断处理方法.       在ARM中,由于所有的中断都使用同一个异常中断入口地址,即0x00000018.因此需要在异常中断处理程序中根据相应的中断号调用对应的中 ...

  3. 【ARM】arm异常中断处理知识点

    ARM处理器7种类型异常 按优先级从高到低的排列如下: 复位异常(Reset) 数据异常(Date Abort) 快速中断异常(FIQ) 外部中断异常(IRQ) 预取异常(Prefetch Abort ...

  4. 嵌入式:ARM异常中断指令SWI、BKPT、CLZ详解

    文章目录 SWI 二进制编码 汇编格式 断点指令(BKPT-仅用于v5T体系) 二进制编码 汇编格式 前导0计数 二进制编码 汇编格式 异常中断指令可以分为一下两种: 软件中断指令(SWI) 断点指令 ...

  5. 【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

    一. 异常向量表 1. 异常相关概念 (1) 异常 (2) 异常类型简介 2. 异常处理 (1) 异常处理 二. 异常向量表代码编写 1. 初始化异常向量表模块代码 2. 链接器脚本 3. Makef ...

  6. [ARM异常]-异常进入和异常退出时的arm core的硬件自动的行为

    引流关键词: IRQ,FIQ,Serror, 中断,同步异常,异步异常,TF-A,TF-M,ATF,TrustedFirmware,trustzone,TEE,optee,trusty,tlk,lk, ...

  7. [ARM异常]-ARMV8-aarch64异常和中断处理概念详细介绍

    ★★★ 个人博客导读首页-点击此处 ★★★ 文章目录 1.异常和中断的概念 2.异常产生的方法: (1).Abort : (2).Reset (3).同步异常 (4).异步异常(中断) 3.同步异常和 ...

  8. [ARM异常]-linux中(aarch/aarch64)异常向量表介绍

    文章目录 1.ARM的异常向量表基地址寄存器--VBAR 1.1.armv8 : VBAR寄存器 1.2.armv7 : VBAR寄存器 2.ARM的异常向量表的定义 2.1 armv8 :异常向量表 ...

  9. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断

    常见的JAVA虚拟机HotSpot虚拟机运行时数据库由5部分构成:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面列举各个部分可能出现的异常及其出现原因. 1.方法区存放的已被虚拟机加载的类型信息, ...

最新文章

  1. 一张贴纸骗过AI识别?对抗性机器学习是什么东西?
  2. monodroid发布的最新版本
  3. java中怎么固定间距_java中的GridBagLayout是怎么调组件间距的...
  4. 九十五、二叉树的递归和非递归的遍历算法模板
  5. CentOS 7 安装方式汇总
  6. apache 错误日志 File does not exist: 解决办法
  7. java汉字转化accic_Java自主学习贴
  8. 1.需要对txt存放的测试数据做去重处理,代码如下
  9. 电子商务网站 数据库产品表设计方案
  10. [转] ASP.NET中使用javascript
  11. mybatis 遍历数组_Mybatis中别名、插件与数据源配置
  12. 由Unity發佈到Google Play (Android Market)的步驟
  13. 解决Vue的history模式刷新页面出现404的问题
  14. 计算机打印机节支措施,“节支降耗,从我做起 ”倡导篇 ——节约纸张
  15. 进阶之路:深入解读 Java 堆外内存 | 凌云时刻
  16. 如何运行网上下载的matlab代码?怎样找到matlab主程序?
  17. python小游戏之超级玛丽进阶版(1~4关)。好玩到爆炸~【内附github源码,及其详细备注】
  18. microbit积木块菜单图标
  19. 低代码里程碑版—JeecgBoot 3.4.3 版本发布,低代码功能专项升级
  20. 游戏开发人员推荐书单

热门文章

  1. DEDECMS后台上传banner图控制图片轮播
  2. [Asp.net 5] Options-配置文件(2)
  3. [PHP]php基础练习题学习随笔
  4. 消除 activity 启动时白屏、黑屏问题
  5. c语言求占用内存sizeof,C语言中sizeof的用法
  6. 广西卫生职业技术学院计算机考试,广西卫生职业技术学院单招2021年春招分数线...
  7. arcgis合并tif影像_微图影像地图导出拼接大图的参数说明
  8. python中列表常用方法_Python中列表的常用方法
  9. java体重指数计算器程序_java 学习 ——计算器小程序
  10. graphpad做折线图坐标轴数字_pandas做数据可视化具体操作,快来看看吧