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为什么设计这些模式?
- CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
- 操作系统有安全级别要求,因此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体系结构和异常处理方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门