ARM体系结构和异常处理方式

2021/4/11 10:26:54

本文主要是介绍ARM体系结构和异常处理方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 ARM 有7个基本工作模式:

  •                  User :  非特权模式,大部分任务执行在这种模式 
  •                  FIQ :    当一个高优先级(fast) 中断产生时将会进入这种模式 
  •                  IRQ :    当一个低优先级(normal) 中断产生时将会进入这种模式
  •                  SVC(Supervisor) : 当复位或软中断指令执行时将会进入这种模式
  •                  Abort :  当存取异常时将会进入这种模式
  •                  Undef :  当执行未定义指令时会进入这种模式
  •                  System :  使用和User模式相同寄存器集的特权模式 

  注意

  •                 除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模 式)。 
  •                 Privilege(特权模式)中除Sys模式外,其余5种为异常模式。 
  •                 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是  CPU在某些情况下自动切换。 
  •                 各种模式下权限和可以访问的寄存器不同

CPU为什么设计这些模式?

  1. CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
  2. 操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要

 

ARM中的寄存器

*1.ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,在所有的寄存器中,有些是各模式共用同一个寄存器,有些寄存器是各个模式自己拥有独立的寄存器

2.例如对r14这个名字来说,在ARM 中共有6个名叫r14(又叫SP)的寄存器,但是在每种特定处理器模式下,只有一个r14是当前可见的(也就是说每种模式下有一个专属于这个模式的r14),其他的r14 必须切换到其它的对应模式下才能看到,这种设计叫影子寄存器(banked register)

3.ARM共有37个寄存器,都是32位长度,其中30个为通用的,1个固定用作PC,1个固定用作CPSR,5个固定用作五种异常模式下的SPSR。

arm各个寄存器的作用和功能可以参考这个博客https://blog.csdn.net/XiaoXiaoPengBo/article/details/78693811

ARM各个模式的寄存器如图:

 

 

 PC指针和SP指针

PC:Program Counter,是通用寄存器,但是有特殊用途,用来指向当前运行指令的下一条指令。

SP:Stack Pointer,堆栈指针,也是通用寄存器,用于入栈和出栈操作。

 

对于ARM7而言,是三级流水线结构,一条指令为4个字节大小,一条指令包含三个过程:Fetch(取指)、Decode(译指)、Execute(执行)。

CPU运行地址 = 当前PC值 = 当前程序执行位置 + 8;

对于ARM7而言,PC为R15,SP为R13。

PC不是指向正在执行的指令,而是始终指向下一个取指的指令。对于ARM7三级流水先结构和指令的三个过程,所以PC = 当前程序执行位置  + 8
 


什么是异常?

  • 正常工作之外的流程都叫异常
  • 异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作
  • 中断是异常的一种

异常向量表:

  • 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。
  • 当异常发生时,CPU会自动动作(PC指针跳转到异常向量处处理异常,有时伴随一些辅助动作)。
  • 异常向量表是硬件向软件提供的处理异常的支持。

中断向量:中断的地址的变量;

中断向量表:中断类型号与相应中断源的中断处理程序入口地址之间的连接表;

中断服务程序:中断时所执行的中断代码


 

*中断向量表定义的是什么?

*定义的就是中断服务程序的跳转指令,因为每个中断向量在向量表中只有很少字节的存储空间,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。这里cpu就可以找中断服务程序

当CPU产生了中断 ,CPU会先判断产生了什么类型的中断  然后就会去往 中断向量表的对应中断类型的地址中 查找接下来要进行的中断指令 然后跳转到存储该类型中断服务函数的地址 执行

ARM中断向量表和响应更加深入的内容可以参考这篇博客:https://blog.csdn.net/honour2sword/article/details/40213417

<--这就是ARM的中断向量表图示 左侧为地址(因为ARM是32位所以是4字节对齐)

例如:若发生了普通中断 ,PC指针会去到中断向量表的 IRQ地址处, 然后跳转到 IRQ对应的存储器的某个存放中断服务函数的地址 然后执行中断服务函数


 

 

 

 

 

 

 

 

 

 

 



这篇关于ARM体系结构和异常处理方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程