ARM的7种工作模式
包括用户模式和特权模式二大类,其中特权模式又分为系统模式和异常模式。CPU每次只能运行在一种工作模式下,各种模式之间的切换可以是程序员通过代码主动切换(通过程序状态寄存器CPSR)也可以是CPU自己在某种情况下自动切换。在每种模式下最多只能看到18个寄存器,其他的寄存器虽然名字相同但是在当前模式下都不可见。由于操作系统有安全级别的需要,因此CPU设计多种模式是为了满足操作系统的多种角色安全等级的需要。

用户模式(USR): 非特权模式,ARM处理器正常执行状态都在这种模式。
系统模式(SYS):运行具有特权操作系统任务。
快速中断模式(FIQ):Fast Interrupt Request,用于高速数据传输或通道处理。
外部中断模式(IRQ):当普通中断发生时会进入。
管理模式(SVC):操作系统使用的保护模式。
数据访问中止模式(ABT): 当数据或指令预取终止时进入,可用于虚拟存储和存储管理。
未定义指令终止模式(UND): 当CPU执行未定义指令时会进入。

注意:FIQ在中断向量表中的相对地址一般为0x1C,即在该地址后没有任何中断向量表了,因此FIQ的中断处理程序可以完全放在这里;而IRQ的在中断向量表中的相对地址为0x18,即在FIQ的前面,因此只有四个字节,只能放一条跳转指令,当该中断发生时还要从此处跳到真正的IRQ处理程序的地方执行,这也是导致IRQ比FIQ慢的原因之一。

32位的RAM共有37个寄存器
31个是通用型的,包括未分组寄存器( R0 - R7),分组寄存器(R8 - R14)和PC指针。
ARM的7种运行模式和37个寄存器-LMLPHP

**不分组寄存器:**在所有的运行模式下都使用同一个物理寄存器,它们未被系统用作特殊的用途。
分组寄存器:

  1. 对于R8—R12当使用FIQ(快速中断模式)时访问寄存器R8_fiq — R12_fiq,当使用除FIQ模式以外的其他模式时,访问寄存器
    R8 -R12
  2. 对于R13,R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式与系统模式共用(图中的R13,R14),另外5个物理寄存器对应其他5种不同的运行模式,并采用以下记号来区分不同的物理寄存器分别为fiq,irq,svc,abt,und.
    2.1) R13在ARM指令中常用作栈指针SP
    特别注意:由于每一种模式都有自己的R13,所以我们在自己初始化的时候一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。
    2.2) R14称为子程序链接寄存器LR(Link Register)
    有两个特殊功能,一种是每一种模式下都可以用于保存函数的返回地址,另外就是异常处理后的返回地址,如中断。
  3. PC指针(R15)
    R15用作程序计数器(PC)对应一个物理寄存器,由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节程序状态寄存器。

6个是状态寄存器 1个CPSR和5个SPSR
CPSR为程序状态寄存器,从官方文档种可以提取到如下图,它的各个位都表明了CPU的某些状态信息。
ARM的7种运行模式和37个寄存器-LMLPHP
下面介绍其中几个比较重要的位
ARM的7种运行模式和37个寄存器-LMLPHP
N: 当两个表示的有符号整数运算时,1表示运算结果为负数,0表示结果为正或零。
Z:1表示运算的结果为零,0表示运算的结果不为零。对于CMP指令,1表示进行比较的两个数大小相等。
C:下面分四种情况讨论C的设置方法:
a) 加法运算(包括比较指令CMN):当运算产生了进位时(无符号数溢出),C=1,否则C=0。
b) 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
c) 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
d) 对于其他的非加/减运算指令,C的值通常不改变。
V:下面分两种情况讨论V的设置方法
a) 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
b) 对于其他的非加/减运算指令,C的值通常不改变。
I:1 表示禁止外部(硬件)中断(IRQ)
F:1 表示禁止快速中断(FIQ)
T:1表示为Thumb状态,0为ARM状态(Thumb态和ARM态是ARM的二种运行状态)
M[4:0]:用来设置处理器的工作模式具体数据见本文开始的介绍。

SPSR是 除USR和SYS模式外,对应用于异常保护的CPSR的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行。

12-05 19:18