本文编写于 667 天前,最后修改于 91 天前,其中某些信息可能已经过时。
ARMv8是ARM公司发布的第一代支持64位处理的指令集和体系结构。它在扩充64位寄存器的同时提供了对上一代体系结构指令集的兼容,因此它提供了运行32 位和 64位应用程序的环境。
基本概念
arm处理器实现的是精简指令集结构。有如下比较重要的概念
- 处理机(processing elemen PE):处理器处理事务的过程抽象成处理机
- 执行状态(execution state):处理器运行所处的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。在armv8中有两个执行状态:AArch64和AArch32。主要的区别在于通用寄存器的个数与位宽,pc寄存器、栈指针、ELR寄存器的位宽,指令集,以及异常模型。学习的重点放在AArch64上。后续笔记没有特别指出的地方统一都指在AArch64状态下。
- ARMv8指令集:针对不同的执行状态提供不同指令集的支持,包括A64、A32、T32。指令集是处理器体系结构设计的重点之一。ARMv8架构中最大的改变是增加了新的64位的指令集,它可以处理64位宽的寄存器和数据并且使用64位的指针来访问内存。需要注意的是A64指令集的指令宽度是32位,而不是64位。
异常等级
AArch64状态的异常等级(exception level)确定了处理器当前运行的特权级别,类似于ARMv7体系结构中的特权等级。
- EL0:用户特权,用于运行普通用户程序
- EL1:系统特权,通常用于操作操作系统内核。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。
- EL2:运行虚拟化扩展的虚拟机监控器(hypervisor)
- EL3:运行安全世界中的安全监控器(secure monitor)

寄存器
架构中支持31个64位的通用寄存器,分别是X0-X31寄存器。除了用于数据计算和存储之外,通用寄存器还可以在函数的调用过程中起到特殊作用。W表示寄存器低32位的数据。

处理器状态
架构规定使用PSTATE寄存器来表示当前处理器状态(processor state)。包括条件标志位(N:负数标志位、Z:零标志位、C:进位标志位、V:有符号数溢出标志位)、执行状态控制(SS、IL、nRW:当前执行状态、EL:当前异常等级、SP:选择SP寄存器)、异常掩码标志位(D、A、I、F)、访问权限(PAN、UAO)。
一些特殊的寄存器
- 零寄存器:XZR(64位零寄存器)、WZR(32位零寄存器)
- PC指针寄存器:用来指向当前运行指令的下一条指令的地址,用于控制程序中指令的运行顺序,但是编程人员无法直接访问
- SP寄存器:在每一个异常等级下都有一个专门的SP寄存器。当运行在非EL0下时,可以访问SP_EL0和SP_ELn。
- SPSR寄存器:saved program status register。用于在发生异常时保存PSTATE寄存器的值,并在异常处理完成并返回时,将SPSR寄存器的值恢复到PSTATE寄存器中。
- ELR寄存器:exception linker register。存放异常返回地址。
- CurrentEL寄存器:表示PSTATE寄存器中的EL字段,其中保存了当前异常等级。
- DAIF寄存器:表示PSTATE寄存器中的D、A、I、F字段
- SPSel寄存器:表示PSTATE寄存器中的SP字段,用于在SP_EL0和SP_ELn中选择SP寄存器