文章目录
Cortex-A架构基础
一、处理器运行模型
模式 | 描述 |
---|---|
User(USR) | 用模式,非特权模式,大部分程序运行的时候就处于此模式。 |
FIQ | 快速中断模式,进入FIQ中断异常。 |
IRQ | 一般中断模式。 |
Supervisor(SVC) | 超级管理员模式,特权模式,供操作系统使用。 |
Monitor(MON) | 用于安全扩展模式。 |
Abort(ABT) | 数据访问终止模式,用于虚拟存储以及存储保护。 |
Hyp(HYP) | 用于虚拟化扩展。 |
Undef(UND) | 未定义指令终止模式。 |
System(SYS) | 系统模式,用于运行特权级的操作系统任务 |
- 除了 User(USR)用户模式以外,其它 8种运行模式都是特权模式。这几个运行模式可以通过软件进行任意切换,也可以通过中断或者异常来进行切换。
- 用户模式通过异常来完成模式切换。
- 没种模式都有一组寄存器,为了保证用户模式下的寄存器不会被破坏。
二、寄存器组
Cortex-A寄存器:
- 每种模式可见的寄存器包括15个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器PC。
九种模式对应的寄存器:
- 淡蓝色背景的为模式独有的寄存器,其余与User模式共有。
- Cortex-A内核寄存器的组成:
① 34个通用寄存器,包括R15程序计数器(PC),这些寄存器都是32位的。
② 8个状态寄存器,包括程序状态寄存器(CPSR)和程序状态保存寄存器(SPSR)。
③ Hyp模式下独有一个ELR_Hyp寄存器。
2.1 通用寄存器
2.1.1 未备份寄存器(R0~R7)
- 在不同的处理器模式下这8个寄存器是共用的,不同模式下数据会被破坏。
2.1.2 备份寄存器(R8~R14)
- 在FIQ模式下对应Rx_irq(x=8-12)物理寄存器,其他模式对应Rx(8-12)物理寄存器。
- R13 User和Sys共用,其余7个模式独有。R13为SP,作为栈指针,应用程序会初始化R13,使其指向专用的栈地址,即初始化SP指针。
- 备份寄存器R14,User、Sys和Hyp共用,其他的6种模式独有。R14为连接寄存器(LR):
a. LR存放当前子程序的返回地址,如果使用BL或者BLX调用子函数,LR被设置成该子函数的返回地址,将R14(LR)中的值赋给R15(PC)即可完成子函数返回。如:
跳转B、带链接跳转BL、跳转并切换指令集BX、带链接跳转并切换指令集BLX 、跳转并转换到 Jazelle 状态 BXJMOV PC, LR @寄存器 LR中的值赋值给 PC,实现跳转 或者可以在子函数的入口出将 LR入栈: PUSH {LR} @将 LR寄存器压栈 在子函数的最后面出栈即可: POP {PC} @将上面压栈的 LR寄存器数据出栈给 PC寄存器 ,严格意义上来讲应该是将 @LR-4赋给 PC,因为 3级流水线,这里只是演示代码。
b. 当异常模式发生以后,该异常模式对应的R14寄存器被设置成该异常模式将要返回的地址,R14也可以当做普通的寄存器使用。
2.1.3 程序计数器PC(R15)
程序计数器R15也叫做PC,R15保存着当前指令地址加8个字节,这是因为ARM的流水线机制导致的。ARM处理器3级流水线取指->译码->执行,这三级流水线循环执行,比如当前正在执行第一条指令的同时也会对第二条指令进行译码,第三条指令也同时被取出存档在R15(PC)中。
32位的ARM处理器,每条指令4字节,因此需要加上2个指令的值:
R15(PC)值 = 当前执行的程序位置 + 8个字节
2.2 程序状态寄存器
- 所有的模式共用一个CPSR物理寄存器。
- CPSR是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。
- 为了防止所有模式共用CPSR冲突,除了User和Sys以外,其余的7个模式都配备了一个专用的备份程序状态寄存器(SPSR),当特定的异常中断发生时,SPSR寄存器用来保存当前程序状态寄存器CPSR的值,当异常退出后用SPSR中的值恢复CPSR。
- 不在User和Sys访问SPSR,SPSR和CPSR寄存器结构相同:
N(bit31): 当两个补码表示的 有符号整数运算的时候,N=1 表示运算对的结果为负数,N=0
表示结果为正数。
Z(bit30): Z=1 表示运算结果为零,Z=0 表示运算结果不为零,对于CMP 指令,Z=1 表示
进行比较的两个数大小相等。
C(bit29): 在加法指令中,当结果产生了进位,则C=1,表示无符号数运算发生上溢,其它
情况下C=0。在减法指令中,当运算中发生借位,则C=0,表示无符号数运算发生下溢,其它
情况下C=1。对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出的位的数值,对
于其它非加/减运算指令,C 位的值通常不受影响。
V(bit28): 对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号
数时,V=1 表示符号位溢出,通常其他位不影响V 位。
Q(bit27): 仅ARM v5TE_J 架构支持,表示饱和状态,Q=1 表示累积饱和,Q=0 表示累积
不饱和。
IT[1:0](bit26:25): 和IT[7:2](bit15:bit10)一起组成IT[7:0],作为IF-THEN 指令执行状态。
J(bit24): 仅ARM_v5TE-J 架构支持,J=1 表示处于Jazelle 状态,此位通常和T(bit5)位一起表示当前所使用的指令集。
GE[3:0](bit19:16): SIMD指令有效,大于或等于。J T 描述 0 0 ARM 0 1 Thumb 1 1 ThumbEE 1 0 Jazelle
IT[7:2](bit15:10): 参考 IT[1:0]。
E(bit9): 大小端控制位, E=1表示大端模式, E=0表示小端模式。
A(bit8): 禁止异步中断位, A=1表示禁止异步中断。
I(bit7): I=1禁止IRQ,I=0使能 IRQ。
F(bit6): F=1禁止FIQ ,F=0使能FIQ。
T(bit5): 控制指令执行状态,表明本指令是 ARM指令还是 Thumb指令,通常和 J(bit24)一起表明指令类型,参考 J(bit24)位。
M[4:0](bit4:0): 处理器模式控制位: