# ARM-Architecture

ARM

# 0. ARM overview

# 0.1 ARM

ARM: Advance RISC Machines.

RISC: Reduced Instruction Set Computer (精简指令集)

  • 一个大型统一寄存器文件 (37regs)
  • 一个加载 / 存储架构
  • 统一固定长度的指令字段 (32bit A64/A32/T32, 16bit T16)
  • 简单的寻址模式
  • 在每个数据处理指令中对 ALU 和移位器的控制
  • 自动递增和自动递减寻址模式
  • 有条件地执行所有指令,以最大化执行吞吐量

术语:

  1. ARMv – (4T, 5TE, 6, 7-A, 8-A) 通用架构名称
  2. AArch32 - 32 位执行态
  3. AArch64 - 64 位执行态
  4. A32, T32 - AArch32 ISA
  5. A64 - AArch64 ISA
  6. 32bit 架构和 64 bit 架构之间的交互
    • 定义在异常模型里
    • AArch64 <=> AArch32
  7. 指令固定为小端 LE
  8. 数据可以设置 ELx(0: 小端 1: 大端)

# 0.2 ARM-Serial

  • Cortex-A

    • 高性能,具备 MMU (VMSA)

      可以运行如 Symbian、Linux、Android,Windows CE 等操作系统

    • 智能机等

  • Cortex-R

    • 高端嵌入式满足高性能高可靠性的实时需求
    • 基带,存储,车载等
    • 可选的 PMSA
  • Cortex-M

    • 嵌入式单片机,低功耗,低成本
    • 蓝牙,游戏机等
    • 仅支持 thumb 指令
    • 可选的 PMSA

# 0.3 ARM-v8-A

Spec:

  1. 浮点 / NEON 成为指令集一部分
  2. 8 级以上的流水线,多发射
  3. 顺序 / 乱序执行
  4. 直接 / 间接的分支指令预测
  5. L1(I-cache,D-cache),MMU,L2
  6. 虚拟化
  7. 安全拓展插件

# 0.3.1 New-Tech

Super Pipeling

加深 pipeline stages 数目的 pipeline 架构,stage 数目通常大于 8

Super scalar

增加 functional units,使的一个时钟周期可以执行多个指令

  1. 分支指令预测 (Instruction prefetch)
  2. 取指 (Instruction fetch)
  3. 解码 (Instruction decode)
  4. 取寄存器 (Register fetch)
  5. 发射 (Issue)
  6. 执行 (Execute)
  7. 内存访问 (Memory access)
    • Load/Store instr
  8. 寄存器回写 (Register write-back)
    • LDR R1, [R4 + 4]!

# 1. ARM Model

# 1.1 AArch32

# 1.1.1 AArch-32 位执行态

  • A32

    32 位固定长度指令集,通过不同架构变体增强部分 32 位架构执行环境。

  • T32(Thumb - 16bit)

    是以 16 位固定长度指令集的形式引入的,随后在引入 Thumb-2 技术时增强为 16 位和 32 位混合长度指令集。

配置如下:

  1. 13 x ( 32bit 通用寄存器 和 32bit PC/SP/LR )

  2. 不同 PE(处理件)下的 Bank 寄存器

  3. 32 x (64bit 寄存器给 SIMD 和 浮点单元使用户)

    Single Instruction Multiple Data SMID

  4. 32 bit VMSA

  5. A32 和 T32 指令集

    • BX #0 操作数寄存器 (0:ARM 1: Thumb)
    • BLX 切换在 ARM 和 Thumb 状态
  6. PE 的 PSTATE 状态寄存器

    • CPSR

# 1.1.2 AArch-32 Operating Modes

Non-Privileged Mode

  • User (usr)
    • The normal ARM program execution state
    • Unable to change control bits (I,F,T,Mode[0:4]) of Program Status Register
    • Unable to access CP15 registers with MRC/MCR instructions

Privileged Mode

  • FIQ (fiq): Designed to support a data transfer or channel process

  • RQ (irq): Used for general-purpose interrupt handling

  • Supervisor (svc): Protected mode for the operating system

  • Abort mode (abt): Entered after a data or instruction pre-fetch abort

  • System (sys) : A privileged user mode for the operating system

  • Undefined (und): Entered When an undefined instruction is executed

R0(a1)r0r0r0r0r0
R1(a2)R1R1R1R1R1
R2(a3)R2R2R2R2R2
R3(a4)R3R3R3R3R3
R4(v1)R4R4R4R4R4
R5(v2)R5R5R5R5R5
R6(v3)R6R6R6R6R6
R7(v4)R7R7R7R7R7
R8(v5)<u>R8_fiq</u>R8R8R8R8
R9(v6,SB)<u>R9_fiq</u>R9R9R9R9
R10(v7,SL)<u>R10_fiq</u>R10R10R10R10
R11(v8,FP)<u>R11_fiq</u>R11R11R11R11
R12(IP)<u>R12_fiq</u>R12R12R12R12
R13(SP)<u>R13_fiq</u><u>R13_svc</u><u>R13_abt</u><u>R13_irq</u><u>R13_und</u>
R14(LR)<u>R14_fiq</u><u>R14_svc</u><u>R14_abt</u><u>R14_irq</u><u>R14_und</u>
R15(PC)R15(PC)R15(PC)R15(PC)R15(PC)R15(PC)
Sys and UserFIQSVCAbortIFQUndefined
CPSRCPSRCPSRCPSRCPSRCPSR
:--::-----------------::-----------------::-----------------::-----------------::-----------------:
<u>SPSR_fiq</u><u>SPSR_svc</u><u>SPSR_abt</u><u>SPSR_irq</u><u>SPSR_und</u>
  • R13: Used for SP (stack pointer) PUSH and POP

  • R14:Used for LR (link register)

    • 保持 BL/BLX 的下一个指令的地址,一般用于子程序调用
    • 在异常状态下返回地址信息
    • 也能做一般寄存器使用
  • R15: Dedicated for PC

    • 指向正在执行的指令之后的两条指令的指针

    • Two State

      ARM: PC = current Addr. instruction + 8 bit[0:1] = 0

      Thumb:PC = current Addr. instruction + 4 bit[0] = 0

  • CPSR:Current program status register

  • SPSR:Saved program status register used by irq

    Sys/User 没有 SPSR

Thumb State <=> ARM State

r0 : R7 -> 访问方式和 ARM 状态下一样 low reg

R8: R12 只能使用 MOV ADD CMP BX 访问

R13:R15 限制访问

CPSR:只能直接访问

SPSR:无法访问

<u>Rx_xxx</u>:属于 bank 寄存器

3130292827[26:25]24[23:20][19:16][15:10]98765[4:0]
NZCVQIT[1:0]JGE[3:0]EAIFTMode

[31:24] Flags 🏴

  • Jazelle state[24] J

    加速 Java 程序的执行,已经过时了

  • Interrupt Type Control[26:25] IT

  • Saturation for DSP[27] Q

  • ALU operation overflow[28] V

  • ALU operation Carry out[29] C

  • Zero result from ALU[30] Z

  • Negative result from ALU[31] N

[23:16] Status🕶

  • For SIMD instruction[19:16] GE
  • Illegal execution state bit[20] IL
  • Software Step bit[21] SS
  • Reserve[23:22]

[15:8]Extension 🖱

  • Imprecise Data Abort disabled [8] A
  • Endianness for load/store data [9] E
  • interrupt vector[15:10]IT

[7:0]Control 🎛

  • Mode [4:0]
ModeOperating Mode
0b10000User
0b10001FIQ
0b10010IRQ
0b10011Supervisor
0b10111Abort
0b11011Undefined
0b11111System
  • Thumb State[5] T
  • FIQ Disable[6] F
  • IRQ Disable[7] I

注 1: 软件只能通过 MSR/MSR 指令操作 CPSR/SPSR

注 2: 在用户模式下,只能更改 condition field [31:28]

注 3: 所有 field 都可以在特权模式下更改

注 4: 永远不要强制改变 T 和 J 位,否则处理器将进入不可预知的状态

注 5: filed 可以通过_fsxc 后缀单独访问,例如:MSR SPSR_c, r0

# 1.1.3 AArch-32 Exceptional Procedure

ExceptionModeNormal Vector/Hight VectorPriorityINT MaskProduce StageReturn instruction
ResetSupervisor0x00000000/ 0xFFFF00001I, FnRESET is lowN/A
Undefined InstructionUndefined0x00000004/ 0XFFFF00046IExecuteMOVS PC,R14
SWISupervisor0x00000008/ 0xFFFF00086IExecuteMOVS PC,R14
Prefetch AbortAbort0x0000000C/ 0xFFFF000C5IPrefetchSUBS PC ,R14,#4
Data AbortAbort0x00000010/ 0xFFFF00102IExecuteSUBS PC ,R14,#8
ReservedN/AN/AN/AN/AN/AN/A
IRQIRQ0x00000018/ 0xFFFF00184InIRQ is lowSUBS PC ,R14,#4
FIQFIQ0x0000001C/ 0xFFFF001C3I, FnFIQ is lowSUBS PC ,R14,#4

注 1: PC 值是异常生成时执行指令的地址

注 2: 无论在哪种状态下生成异常,处理器都将进入 ARM 状态

注 3: 在返回时不需要关心它在进入异常之前的状态。无论 ARM 或 Thumb 的声明,都使用相同的回调地址

Flow

image-20200813232358727

# 1.2 AArch64

# 1.2.1 AArch-64

  • A64

    提供与 ARM 和 Thumb 指令集类似功能的 32 位固定长度指令集。随 ARMv8-A 一起引入,它是一种 AArch64 指令集。

配置如下:

  1. 31 x 64bit 通用寄存器 X30 作为 LR

    • 64 位寄存器 X0 ~ X30,32 位寄存器 W0 ~ W30
  2. 不同 PE(处理件)下的 Bank 寄存器

  3. 32 x (128bit 寄存器给 SIMD 和 浮点单元使用)

    Single Instruction Multiple Data SMID

  4. 64 bit VMSA

  5. A64 指令集

  6. PE 的 PSTATE 状态寄存器

    • 不止一个
  7. 异常模型:减少 Banked 寄存器 / 模式

    • EL0~3 共 4 级异常模型

