corter-a7一共有9种工作模式,分别如下:
1.用户模式(usr):Linux系统应用层程序都在该模式下执行,是非特权模式,不能进行处理器的模式切换。
2.快速中断模式(fiq):高优先级的中断模式,该模式下能快速地响应事件,有一些专业的寄存器,不需要备份,从而能快速地相应。
3.外部中断模式(irq):一个低优先级的中断模式,也是一个标准模式,Linux内核终中断通常都是使用该模式进行中断处理。
4.特权模式(svc):在系统复位或者是软中断触发会进入该模式,由该模式进行处理器模式的切换。
5.数据访问中止模式(abt):当发送存取异常的时候会进入该模式。
6.未定义指令中止模式(und):当CPU执行到一条不能识别的指令时会进入该模式,例如再ARM的板子上执行x86结构的程序就会进入该模式。
7.系统模式(sys):linux内核就运行在该模式下,系统模式和用户模式共用一套寄存器。
8.监控模式(mon):主要就是用来做安全和非安全模式之间的切换的。
9.虚拟化监控模式(hpy):用于扩展虚拟机的的。
在corter-a7种每个寄存器都是32位的;
寄存器没有地址,在C语言种不能进行取址操作,程序中要访问寄存器需要通过R0-R15的标号进行访问;
在Corter-A7中寄存器组分为私有寄存器和共有寄存器,私有寄存器就是每个模式私有的寄存器,在该模式下修改私有寄存器的值不影响其他模式,而共有寄存器是各个模式之间共用的,我们在使用之前需要先保存现场即保存每个寄存器的值,当我们回到原有模式时再回府现场;
user和sys模式下可以访问17个寄存器,在HYP模式下可以访问19个,其余模式访问18个,整个CPU内部一共有43个寄存器,一共172字节,因此尽量不要使用register类型修饰变量。
在任何模式下都能操作R0-R15的寄存器和CPSR寄存器,在除了user和sys模式下其余模式还可以访问SPSR寄存器。
对应R13来说,每个寄存器对应了8个不同的物理寄存器,这里的话我们的user模式和sys模式共用一个栈指针寄存器,其余模式在每个模式下都有一个独立的栈指针。而我们每个模式下的栈指针都需要进入对应的模式中来设置它的栈指针。也就是比如在IRQ模式下设置的栈指针不会影响FIQ的栈。
栈的作用是用来作异常发生时做保护现场的,即吧共用寄存器的值保存在栈里,然后在相应的模式下就可以修改这些寄存器了,等到异常返回时我们再将栈里的数据恢复出来即可恢复现场。
连接寄存器R14一共有七个物理寄存器,这七个物理寄存器中usr,sys,hyp这三个模式共用一个物理寄存器。其余6个物理寄存器访问别是svc、abt、und、irq、flq、mon这6种模式,每个模式各占一个物理寄存器。
R14寄存器又称为连接寄存器(LR),R14也可以作为通用寄存器,只是我们习惯吧R14作为连接寄存器用。再ARM体系结构中连接寄存器有两种特殊的用途:
用途1:用于存放当前模式下的子程序的返回地址,即再调用子程序时将R14设置成该子程序的返回地址,等子程序执行完成后再将R14寄存器存放的返回地址赋值给PC指针。
用途2:R14寄存器在异常发生时会保存当前模式下的异常返回地址,等到异常处理程序执行完成后再将R14寄存器中的返回地址赋值给PC指针从而实现异常返回。
R15寄存器又称为PC程序寄存器。PC程序寄存器储存的是当前取指指令,每次程序执行完一条指令之后PC寄存器自动+4来跳转到下一条要执行的指令位置上。我们可以通过改变PC寄存器中存放的数据来改变程序执行顺序。
SPSR寄存器
在每种处理器模式下都有一个专用的SPSR物理寄存器,该寄存器主要就是在异常发生时可以将CPSR的值保存在SPSR中,等到异常处理程序执行完成返回时,再将SPSR中的值恢复到CPSR中,从而实现CPSR的现场保护与恢复。
ARM存储系统通常是由多级构成,分为内核级、芯片级、板卡级、外设级。
内核级他的速度是最快的,通常是指我们核心内部的寄存器组,这些寄存器里核心最近,所以速度最快,但是容量相对最低;
芯片级的速度仅次于内核级的,通常在一般的高性能处理器中 都会存在一些Cache,此外还有些高级处理器中还会有TCM(TCM就是为了弥补Cache访问的不确定性通常用作快速寄存器)
板卡级的速度和芯片级相比也会稍慢一些,但是板卡级的存储会有很大提升,通常从几MB到几GB都有,板卡级的存储空间就是为了弥补内核级和芯片级存储容量不够的问题。
外设级则是主要用于做数据存储的,其容量基本上都是几百GB到几TB的空间,主要用来存放用户的各种数据。
STM32P1A有两级cache分别为L1和L2;L1又称为一级缓存,在这级cache中又分为1个32KB的数据cache和1个32KB的指令cache;L2又称为二级缓存其容量为256KB;
此外Cortex-A7所使用的架构是哈佛架构,即内存中数据和指令是分开存储的。
MMU的主要作用有两个:
第一是用来做虚拟地址和物理地址映射;
第二是用来做内存单元的控制权限,可以对内存增加读写权限,从而保证重要程序的安全。
chahe是一个容量小但存取速度非常快的一个存储器,把cache存放的是最近CPU核心最有可能用到的一些数据。例如在程序执行的过程访问次数最多的数据cache会自动把这些数据放入cache中。这部分工作对于编程人员来说往往都是透明的,是一个cache自动决定要保存哪些数据,要覆盖哪些数据。
写缓存器(write buffer)非常小的先进先出的FIFO。写缓存器主要的作用是当CPU要对主存储器进行写操作的的时候,由于主存储器速度较慢会浪费CPU的事件,那么CPU就可以把要写入的数据写到写缓存中,等到CPU空闲的时候再将写缓存器中的数据写入主存中,从而提高CPU的效率。
处理器在执行一条指令时通常需要下列几个步骤:
取值:把存储器中的指令取到处理器中
译码:就是把处理器中存放的指令进行识别机器码,通过机器码得到要执行指令
取操作数:将指令中需要使用到的操作数取出,例如下面的add指令就是将r2,r1寄存器的值取出
执行:将译码阶段获得的指令根据指令对操作数进行相应的操作,例如下面的指令就是加法操作
访存:如果有需要进行访问存储器的则进行存储器的访问,此步骤非必须
回写:就是将执行阶段得到的数据写入对应的寄存器中,例如下面的指令就是将r2+r1的值写入r3寄存器
例: add r3, r2, r1
三级流水线就是把一条指令分了三个步骤:
取指:把存储器中的指令取到处理器中
译码:把处理器中存放的指令进行识别出相应的操作
执行:把译码得到的操作进行运算得到结果并回写到寄存器中
PC指针其实是指向当前正在被解码的那条指令。由于流水线的存在一条指令分为取指、译码、执行。那么我们执行阶段=PC-8
三级流水线在处理简单的数据处理访问指令时,流水线平均每个时钟周期完成一级流水线步骤,那么执行一条完整的指令就绪呀三个时钟周期完成。但当需要访问内存时又由于访问内存需要额外时钟周期去完成相应的操作,所以三级流水线在遇到访存指令时会增加有一条指令执行的时间
五级流水线解决的问题:
要实现更高性能的处理器就要提高时钟频率,而提高时钟频率的要求就需要精简每级流水线的复杂度
对于三级流水线中遇到访问指令会引起流水线暂停的现象。
五级流水线分为以下几个步骤:取指、译码、执行、缓存/数据、回写
五级流水线或者更高的流水线,还是遵循三级流水线的PC计算办法,即当前执行阶段指令=PC-8
互锁:即在程序执行的过程中,一条指令的结果要被用到下条指令的操作数时产生
跳转指令:当程序执行到跳转指令时会将跳转前的流水操作丢弃,然后到要跳转的地方继续执行流水操作,此步骤不得不将流水线破坏。