文章已获作者授权转载,版权归原作者所有,如有侵权,与本账号无关,可联系删除。 原文作者:Loooqy
文章目录
1 ARM寄存器组织
1.1 寄存器概念
寄存器是处理器内部的存储器,没有地址
1.2 寄存器作用
一般用于暂时存放参与运算的数据和运算结果;
在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器别的模式下不能使用。
如上图示,一共是40个寄存器。
1.3 寄存器分类
(1)通用寄存器;
(2)专用寄存器:
R15(PC):程序计数器,用于存储当前取址指令的地址
R14(LR):链接寄存器,执行跳转指令(BL/BLX)时,LR会自动保存跳转指令下一条指令的地址,产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址
R13(SP):栈指针:用于存储当前模式下的栈顶地址
CPSR:当前程序状态寄存器、控制当前CPU处于哪种状态
(3)控制寄存器。
2 ARM异常处理
2.1 异常的概念
处理器正常执行程序的过程中可能会遇到一些不正常的事情(例如中断),这是处理器会暂停当前的程序转而处理这个异常事件,等处理结束后再返回被异常打断的点继续执行原本的程序。
2.2 异常处理机制
不同处理器上应对异常的流程大体相同,但是再具体实现上可能会有所区别,例如处理器遇到哪些事情会被认定为异常事件、遇到异常事件后处理器有哪些动作、处理器将如何转到异常处理程序等这些细节被成为处理器的异常处理机制
2.2.1 arm异常源
导致异常发生的事件成为异常源。
arm异常源 | 示意 |
---|---|
FIQ | 快速中断请求,比IRQ优先级高 |
IRQ | 外部中断请求 |
Reset | 复位 |
Software Interrupt | 执行swi指令 |
Data Abort | 数据终止 |
Prefetch Abort | 指令预取终止 |
Undefined Instruction | 遇到不能处理的指令 |
2.2.2 异常模式
ARM的基本工作模式中有五种工作模式,在arm工作中会经常遇到模式之间的切换。
注意:区分异常源和异常模式。
3 ARM异常响应
高优先级中断可以打断低优先级中断,同等优先级中断和比自己更低优先级的中断不能打断正在进行的中断;
ARM产生异常后的动作 (自动完成)
拷贝CPSR寄存器中的内容到对应异常模式下的SPSR寄存器中
修改CPSR寄存器的值:修改中断禁止位禁止相应的中断,修改模式位进入相应的异常模式,修改状态位进入ARM状态 (处理异常必须切换成ARM模式)
保存放回地址到对应异常模式下的LR(R14_*)寄存器中
设置PC(R15)寄存器为相应的异常向量
当前指令执行完才会处理异常,比如假如正在执行一条指令,这时突然来了异常,不管这条指令是刚刚执行还是已经将要结束,都要先执行完才会处理异常
3.1 异常向量表
因为异常向量表空间有限不会在这里写异常处理程序,而是在对应的位置写一条跳转指令使其跳转到指定的异常处理程序的入口,这个异常处理程序的入口是固定的,其实也就是异常处理的回调函数。
遇到异常后处理器自动将PC(R15)寄存器修改为对应的地址,表中为每个异常源分配了四个字节的存储空间;异常向量表的本质是内存中的一段代码(32字节)。
3.2 异常优先级
多个异常同时产生时的顺序:
Reset(优先级最高)>Data Abort>FIQ>IRQ>Prefetch Abort>Software Interrupt>Undefined instruction。
FIQ模式有5个私有寄存器(R8-R12),进入IRQ异常后,首先就是要保护现场,也就是将原本寄存器中的数据存储起来,因为IRQ模式和User模式下,很多寄存器是公用的,如果直接操作会把之前的覆盖掉。
为什么只有r8到r12是FIQ特有的?如果将所有的寄存器都变为自己特有的,不是更快吗?
考虑到不同模式之间要交互数据,比如USER要和FIQ模式交互数据,肯定是放到共有的寄存器比较方便。
3.3 ARM微架构
硬件只有一套,但是多条流水线同时进行,如果只有一条流水线,取址后就被闲置了,所以要多流水线进行,不断进行取址。
多核处理器:
原文链接:https://blog.csdn.net/szq0909/article/details/136645453