# 1.2.2 AArch-64 Operating Modes

4 级 EL 代替 8 种不同的处理器模式

  • 类似 x86 架构的 RING

  • EL0: 非特权等级,应用程序运行在此等级 Usr mode

  • EL1: 特权等级,用于运行 kernel

  • EL2: virtualization on Non-secure

    • 可运行 Hypervisor
  • EL3: 支持切换 Secure 态和 Non-secure 态

    • 可运行 Secure monitor
  • EL1~3 有独自的 ELR/SP/SPSR banked 寄存器

实际设计中 EL0 ~ 1 必须,EL2~3 可选。

PE 可能是 EL0,EL1,EL3

  • 64 位 SP (XSP/WSP)

    • 必须 16 字节对齐 (否则产生栈对齐异常)
    • 在 EL1 可更改这个设定
  • 64 位 PC

    • 在不是 4 字节对齐的地址上执行将产生对齐异常
  • Unbanked 寄存器

    • X0 ~ 30,V0 ~ 31
  • Banked 寄存器

    • 主要用于异常返回信息 / SP
EL0EL1EL2EL3
SP = Stack PtrSP_EL0SP_EL1SP_EL2SP_EL3
ELR = Exception Link RegisterELR_EL1ELR_EL2ELR_EL3(PC)
Saved/Current Process Status RegisterSPSR_EL1SPSR_EL2SPSR_EL3(CPSR)
31302928[27:24][23:22]2120[19:10]987654[3:0]
NZCVRES0RES0SSILRES0DAIFRES0MMode

[31:24] Flags 🏴

  • Reserve[24:27]
  • ALU operation overflow[28] V
  • ALU operation Carry out[29] C
  • Zero result from ALU[30] Z
  • Negative result from ALU[31] N

[23:20] Status🕶

  • Illegal execution state bit[20] IL
  • Software Step bit[21] SS
  • Reserve[23:22]

[19:8]Extension 🖱

  • Imprecise Data Abort disabled [8] A
  • Debug mask bit [9] D
  • RES0[19:10]

[7:0]Control 🎛

  • Mode [3:0]
ModeException level and SP
0b1101EL3h
0b1100EL3t
0b1001EL2h
0b1000EL2t
0b0101EL1h
0b0100EL1t
0b0000EL0t
  • Execution State[4] M 1:AArch32 0:AArch64
  • Reserve[5]
  • FIQ Disable[6] F
  • IRQ Disable[7] I
ILP32LP64LLP64ILP64
char8
short16
int32323264
long32643264
long long64
size_t32646464
pointer32646464

# 1.2.3 AArch-64 Exceptional Procedure

  • 异常返回地址写入 ELR

  • 进入异常时关闭所有中断

  • 异常发生时或返回

    • 进入异常:增加 EL 等级或维持不变
    • 异常返回:减少 EL 等级或维持不变
  • EL1~3 有不同的异常向量地址 (VBAR) 寄存器

  • 异常向量包含

    • 异常类型:

      1. synchronous(MMU abort),

      2. IRQ, FIQ or System Error

      3. Exception origin (same or lower EL) and register width

  • 异常原因寄存器 (提供异常细节)

    • 异常类型
    • 指令长度 (AArch32)
    • 指令相关信息
  • VBAR

# 2. ARM Aarch32 - Aarch64

image-20200813232654428

2 种执行态

  • AArch64:64 位执行环境

  • AArch32:32 位执行环境,兼容 ARMv7-A

不同的 EL 等级可以有不同的执行态

  • EL0 由异常返回信息指定

  • 由高 EL 的系统寄存器指定

异常等级组合 1组合 2组合 3组合 4组合 5
EL0AArch64AArch32AArch32AArch32AArch32
EL1AArch64AArch64AArch32AArch32AArch32
EL2AArch64AArch64AArch64AArch32AArch32
EL3AArch64AArch64AArch64AArch64AArch32

如图:

当进入高 EL 时有两种策略

  1. 执行态保持不变
  2. 由 AArch32 => AArch64

当返回低 EL 时有两种策略

  1. 执行态保持不变
  2. 由 AArch64 => AArch32

寄存器映射

映射X0~X7X8~X15X15-X23X24~X30
0R0R8_usrR14_irqR8_fiq
1R1R9_usrR13_irqR9_fiq
2R2R10_usrR14_svcR10_fiq
3R3R11_usrR13_svcR11_fiq
4R4R12_usrR14_abtR12_fiq
5R5R13_usrR13_abtR13_fiq
6R6R14_usrR14_undR14_fiq
7R7R13_hypR13_undN/A
AArch32AArch64
:------::------:
SPSR_svcSPSR_EL1
SPSR_hypSPSR_EL2
ELR_hypELR_EL2

链接只能用各自的库无法混着链接!!!

更新于

请我喝[茶]~( ̄▽ ̄)~*

Junwide Xiao 微信支付

微信支付

Junwide Xiao 支付宝

支付宝