ARMv8构架简介

2019-10-27 05:40发布

ARM体系结构定义了抽象机器的行为,称为处理元素(processing element),通常缩写为PE。与ARM体系结构兼容的实现必须符合处理元素所描述的行为。

ARM架构是一个精简指令集计算机(RISC)架构,具有以下RISC架构特征:

· 一个大的统一寄存器文件。

· 一种加载/存储架构,其中数据处理操作只对寄存器内容进行操作,而不是直接对内存内容进行操作。

· 简单的寻址模式,所有的加载/存储地址仅由寄存器内容和指令字段决定。

ARMv8体系结构的一个重要特性是向后兼容,并且可以在各种标准和更专门的用例中自由地进行优化实现。ARMv8架构支持:

· A 64-bit Execution state, AArch64.

· A 32-bit Execution state, AArch32, 这与以前版本的ARM架构兼容

通用名AArch64和AArch32描述64位和32位执行状态:

· AArch64是64位执行状态,这意味着地址保存在64位寄存器中,基本指令集中的指令可以使用64位寄存器进行处理。AArch64状态支持A64指令集。

· AArch32是32位执行状态,这意味着地址保存在32位寄存器中,基本指令集中的指令使用32位寄存器进行处理。AArch32状态支持T32和A32指令集。

ARM定义了三个架构概要:

· A:Application架构,支持基于内存管理的虚拟内存系统体系结构(VMSA),支持A64、A32和T32指令集

· R:Real-time架构,支持基于内存保护的受保护内存系统架构(PMSA),支持A32和T32指令集。

· M:Microcontroller架构,支持T32指令集的变体

ARMv8引入了对ARM架构的主要更改,同时与以前版本的架构保持了高度的一致性。下面的小节描述了关键的ARMv8架构概念。

Execution state

执行状态定义PE执行环境,包括:

· 支持的寄存器宽度。

· 支持的指令集。

· 异常模型

· 虚拟内存系统架构(VMSA)。

· 编程模型。

AArch64,64位执行状态:

· 提供31个64位通用寄存器,其中X30用作过程链接寄存器。

· 提供64位程序计数器(PC)、堆栈指针(SPs)和异常链接寄存器(ELRs)。

· 为SIMD向量和标量浮点支持提供32个128位寄存器。

· 提供单个指令集A64

· 定义了ARMv8异常模型,有四个异常级别,EL0 - EL3,提供了一个执行特权层次结构,

· 提供对64位虚拟寻址的支持。

· 定义许多包含PE状态的进程状态(PSTATE)元素。A64指令集包括直接操作各种PSTATE元素的指令

· 使用表示可以访问寄存器的最低异常级别的后缀来命名每个系统寄存器。

AArch32,32位执行状态:

· 提供13个32位通用寄存器,以及一个32位PC、SP和link寄存器(LR)。LR同时用作ELR和过程链接寄存器。其中一些寄存器具有多个存储实例,用于不同的PE模式。

· 为从Hyp模式返回的异常提供一个ELR。

· 为高级SIMD向量和标量浮点支持提供32个64位寄存器。

· 提供两个指令集,A32和T32。

· 支持基于PE模式的ARMv7-A异常模型,并将其映射到基于异常级别的ARMv8异常模型。

· 提供对32位虚拟寻址的支持。

· 定义许多包含PE状态的进程状态(PSTATE)元素。A32和T32指令集包括直接操作各种PSTATE元素的指令,以及使用应用程序状态寄存器(APSR)或当前程序状态寄存器(CPSR)访问PSTATE的指令。

在AArch64和AArch32执行状态之间转移控制称为互处理(interprocessing)。PE只能在异常级别发生变化时在执行状态之间移动,并且必须遵守文中给出的规则。这意味着不同的软件层,例如应用程序、操作系统内核和管理程序,在不同的异常级别执行,可以在不同的执行状态中执行。

在ARMv8中,可能的指令集取决于执行状态:

· AArch64状态只支持一个名为A64的指令集。这是一个使用32位指令编码的固定长度指令集。

· AArch32状态支持以下指令集:

· A32,这是一个使用32位指令编码的固定长度指令集。

· T32,这是一个可变长度的指令集,同时使用16位和32位指令编码。在以前的文档中,这些指令集被称为ARM和Thumb指令集。ARMv8扩展了这些指令集。在AArch32状态中,指令集状态决定PE执行的指令集。

System registers

系统寄存器提供了体系结构特性的控制和状态信息。

系统寄存器使用标准的命名格式:.识别特定寄存器以及寄存器内的控制和状态位。

位也可以通过[x:y]或通用形式位[x:y]中的数字位置来描述。

此外,在AArch64状态下,大多数寄存器名都包含最低的异常级别,可以将寄存器作为寄存器名的后缀访问:_ELx, where x is 0, 1, 2, or 3.

The System registers 包含:

· General system control registers.

· Debug registers.

· Generic Timer registers.

· Optionally, Performance Monitor registers.

