文章目录
1.通用寄存器
AArch64支持31个64位的通用寄存器即X0-X30。其中传递参数用X0-X7寄存器,X29为栈帧寄存器FP,X30为链接寄存器LR。可以是用X来表示64位数据,用W来表示低32位数据。
分类 | 描述 |
---|---|
X0-X7 | 用于参数传递 |
X9-X15 | 在汇编代码中x9-x15出现的频率极低, 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. |
X19-X29 | 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre |
X8 | 用于返回结果 |
X16、X17 | 进程内临时寄存器 |
X18 | resrved for ABI -linux中用来存shadow_call_stack |
X29 | FP(frame pointer register) |
X30 | LR:链接寄存器(LR) |
2.PSTATE寄存器
AArch64体系结构使用PSTATE寄存器表示当前处理器状态。
分类 | 字段 | 名称 | 描述 |
---|---|---|---|
The Condition flags | N | Negative Condition flag | 如果指令的结果被视为一个2的补码有符号整数,则PE将其设置为:结果为负数,则为1。结果为正或为零,则为0。 |
The Condition flags | Z | Zero Condition flag | 如果指令的结果为零,则为1,否则为0。 |
The Condition flags | C | Carry Condition flag | 如果指令导致进位条件,例如作为加法结果的无符号溢出则为1,否则为0 |
The Condition flags | V | Overflow Condition flag | 如果指令导致溢出条件,例如作为加法结果的有符号溢出则为1,否则为0。 |
The Execution state controls | SS | Software Step bit | 调试器可以使用它来生成PE单步指令。例如,通过使用软件步骤,在较高异常级别执行的调试器软件可以在较低异常级别执行单步指令。 当它将MDSCR_EL1.SS设置为1时,该状态将禁用调试异常。 |
The Execution state controls | IL | Illegal Execution state bit | 当PSTATE.IL位的值为1时,任何执行任何指令的尝试都会导致“非法执行”状态异常。 |
The Execution state controls | nRW | Current Execution state | 当当前执行状态为AArch64时,此位为0 |
The Execution state controls | EL | Current Exception level | 在重置为AArch64状态时,此字段保存实现的最高异常级别的编码。 |
The Execution state controls | SP | Stack pointer register selection bit | 在复位或AArch64状态异常时,此位被设置为1,意味着SP_ELx被选择。 |
The exception masking bits | D | Debug exception mask bit | 0:未屏蔽异常 1:异常被屏蔽 |
The exception masking bits | A | SError interrupt mask bit | 0:未屏蔽异常 1:异常被屏蔽 |
The exception masking bits | I | IRQ interrupt mask bit | 0:未屏蔽异常 1:异常被屏蔽 |
The exception masking bits | F | FIQ interrupt mask bit | 0:未屏蔽异常 1:异常被屏蔽 |
Access control bits | PAN | Privileged Access Never (PAN) state bit | 当实现ARMv8.1-PAN时:PAN寄存器表示PASTATE寄存器中的PAN字段。当内核态拥有访问用户态内存或者执行用户态程序的能力时,攻击者就可以利用漏洞攻击用户态。 0:表示在内核态可以访问用户态内存。 1:表示在内核态访问用户态内存会触发一个权限异常。 |
Access control bits | UAO | User Access Override (UAO) bit | 该寄存器表示PSTATE寄存器中的UAO字段,UAO为1表示EL1和EL2执行非特权指令(例如LDTR,STTR) 的效果与特权指令(例如LDR,STR)是一样的。 |
Timing control bits | DIT | Data Independent Timing (DIT) bit | 当实现ARMv8.4-DIT时使能,为数据处理指令提供了独立的定时功能 |
3.特殊寄存器
ARMv8体系结构除了支持31个通用寄存器之外,还提供多个特殊寄存器。
3.1 零寄存器
ARMv8体系结构提供两个零寄存器,WZR是32为零寄存器,XZR是64位零寄存器。
3.2 PC指针寄存器
PC指针寄存器通常用来指向当前运行的指令的下一条指令的地址,用于控制程序中指令的运行顺序,但是编程人员不能通过指令来直接访问它。
3.3 SP寄存器
ARMv8体系结构支持4个异常等级,每个异常等级都有一个专门的Sp寄存器SP_ELn.
SP_EL0:EL0下的SP寄存器。
SP_EL1:EL1下的SP寄存器。
SP_EL2:EL2下的SP寄存器。
SP_EL3:EL3下的SP寄存器。
3.4 备份程序状态寄存器
当我们运行一个异常处理程序时,处理器的PSTATE寄存器保存到备份状态寄存器SPSR。异常处理完成的时候,在把SPSR的值恢复到PSTATE寄存器。详情见第4节SPSR_EL1。
3.5 ELR寄存器
ELR存放了异常返回的地址。
3.6 CurrentEL
该寄存器表示PSTATE寄存器的EL字段,其中保存了当前的异常等级。
0:表示EL0
1:表示EL1
2:表示EL2
3:表示EL3
3.7 DAIF
该寄存器表示PSTATE寄存器中的{D,A,I,F}字段。
3.8 SPSei
该寄存器表示PSTATE寄存器中的SP字段,用于在SP_EL0和SP_ELn中选择SP寄存器。
3.9 PAN
PAN寄存器表示PASTATE寄存器中的PAN字段。当内核态拥有访问用户态内存或者执行用户态程序的能力时,攻击者就可以利用漏洞攻击用户态。
PAN寄存器的值如下:
0:表示在内核态可以访问用户态内存。
1:表示在内核态访问用户态内存会触发一个权限异常。
3.10 UAO
该寄存器表示PSTATE寄存器中的UAO字段,UAO为1表示EL1和EL2执行非特权指令(例如LDTR,STTR) 的效果与特权指令(例如LDR,STR)是一样的。
3.11 NZCV
该寄存器表示PSTATE寄存器中的{N,Z,C,V}字段。
4 SPSR_EL1(Saved Program Status Register)寄存器
当ELx发生异常时,保持已保存的进程状态(pstate寄存器)。当从AArch64状态获取异常时:
字段 | 描述 |
---|---|
N, bit [31] | 在对EL1执行异常时设置为N条件标志的值,在EL1中执行异常返回操作时复制为N条件标记。 |
Z, bit [30] | 在对EL1执行异常时设置为Z条件标志的值,并在EL1中执行异常返回操作时复制到Z条件标志。 |
C, bit [29] | 在对EL1执行异常时设置为C条件标志的值,并在EL1中执行异常返回操作时复制到C条件标志。 |
V, bit [28] | 在对EL1执行异常时设置为V条件标志的值,并在EL1中执行异常返回操作时复制到V条件标志。 |
DIT, bit [24] | 当实现ARMv8.4-DIT时:数据独立计时。在EL1中执行异常返回操作时,此位被设置为PSTATE.DIT的值,并被复制到PSTATE.DIT。 |
UAO, bit [23] | 当实现ARMv8.4-DIT时:数据独立计时。在EL1发生异常时,该位被设置为PSTATE.DIT的值,并在EL1中执行异常返回操作时复制到PSTATE.DIT。 |
PAN, bit [22] | 当实现ARMv8.1-PAN时:特权访问从不。在EL1中执行异常返回操作时,此位被设置为PSTATE.PAN的值,并被复制到PSTATE.PAN。 |
SS, bit [21] | Software step.显示在发生异常之前的PSTATE.SS的值。 |
IL, bit [20] | Illegal Execution state bit.显示在发生异常之前的PSTATE.IL的值。 |
D, bit [9] | 处理状态D掩码。0b0不屏蔽针对当前异常级别的监视点、断点和软件步骤异常。针对当前异常级别的0b1监视点、断点和软件步骤异常被屏蔽。当调试异常的目标异常级别高于当前异常级别时,此位不会屏蔽该异常。 |
A, bit [8] | SError中断掩码位。0b0未屏蔽异常。0b1异常已屏蔽。 |
I, bit [7] | IRQ掩码位。0b0未屏蔽异常。0b1异常已屏蔽。 |
F, bit [6] | FIQ掩码位。0b0未屏蔽异常。0b1异常已屏蔽。 |
M[4], bit [4] | 从中获取异常的执行状态。0:取自AArch64的异常。 |
M[3:0], bits [3:0] | 从中获取异常的AArch64状态(异常级别和所选SP)。0b0000 EL0t。0b0100 EL1t。0b0101 EL1h。 |
5 系统寄存器
ARMv8 体系结构支持如下7类系统寄存器。
- 通用系统控制寄存器
- 调试寄存器
- 性能监控寄存器
- 活动监控寄存器
- RAS寄存器
- 通用定时寄存器
参考:armv8手册的B1.2