原书链接: https://www.scss.tcd.ie/~waldroj/3d1/arm_arm.pdf

本文原文: “A1.1 About the ARM architecture”

A1.1 关于ARM 架构

ARM 架构已经可以支持高低各种性能的实现. 超过20亿设备装备了ARM,确立了其在市场上统治意义的地位. ARM 处理器的简单架构可以实现各种小功能同时电量消耗低. 在 ARM 架构的发展中,实现难度,性能,电量消耗低都是不可或缺的关键因素.

ARM 是精简指令集,典型特征如下:

  • 统一样式的寄存器文件
  • load/store 架构,数据处理指令只能处理寄存器中的内容,不能直接处理内存中的内容
  • 简单的寻址模式,load/store的地址只由寄存器内容和指令字段决定
  • 统一固定长度的指令字段,可简化指令解析

除此之外,ARM架构还提供:

  • 大多数数据处理指令都可以控制ALU和移位器,这样可以最大化利用ALU和移位器
  • 自增自减寻址模式,优化循环
  • load/store多条指令合一,增加数据吞吐量
  • 所有指令的条件执行,增加执行吞吐量

这些对于RISC的增强功能使得ARM处理器在高性能,代码少,低消耗和芯片面积小之间达到了良好的平衡.

A1.1.1 ARM 寄存器

ARM有31个32位通用寄存器,任何时候其中16个都是可见的,其他寄存器是用来加速异常处理的.
非特权代码使用着这16个寄存器,也就是处于用户模式的代码.
用户模式的特点如下:

  • 用户模式只能产生异常切换到另一个进程中.在编程层面由SWI指令实现这一功能.
  • 相对于特权模式,用户模式能访问到的内存和协处理器功能是有限的.

在这16个寄存器当中,有三个是特殊寄存器:
Stack pointer: R13是栈顶指针(SP). 在T变种指令集中R13被PUSH和POP使用,从ARMv6之后被SRS和RFE指令使用.

Link register: R14是链接寄存器(LR),在执行BL和BLX指令时,存放下一条指令的地址(即子程序的返回地址). 在异常模式的入口处页作为返回地址使用. 其余情况作为通用寄存器使用.

Program counter: R15是程序计数器(PC). 指向当前正在执行指令的下一条的下一条指令的地址. 在ARM中,所有的指令都是4字节长(一个32位字),并且以一个字长对齐. 这就意味着PC的后两位总是0,也就是只有30位是有用的. 有些架构版本给剩余的两位赋予了含义. T变种和J变种的Jazelle状态支持Thumb指令集,此时PC大小为16位,以1字节对齐.

其余的13个寄存器没有特殊的硬件指定的用途,只会被软件指定使用.

A1.1.2 异常

ARM支持7种类型的异常,每种异常都可进入特权处理模式.
这7种异常是:

  • 重置
  • 试图执行未定义指令
  • 软件中断指令(SWI),可以用来调用操作系统
  • 预取中止,中止读内存指令
  • 数据中止,数据访问权限中止
  • IRQ,正常中断
  • FIQ,快速中断

异常发生时,一些标准寄存器将被异常模式征用. 所有的异常都有R13,R14的替代寄存器,快速中断异常模式还有其他的替代寄存器.

进入异常的handler时,R14存放异常处理的返回地址,用来返回到造成异常的代码.

在整个异常处理过程中,R13是每个handler的独立的stack pointer. 快速中断模式会将R8-R12的值存起来,这样中断处理程序在开始之前就不用存储或者恢复这些寄存器了.

第六特权处理模式-系统模式,可以使用用户模式的寄存器. 此功能用来运行需要内存或协处理器高级权限的任务,并且没有对异常发生的限制.

除了上面这些,reset和SWIs共享同等特权模式.

异常处理过程

异常发生时, ARM 处理器以一种预定义的方式暂停执行, 开始执行内存中某一固定地址处的异常向量代码. 包括reset在内每个异常都有一个异常向量地址. 正常运行的系统和调试事件对应的行为都是定义好的.

操作系统在初始化时为每个异常分配一个handler, 有权限的系统任务运行在系统模式下可以让操作系统内不带状态损失的发生异常.

A1.1.3 状态寄存器

除了通用寄存器的内容之外,所有的处理器状态保存在状态寄存器中. 当前的操作系统状态保存在CPSR寄存器中(Current Program Status Register). 内容如下:

  • 4个条件标记位(负数,0,进位,溢出)
  • 1个sticky(Q)标记位(ARMv5及以上),标记饱和算数指令是否已经达到饱和,或者在累加乘法中指令是否有符号溢出.
  • 4个GE(大于等于)标记位(ARMv6及以上),用来标记一下情况:
    (1) 有符号运算的结果是非负的
    (2) 无符号运算是否产生进位或借位
  • 2个中断标记位,一个是中断的类型(2个是在ARMv5版本及以下).
  • 1个不确切中断标记位(ARMv6之后)
  • 5个当前处理器所在模式标记位
  • 2个指令集标记位,标记当前执行的是指令集是ARM,Thumb还是Jazelle
  • 1个load/store操作的字节顺序标记位

每个异常模式有一个SPSR寄存器(Saved Program Status Register),进入异常前保存任务的CPSR值.这两个寄存器以特殊的指令存取.

Table A1-1 Status register summary

Field Description Architecture
N Z C V Condition code flags All
J Jazelle state flag 5TEJ and above
GE[3:0] SIMD condition flags 6
E Endian Load/Store 6
A Imprecise Abort Mask 6
I IRQ Interrupt Mask All
F FIQ Interrupt Mask All
T Thumb state flag 4T and above
Mode[4:0] Processor mode All