· Optionally, the Activity Monitors registers.

· 可选地,在其他ARM架构规范中定义的一组或多组寄存器:

· 跟踪系统寄存器,如嵌入式跟踪宏单元体系结构规范中定义的,ETMv4。

· 可伸缩向量扩展系统寄存器(Scalable Vector Extension System registers),定义在ARM®架构参考手册补充,可伸缩向量扩展(SVE),用于ARMv8-A。

· 统计分析扩展系统寄存器,定义在ARM®架构参考手册的补充,统计分析的扩展,为ARMv8-A。

· 通用中断控制器(GIC)系统寄存器,

· RAS扩展系统寄存器,在ARM®可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)(RAS)中定义ARMv8规范,用于ARMv8- a架构配置文件。RAS扩展是对ARMv8.2体系结构的强制扩展,也是对ARMv8.0和ARMv8.1体系结构的可选扩展。

The ARM Generic Interrupt Controller System registers

从ARM通用中断控制器体系结构GICv3的版本3开始,GIC体系结构规范定义了一个系统注册接口来实现它的一些功能。

ARMv8 Debug

ARMv8支持以下功能:

· Self-hosted debug,在这个模型中,PE生成调试异常。调试异常是ARMv8的一部分异常模式。

· External debug,在这个模型中,调试事件导致PE进入调试状态。在调试状态下,PE由外部调试器控制。

所有的ARMv8实现都支持这两个模型。特定用户选择的模型取决于产品设计和开发生命周期的不同阶段的调试需求。例如,外部调试可能在硬件实现调试和操作系统启动期间使用,而自托管调试可能在应用程序开发期间使用。

Supported data types

ARMv8架构支持以下整数数据类型:

· Byte 8 bits.

· Halfword 16 bits.

· Word 32 bits.

· Doubleword 64 bits.

· Quadword 128 bits.

该架构还支持以下浮点数据类型:

· Half-precision

· Single-precision

· Double-precision

它还支持:

· 定点解释的词和双关词

· 向量,其中一个寄存器包含多个元素,每个元素具有相同的数据类型。

ARMv8架构提供了两个register文件:

· A general-purpose register file.

· A SIMD&FP register file.

在每种情况下,可能的寄存器宽度取决于执行状态。

In AArch64 state:

· 通用寄存器文件包含64位寄存器:

· 许多指令可以以64位寄存器或32位寄存器的形式访问这些寄存器,只使用底层的32位。

· 一个SIMD&FP寄存器文件包含128位寄存器:

· 四字整数数据类型只适用于SIMD&FP寄存器文件。

· 浮点数据类型只适用于SIMD&FP寄存器文件。

· 虽然AArch64向量寄存器支持128位向量,但根据使用的A64指令编码,有效向量长度可以是64位或128位

In AArch32 state:

· 通用寄存器文件包含32位寄存器:

· 两个32位寄存器可以支持一个双字。

· 支持矢量格式

· 一个SIMD&FP寄存器文件包含64位寄存器:

· AArch32状态不支持四字整数或浮点数据类型。

Vector formats

在包含对SIMD&FP寄存器文件进行操作的SIMD指令的实现中,寄存器可以容纳一个或多个压缩元素,所有元素的大小和类型都相同。寄存器和数据类型的组合描述了元素的向量。向量被认为是指令中指定的数据类型元素的数组。向量中的元素数量由数据元素的大小和寄存器的大小来表示。向量索引的范围是0到(元素数量- 1)。索引为0表示向量的最小有效端。

Vector formats in AArch64 state

在AArch64状态下,SIMD&FP寄存器可以称为Vn,其中n是0到31之间的值。SIMD&FP寄存器支持加载、存储和数据处理操作的三种数据格式:

· 寄存器中最小有效位的单个标量元素。

· 字节、半字或字元素的64位向量。

· 由字节、半字、字或双字元素组成的128位向量。

元素大小定义在表中,向量格式描述如下:

· For a 128-bit vector: Vn{.2D, .4S, .8H, .16B}.

· For a 64-bit vector: Vn{.1D, .2S, .4H, .8B}.

ector formats in AArch32 state

每个指令描述都指定了指令支持的数据类型。

A

vanced SIMD and floating-point support

ARMv8可以支持以下高级SIMD和浮点指令的支持级别:

· 完全SIMD和浮点支持,没有异常捕获。

· 完整的SIMD和浮点支持与异常捕获。

· 没有浮点或SIMD支持。此选项仅授权用于针对特定市场的实现。

ARMv8支持单精度(32位)和双精度(64位)浮点数据类型和IEEE 754浮点标准定义的算术。它还支持用于数据存储的半精度(16位)浮点数据类型,支持单精度和半精度数据类型、双精度和半精度数据类型之间的转换。在实现ARMv8.2-FP16时,它还支持用于数据处理操作的半精度浮点数据类型。

SIMD指令提供打包的单指令多数据(SIMD)和单元素标量操作,并支持:

· AArch64状态下的单精度和双精度算法。

