12.1. arm64寄存器

寄存器官方参考文档

12.1.1. 通用寄存器

arm64提供了32个在任何时间任何特权级下都可以访问的64位通用寄存器, 他们通常被称为寄存器X0~X30

../../_images/register_summary.png

寄存器

描述

X30(LR)

链接寄存器(函数返回地址)

X29(FP寄存器)

栈帧指针寄存器

X19~X28

被调用函数保存的寄存器,在子函数使用时需要保存到栈中

X18

平台寄存器

X17

临时寄存器或者第二个IPC(Intra-Procedure-Call)临时寄存器

X16

临时寄存器或者第一个IPC临时寄存器

X9~X15

临时寄存器

X8

间接结果位置寄存器,用于保存子程序的返回地址

X0~X7

用于传递子程序参数和结果,若参数个数大于8,就采用栈来传递。X0寄存器用于返回结果

备注

每个异常级别都有自己的栈指针,SP_EL0, SP_EL1, SP_EL2, SP_EL3

12.1.2. 特殊寄存器

../../_images/armv8_special_register.png
  • PC程序计数器: 指向当前运行指令的下一条指令的地址,用于控制程序中指令的运行顺序,但编程人员不能通过指令来直接访问它

  • SP寄存器: 每个异常等级下都有一个专门的SP寄存器SP_ELn

  • 异常链接寄存器(ELR): 保存异常返回地址

  • 程序状态保存寄存器(SPSR): 当异常发生时,CPSR中的处理器状态佳能保存在相关的程序状态保存寄存器(SPSR)中, SPSR保存着异常发生之前的PSTATE的值, 用于异常返回时恢复PSTATE的值

../../_images/registers_spsr.png

备注

  • N: 负数标志位,如果为负数则N=1

  • Z: 零标志位,如果结果为零,则Z=1

  • C: 进位标志位

  • V: 溢出标志位

  • SS: 软件步进标志位,表示一个异常发生时,软件步进是否开启

  • IL: 非法执行状态位

  • D: 程序状态调试掩码,在异常发生时的异常级别下,来自监视点、断点和软件单步调试事件中的调试异常是否被屏蔽

  • A: SError(系统错误)掩码位

  • I: IRQ掩码位

  • F: FIQ掩码位

  • M: 异常发生时的执行状态,0表示aarch64

  • M[3:0]: 异常发生时的异常级别

  • 处理器状态寄存器(PSTATE): 保存处理器的状态信息,包括条件标志、异常级别、IRQ使能状态等

| 31       | 30 | 29  | 28   | 27    | 26 | 25 | 24 | 23-22 | 21-20 | 19-16 | 15-10    | 9-8 | 7-6  | 5-4  | 3-0 |
|----------|----|-----|------|-------|----|----|----|-------|-------|-------|----------|-----|------|------|-----|
| Reserved |PAN | DIT | SSBS | IL    | A  | I  | F  |   M   | T     | E     | Reserved | S   | M    | V    | C   |

备注

  • PAN: 该位控制是否允许在特权界别下访问某些内存区域,PAN=1时,禁止在特权模式下访问用户空间内存区域

  • DIT: 禁用中断控制位

  • SSBS: 控制是否禁用规范存储绕过

  • IL: 标志指令的长度,arm64中可以使用32位及64位长度指令

  • A: 是否能够响应一步中断

  • I: 是否禁用IRQ

  • F: 是否禁用FIQ

  • M: 指示当前处理器异常级别

  • T: 指示是否在thumb模式下执行指令,arm处理器支持arm和thumb两种指令集架构

  • E: 存储当前处理器状态下的异常标志

  • S: 用于控制堆栈指针对齐检查

  • M: 指示当前处理器的工作模式

  • V: 指示是否启用了向量处理器

  • C: 表示条件标志,包括零标志、负标志

  • 系统控制寄存器(SCTLR): 用来控制标准内存、配置系统能力、提供处理器核状态信息的寄存器

../../_images/control_registers.png

备注

  • UCI: 设置此位后,在arm64中DC CVAU, DC CIVAC, DC CVAC和IC IVAU指令启用EL0访问

  • EE: 异常字节序,0小端, 1大端

  • EOE: EL0显示数据访问的字节序

  • WXN: 写权限不可执行,0可写区域不设置不可执行权限,1可写区域强制为不可执行

  • nTWE: 不陷入WFE, 1表示WFE作为普通指令执行

  • nTWI: 不陷入WFI, 1表示WFI作为普通指令执行

  • UCT: 开启arm64的EL0访问CTR_EL0寄存器

  • DNE: EL0下访问DC AVA指令,0禁止执行

  • I: 开启指令缓存

  • UMA: 用户屏蔽访问,控制从EL0的中断屏蔽访问

  • SED: 禁止SETEND, 在EL0使用aarch32精致SETEND指令, 0使能,1禁止

  • ITD: 禁止IT指令

  • CP15BEN: CP15 barrier使能

  • SA0: EL0栈对齐检查使能位

  • C: 数据cache使能

  • A: 对齐检查使能位

  • M: 使能MMU