ARM Cortex-A7 MPCore架构基础知识
1、前言
ARM Cortex-A7 MPCore架构非常庞大和复杂,本文仅仅是记录一些ARM架构相关的基础知识,以便于后续的ARM汇编学习,对于更多ARM架构的相关知识,可以去ARM官网下载相关的文档进行研究。
2、ARM Cortex-A7 MPCore简介
ARM Cortex-A7 MPcore属于ARM v7-A架构,处理器支持1~4个核心,通常是和ARM Cortex-A15组成big.LITTLE架构的,ARM Cortex-A15作为大核心,主要负责高性能运算,ARM Cortex-A7则主要负责普通应用,并且能够更省电,ARM官网中对ARM Cortex-A7的简介如下:
在28nm工艺下,Cortex-A7的运行频率在1.2~1.6GHz,并且单核面积不大于0.45平方毫米(含有浮点单元、NEON和32KB的L1缓存),在典型的应用场景下功耗低于100mW,使得它非常适合对功耗要求更严格的移动设备。
ARM Cortex-A7 MPcore支持在一个处理器上选配1~4个核心,多核的配置架构图如下:
ARM Cortex-A7 MPCore的L1 Cache可以选择8KB、16KB、32KB、64KB,L2 Cache可以选择不配,也可以选择配置128KB、256KB、512KB、1024KB,例如,对于NXP研发的I.MX6UL这款SoC就是基于ARM Cortex-A7 MPCore架构的,它配置了32KB的L1指令Cache和32KB的L1数据Cache,还选择配置了128KB的L2 Cache,该SoC的架构如下:
ARM Cortex-A7 MPCore使用的是ARMv7-A架构,该架构的主要特性如下:
- SIMDv2拓展整形和浮点型向量操作;
- 提供了与ARM VFPv4体系架构兼容的高性能单双精度浮点指令,支持全功能的IEEE754;
- 支持大物理拓展(LPAE),最高可以访问40bit存储地址,最高支持1TB的内存;
- 支持硬件虚拟化;
- 支持Generic Interrupt Controller(GIC)V2.0;
- 支持NEON,可以加速多媒体和信号处理算法。
3、ARM Cortex-A处理器运行模式
ARM的体系结构是一种模式体系架构,在引入Security Extensions之前,有7种处理器运行模式,有6个处于特权模式,1个处于非特权模式,特权模式可以访问系统的所有资源,而非特权模式对某些资源的访问会有所限制。
下图是ARMv6架构之前的处理器运行模式,也就是没有引入Security Extensions时的处理器运行模式:
在新的ARMv7架构中,加入了Trust Zone安全拓展,因此新加入了一种运行模式:Monitor模式,此外,新的处理器架构还能支持虚拟化拓展,加入了另外一种运行模式:Hyp模式,因此ARM Cortex-A7架构中具有9种运行模式,下图是ARMv7处理器运行模式图,特权等级分为了三个等级PL0、PL1和PL2:
大多数程序都运行在User运行模式,但是该模式下是不能访问所有系统资源的,有的资源访问将会受限,如果想访问这些受限的资源,就需要进行模式切换,可以通过软件进行切换,也可以通过中断或者异常进行切换。
4、ARM Cortex-A寄存器组
接下来,介绍一下ARM Cortex-A架构的寄存器,ARMv7-A架构提供了16个32bit的通用寄存器(R0~R15)供软件使用,其中前15个寄存器(R0~R14)能用来作为通用的数据存储寄存器,R15寄存器是程序计数器PC,用来保存将要执行的指令,此外,ARM架构还提供了一个当前程序状态寄存器CPSR和一个备份程序状态寄存器SPSR,其中SPSR寄存器是用来备份CPSR寄存器的,寄存器组如下所示:
在上面已经讲述过了,ARMv7-A架构具有9种运行模式,每种运行模式都会有与之对应的寄存器组,每种运行模式可见的寄存器包括15个通用寄存器(R0~R14)、1个程序状态寄存器CPSR和1个程序计数器PC,在这些寄存器中,有些是所有模式共用同一个物理寄存器,有一些则是各模式下所独立拥有的,不同模式下的寄存器组如下所示:
上表中,浅色字体代表的寄存器是与User模式所共有的寄存器,蓝色背景代表的寄存器是各个运行模式所独自拥有的寄存器,可以看到,低寄存器组(R0~R7)是所有模式都共享同一组物理寄存器,只有在一些高寄存器组中,不同的模式下拥有自己独有的寄存器,例如,在FIQ模式下,R8~R14是独立的物理寄存器,当某个程序在FIQ模式下访问R8寄存器的话,那么它实际访问的是寄存器R8_fiq。
接下来,继续分析ARM架构中的通用寄存器和程序状态寄存器:
(1)通用寄存器
R0~R15就是通用寄存器,对于通用寄存器一般可以分为下面3类:
- 未备份寄存器,R0~R7
- 备份寄存器,R8~R14
- 程序计数器PC,R15
对于第1类未备份寄存器:
该类指的是R0~R7这8个寄存器,在所有的处理器模式下这8个寄存器都是共用的,对应着同一个物理寄存器,在不同的模式下,这8个寄存器的数据就会受到破坏,因此,这8个寄存器并没有被用作特殊作用。
对于第2类备份寄存器:
该类寄存器中的R8~R12这5个寄存器具有两种物理寄存器,在FIQ模式下对应着Rx_irq(x=8~12),其它模式下对应着Rx(x=8~12)物理寄存器,FIQ模式是快速中断模式,在该模式下要求中断需要快速执行,FIQ模式下中断处理程序可以使用R8~R12寄存器,在该模式下的R8~R12是独立的物理寄存器,因此在执行中断处理程序时可以不用执行保存和恢复中断现场的指令,从而加快中断程序的执行过程。
备份寄存器R13一共有8个物理寄存器,其中一个是User模式和Sys模式共用,剩下的7个寄存器分别对应着不同的处理器模式,R13寄存器也叫堆栈指针(SP),基本上每种模式都有一个R13物理寄存器,程序会初始化R13,让其指向模式下专用的栈地址。
备份寄存器R14一共有7个物理寄存器,其中一个是User模式、Sys模式和Hyp模式所共用,剩下的6个基础对应着不同的运行模式,R14也叫做链接寄存器(LR),对于ARM架构,该寄存器主要有以下用途:
1)不同处理器模式下使用R14(LR)来存放当前子程序的返回地址,如果使用BL或BLX指令来调用子函数,则R14(LR)被设置成该子函数的返回地址,在子函数中,将R14中的值赋给R15(PC),就可以完成子函数的返回,例如,可以在子程序中使用下面代码返回:
MOV PC,LR @将LR的值赋给PC,实现跳转 or PUSH {LR} @在子函数的入口将LR入栈 ... POP {PC} @在子函数的最后将LR出栈到PC
2)当异常发生后,该异常模式对应的R14设置成异常模式需要返回的地址;
3)R14用作普通寄存器。
对于第3类寄存器,程序计数器R15:
程序计数器R15也叫作PC,由于ARM处理器的3级流水线:取指->译码->执行,对于32bit的ARM架构处理器,每条指令是4个字节,R15(PC)的值如下:
R15(PC) = 当前程序执行的位置 + 8个字节
(2)程序状态寄存器
对于ARM v7-A架构的处理器的所有运行模式都共用一个程序状态寄存器(CPSR),该寄存器在任何模式都能够被访问,CPSR寄存器包含了条件标志位、中断禁止位、当前处理器运行模式标志位等,由于所有的运行模式都共用一个CPSR寄存器,因此必然会导致冲突,所以,除了Usr和Sys模式,其它的7个运行模式都对应了一个专用的物理寄存器,叫做备份程序状态寄存器(SPSR),例如,当特定的异常中断产生时,SPSR用来保存当前程序状态寄存器(CPSR)的值,当异常中断退出以后,使用SPSR中保存的值来恢复CPSR寄存器。
SPSR寄存器的结构和CPSR寄存器的结构一样,CPSR寄存器结构如下:
该寄存器结构中的位含义如下:
N(bit31):当两个使用补码表示的有符号整数运算时,N=1表示运行的结果为负数,N=0表示结果为正数;
Z(bit30):Z=1表示运算结果为0,Z=0表示运算结果不为0,对于CMP指令,Z=1表示进行比较的两个数大小相等;
C(bit29):在加法指令中,C=1表示结果产生了进位,表示无符号数运算发生上溢,其它情况下C=0,在减法指令中,C=0表示运算中发生借位,表示无符号运算发生下溢,其它情况下C=1,对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出的位的数值;
V(bit28):对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号数时,V=1表示符号位溢出;
Q(bit27):仅ARM v5TE_J架构支持,Q=1表示累积饱和,Q=0表示累积不饱和;
IT[1:0](bit26:25):和IT[7:2](bit15:10)一起组成IT[7:0],表示IF-THEN指令的执行状态;
J(bit24):仅ARM v5TE_J架构支持,j=1表示处于Jazelle状态,通常和T(bit5)一起表示当前所使用的指令集,含义如下:
J | T | 含义 |
0 | 0 | ARM |
0 | 1 | Thumb |
1 | 1 | ThumbEE |
1 | 0 | Jazelle |
GE[3:0](bit19:16):SIMD指令有效,大于或等于;
IT[7:2](bit15:10):和IT[1:0](bit26:25)一起组成IT[7:0],表示IF-THEN指令的执行状态;
E(bit9):大小端控制位,E=1表示大端模式,E=0表示小端模式;
A(bit8):禁止异步中断位,A=1表示禁止异步中断;
I(bit7):禁止IRQ中断位,I=1表示禁止IRQ,I=0表示使能IRQ;
F(bit6):禁止FIQ中断位,F=1表示禁止FIQ,I=0表示使能FIQ;
T(bit5):控制指令执行状态;
M(bit4:0):处理器运行模式控制位,含义如下:
M[4:0] | 处理器运行模式 |
10000 | User模式 |
10001 | FIQ模式 |
10010 | IRQ模式 |
10011 | SVC模式 |
10110 | MON模式 |
10111 | ABT模式 |
11010 | HYP模式 |
11011 | UND模式 |
11111 | SYS模式 |
5、小结
本文主要记录了一些ARM v7-A架构的相关基础知识,并对了ARM架构的寄存器组作简单介绍。