菜单

kaoqi
kaoqi
发布于 2026-08-10 / 12 阅读
0
0

ARMv8体系结构

ARMv8是ARM公司发布的第一代支持64位处理器的指令集和体系结构。后续的具体版本主要由cortex更新。

ARMv8手册:https://support.arm.com/architectures/a-profile-architecture

执行状态

执行状态指处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。

AArch64的执行状态包括:

1、31个64位的通用寄存器。

2、64位的程序计数(Program counter,PC)指针寄存器、栈指针(Stack Pointer,SP)寄存器以及异常链接器(Exception Link Register,ELR)。

3、提供64位A64指令集

4、定义ARMv8异常模型,支持4个异常等级,EL0~EL3。

5、提供64位的内存模型。

6、定义一组处理器状态(PSTATE)用来保存PE(Processing Element)的状态。

通用寄存器

AArch64支持31个64位的通用寄存器,分别是X0~X30,X代表通用64位寄存器,W代表通用寄存器的低32位。通用寄存器主要用于执行函数,可以理解成是函数栈概念的一种具体实现。具体来说,通用寄存器往往对应了AArch64的调用过程标准AAPCS64(AArch64 Procedure Call Standard,通过固定寄存器分配和显式栈操作实现的高效调用),下面是针对这些寄存器的符合标准的用途解释:

寄存器组

主要用途

保存责任方

X0 - X7

参数传递和返回值。前8个整数或指针参数放这里,函数的返回值也放这里(X0或W0里)。

调用者保存。被调用的函数可以随意修改它们,不用恢复原样。

X9 - X15

临时寄存器。函数内部可以随便用

调用者保存

X19 - X29

被调用者保存寄存器

被调用者保存,如果被调用的函数想用这些寄存器,它必须在函数开头把它们的原始值存到栈里,在返回前再恢复原样。

X8

间接结果寄存器,当返回值是很大的结构体时,用来存放指向该结构体的指针。

调用者保存

X16,X17

内部过程调用临时寄存器,链接器再动态链接场景下用到

调用者保存

X18

平台寄存器,由操作系统或平台决定,通常用于线程本地保存

视平台而定

X29(FP)

帧指针,指向当前函数帧栈的底部,时调试和回溯调用的关键

被调用者保存

X30(LR)

链接寄存器,执行BL指令调用函数时,CPU会自动把返回地址存到这里。函数返回时,通过RET指令跳回这个地址。

调用者保存

SP

栈指针,时钟指向当前栈顶

很特殊,需要严格维护

应该说AAPCS64与通用寄存器将会与内存中的堆栈概念比较严格的对应起来。

处理器状态寄存器

PSTATE寄存器中各个位的指示被拆分位不同的独立含义,主要包含NZCV(条件标志位)、DAIF(异常屏蔽位)、执行状态控制、访问权限这几个部分。在指令集中,有关于PSTATE寄存器的内容是直接封装为了指令,我们可以用类寄存器方式方位这个处理器状态寄存器,但实际上,这个处理器状态寄存器的真实值绝对不是一个类通用寄存器一样的可访问寄存器。

分类

字段

描述

条件标志位

N

负数标志位,指令为计算指令,且计算结果为负数,N=1,否则N=0

Z

零标志位,返回值为0时的一种特殊标志,为0时代表结果为0

C

无符号溢出标志位,没有溢出时为0,溢出时为1,意思是指代当前计算结果能不能用N位描述装下

V

有符号溢出标志位,意思是当前计算结果能不能用N-1位装下,-1位的含义是携带了一个符号

执行状态控制

SS

软件单步调试状态,处理器每执行一条指令,就自动触发一个软件单步调试异常

IL

执行一条非法指令或陷入一个无法处理的异常状态时,这个寄存器置1,标记当前处理器处于非法状态。

nRW

描述32位还是64位的当前执行状态的寄存器,为1时代表处于32位状态,为0时代表是64位状态

EL

异常等级

SP

选择SP寄存器

异常掩码标志位

D

调试位,可以在异常过程中打开断点调试和软件单步功能

A

用来屏蔽系统错误

I

用来屏蔽IRQ

F

用来频闭FIQ

权限访问

PAN

特权模式禁止访问

UAO

用户访问覆盖标志位

特殊寄存器

1、零寄存器

WZR指代32位的零寄存器,XZR指代64位的零寄存器,可以用作源寄存器给别的寄存器赋值。

2、PC指针寄存器

PC指针寄存器通常用来指向当前运行指令的下一条指令的地址,用于控制程序中指令的运行顺序。

3、SP寄存器

栈指针寄存器,始终指向当前栈内存区域的顶部,但需要注意的是,栈指针会有对应的权限等级,由EL寄存器划分后,实际用于执行的SP寄存器可能是SP_EL0、SP_EL1、SP_EL2、SP_EL3四种情况中的一个,用来表示当前栈的权限等级。

要理解栈,需要理解内存结构、理解异常。

4、备份程序状态寄存器

当运行一个异常处理程序时,需要将当前PSTATE的值保存在SPSR(Saved Program Status Register)中,当异常完成并返回时,再把SPSR的值恢复到PSTATE中。

5、ELR

存放异常返回地址

6、CurrentEL寄存器

保存当前异常等级

7、DAIF寄存器

表示PSTATE中的DAIF字段,用于异常掩码标志位

8、SPSel寄存器

表示PSTATE中的SP具体字段

9、PAN寄存器

表示PSTATE中的PAN字段。PAN为0表示内核态可以访问用户态内存,PAN为1代表内核态访问用户态内存会触发一个访问权限异常。

10、UAO寄存器

EL1(内核态)访问EL0(用户态)内存时,如果UAO为1,可以直接LDR/STR访问,UAO为0,必须使用LDTR/STTR指令加权才能访问

11、NZCV寄存器

用于表示PSTATE中的NZCV字段

系统寄存器

1、通用系统控制寄存器

2、调试寄存器

3、活动监控寄存器

4、统计扩展寄存器

5、性能监控寄存器

6、RAS寄存器

7、通用定时器寄存器


评论