· 单精度算法仅在AArch32状态下有效。

· 当ARMv8.2-FP16实现时,在AArch64和AArch32状态下支持半精度算法。

The ARM memory model

ARM内存模型支持:

· 在未对齐的内存访问上生成异常。

· 限制应用程序对指定内存区域的访问。

· 将执行指令提供的虚拟地址(VA)转换为物理地址(PA)。

· 在big-endian和little-endian之间改变对多字节数据的解释。

· 控制访问内存的顺序。

· 控制缓存和地址转换结构。

· 通过多个PEs同步访问共享内存。

· 控制和阻止对内存的投机性访问的屏障。

VA支持取决于执行状态,具体如下:

AArch64 state

支持64位虚拟寻址,翻译控制寄存器决定支持VA的范围。在EL1和EL0上执行支持两个独立的VA范围,每个范围都有自己的翻译控制。

AArch32 state

支持32位虚拟寻址,翻译控制寄存器决定支持VA的范围。为了在EL1和EL0上执行,系统软件可以将VA范围分成两个子范围,每个子范围都有自己的翻译控制。

所支持的PA空间是由实现定义的,可以由系统软件发现。无论执行状态如何,虚拟内存系统体系结构(VMSA)都可以将VAs转换为PA空间中任何位置的内存块或内存页。

ARMv8 architecture extensions

最初的ARMv8-A架构称为ARMv8.0。总结了ARMv8.0允许的扩展:

· ARMv8加密扩展

· 可靠性、可用性和可服务性(RAS)扩展

· 事件监视器

· IVIPT扩展

· 基于PC示例的概要分析扩展。

ARMv8.1架构扩展:

ARMv8.1体系结构扩展同时添加了以下两个部分:

· 建筑功能。有些是强制性的,有些是选择性的。一些特性必须一起实现。

· 建筑的要求。这些都是强制性的。

一个实现是ARMv8.1兼容时,所有下列应用:

· 它包含了所有必需的ARMv8.1架构特性。

· 它包含了所有的ARMv8.1架构需求。

ARMv8.2架构扩展

ARMv8.2体系结构扩展是对ARMv8.1的扩展。

ARMv8.3架构扩展

ARMv8.3体系结构扩展是对ARMv8.2的扩展。它添加了架构特性。有些是强制性的,有些是选择性的。一些特性必须一起实现。

ARMv8.4架构扩展

ARMv8.4体系结构扩展是对ARMv8.3的扩展。它添加了架构特性。有些是强制性的,有些是选择性的。一些特性必须一起实现。一个实现是ARMv8.4兼容的

统计分析扩展(SPE)

SPE是ARMv8.2的一个可选扩展。也就是说,SPE需要实现ARMv8.2。

可伸缩向量扩展(SVE)

SVE是ARMv8.2的可选扩展。也就是说,SVE需要实现ARMv8.2。

活动监视器扩展(AMU)

AMU是ARMv8.4的可选扩展。也就是说,AMU需要实施ARMv8.4。

内存分区和监视扩展(MPAM)

MPAM是ARMv8.2的一个可选扩展。也就是说,MPAM需要实现ARMv8.2。

ARMv8加密扩展

RMv8加密扩展提供了加速加密和解密的指令,并包括以下特性:

· 包括AESD和AESE指令的ARMv8.0-AES。

· 包括SHA1*和SHA256*指令。

实现中的密码扩展的存在受出口许可证控制的约束。密码扩展是SIMD支持的扩展,对向量寄存器文件进行操作。

密码扩展还提供了操作长多项式的乘法指令。

加密扩展在AArch64状态和AArch32状态中提供此功能,并且同时支持AArch64状态和AArch32状态的实现在这两种状态中提供相同的加密扩展功能。

对加密扩展的ARMv8.2扩展

在ARMv8.2中,ARMv8.0加密扩展的实现可以包括以下任何一个或两个:

· AES功能,包括支持64位多项式的乘法。ID_AA64ISAR0_EL1.AES字段表示是否支持此功能。

· SHA1和SHA2-256的功能。ID_AA64ISAR0_EL1.{SHA2, SHA1}字段表示是否支持此功能。

此外,ARMv8.2向ARMv8加密扩展添加了两个可选的扩展,它们仅在AArch64状态下提供加密功能。这两个可选的功能是:

ARMv8.2-SHA, SHA2-512 and SHA3 functionality

仅在A64指令集中,ARMv8.2-SHA添加了支持以下高级SIMD指令:

· SHA2-512 (SHA512).

· SHA3.

ARMv8.2-SM, SM3 and SM4 functionality

仅在A64指令集中,ARMv8.2-SM添加了支持中国密码算法SM3和SM4的高级SIMD指令。ARMv8.2-SM的实现独立于任何SHA功能的实现。ID_AA64ISAR0_EL1。{SM3, SM4}字段识别ARMv8.2-SM的存在。

文章来源: https://www.toutiao.com/group/6751363275914478093/