ARM架构被设计为允许非常小的尺寸,同时保持高性能的实现。ARM处理器的架构简单性导致了非常小的实现,而小的实现允许设备具有非常低的功耗。 ARM是一种精简指令集计算机(RISC),因为它包含了这些典型的RISC架构特征:
- 一个大型统一寄存器文件
- 一种加载/存储架构,其中数据处理操作仅在寄存器内容上进行,而不是直接在内存内容上进行
- 简单的寻址模式,所有加载/存储地址都是由寄存器内容和指令字段决定的
- 统一且固定长度的指令字段,以简化指令解码 此外,ARM架构提供了:
- 在每条数据处理指令中对算术逻辑单元(ALU)和移位器的控制,以最大化ALU和移位器的使用
- 自增和自减寻址模式,以优化程序循环
- 加载和存储多条指令,以最大化数据吞吐量
- 所有指令的条件执行,以最大化执行吞吐量 这些对基本RISC架构的增强,使得ARM处理器能够在高性能、低代码大小、低功耗和低硅片面积之间取得良好的平衡。
1.1.1 ARM寄存器
ARM有31个通用的32位寄存器。在任何时候,这些寄存器中有16个是可见的。其他寄存器用于加速异常处理。ARM指令中的所有寄存器说明符都可以访问这16个可见寄存器中的任何一个。 主要的16个寄存器组由所有未特权代码使用。这些是用户模式寄存器。用户模式与其他模式不同,因为它是未特权的,这意味着:
- 用户模式是唯一一个在不生成异常的情况下不能切换到另一个处理器模式的模式
- 内存系统和协处理器可能会允许用户模式对内存和协处理器功能的访问权限少于特权模式
在16个可见寄存器中,有两个寄存器具有特殊角色:
链接寄存器
寄存器14是链接寄存器(LR)。这个寄存器保存了在分支链接(BL)指令之后的下一个指令的地址,BL指令是用来进行子程序调用的指令。在所有其他时候,R14可以用作通用寄存器。
程序计数器
寄存器15是程序计数器(PC)。它在大多数指令中可以作为指向正在执行的指令之后的两个指令的指针。所有ARM指令都是四个字节长(一个32位字),并且总是对齐在字边界上。这意味着PC的最低两位总是零,因此PC只包含30个非恒定位。 剩下的14个寄存器没有特殊的硬件用途。它们的用途完全由软件定义。 软件通常使用R13作为堆栈指针(SP)。
1.1.2 异常
ARM支持五种类型的异常,每种类型都有相应的特权处理模式。这五种类型的异常是:
- 快速中断
- 普通中断
- 存储器中止,可以用来实现存储器保护或虚拟存储器
- 尝试执行未定义指令
- 软件中断(SWI)指令,可以用来调用操作系统。
当异常发生时,一些标准寄存器会被特定于异常模式的寄存器替换。所有异常模式都有用于R13和R14的替换bank寄存器。快速中断模式有更多的寄存器用于快速中断处理。
当进入异常处理程序时,R14保存了异常处理的返回地址。这用于在异常处理后返回,并处理引起异常的指令。
寄存器13在异常模式之间是bank的,以提供给每个异常处理程序一个私有的堆栈指针。 快速中断模式还对寄存器8到12进行了bank化,以便中断处理可以开始,而无需保存或恢复这些寄存器。
还有第六种特权处理模式,系统模式,它使用用户模式寄存器。这用于运行需要对存储器和/或协处理器有特权访问的任务,而没有对任务期间可能发生哪些异常的限制。
异常处理过程
当异常发生时,ARM处理器在当前指令执行完毕后停止执行,并开始在内存中的一个固定地址执行,这些地址被称为异常向量。每个异常都有单独的向量位置。
操作系统在初始化时会在每个异常上安装一个处理程序。通常,特权操作系统任务在系统模式下运行,以允许在操作系统内部发生异常而不丢失状态。
1.1.3 状态寄存器
除了通用寄存器内容之外的所有处理器状态都保存在状态寄存器中。当前的处理器状态保存在当前程序状态寄存器(CPSR)中。CPSR保存有:
- 4个条件码标志(负数、零、进位和溢出)
- 2个中断禁用位,每种类型的中断各有一个
- 5位编码当前处理器模式
- 1位编码当前执行的是ARM指令还是Thumb指令
每个异常模式也有一个保存程序状态寄存器(SPSR),它保存了异常发生前任务的CPSR。CPSR和SPSRs通过特殊指令进行访问。