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,通过固定寄存器分配和显式栈操作实现的高效调用),下面是针对这些寄存器的符合标准的用途解释:
应该说AAPCS64与通用寄存器将会与内存中的堆栈概念比较严格的对应起来。
处理器状态寄存器
PSTATE寄存器中各个位的指示被拆分位不同的独立含义,主要包含NZCV(条件标志位)、DAIF(异常屏蔽位)、执行状态控制、访问权限这几个部分。在指令集中,有关于PSTATE寄存器的内容是直接封装为了指令,我们可以用类寄存器方式方位这个处理器状态寄存器,但实际上,这个处理器状态寄存器的真实值绝对不是一个类通用寄存器一样的可访问寄存器。
特殊寄存器
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、通用定时器寄存器