2011年11月 ,ARM公司发布首个支持64位指令集的新一代ARMv8处理器架构,引入一系列新特征,也成为ARM 进军服务器处理器市场的技术基础。
2013年起ARM公司陆续发布了ARMv8处理器架构的标准文档《ARM体系结构参考手册ARMv8:ARMv8-A架构描述(ARM® Architecture Reference Manual ARMv8, for ARMv8-A Architecture Profile)》,ARM公司简称该文档为Arm ARM ( 以下简称为“ARMv8-A架构规范”),该文档的最新版本(截至发稿)发布于2023年6月30日(J.a-02)ARM官网链接
ARMv8-A架构属于64位处理器架构,向下兼容ARMv7,当然也被ARMv9向下兼容(毕竟也发布12年了),虽然为保持兼容,ARMv8-A架构仍支持ARMv7体系结构的32位A32指令集(之前被称为ARM指令集),并且保留了ARMv7架构的TrustZone技术 、虚拟化技术及增强的SIMD(Neon) 技术等所有特性。但是A64指令集并不是在原有的32位A32指令集基础上直接增加的64位拓展技术,为降低复杂度、提高效率,当ARMv8-A架构处理器在执行64位指令时,32位指令将停止工作,因而可以保证处理器在低功耗状态下完成64位计算。
ARMv8-A 架构引入了两种执行状态(Execution State) :AArch64(64位ARM体系结构)、AArch32(32位ARM体系结构)
新引入的 64 位处理器架构 AArch64 支持 64 位通用寄存器、64位 SP(堆栈指针)和 64 位 PC (程序计数器),实现64位数据处理和拓展的虚拟地址。不管是 64 位 A64 还是 32 位的 A32 指令集,指令长度都为32位(4字节)。程序员角度来看仅为寄存器的位数不同。
AArch64、AArch32执行状态均支持SIMD(Singe Instruction Multipul Date,单指令流多数据流) 和浮点运算指令。且增强的SIMD指令和浮点运算指令均可以在**SIMD和浮点寄存器(SIMD&FP Register)**上操作。
在AArch32执行状态下,基本指令集(Base Instruction Set,除了增强的SIMD指令和浮点运算指令的指令构成的集合)中的SIMD指令可以在32位通用寄存器上操作。
AArch64 执行状态是 ARMv8-A 架构中引入的一种 64 位执行状态。它为 ARM 处理器提供了更高的性能和更好的代码密度。
在 AArch64 执行状态下,ARMv8-A 处理器可以使用 64 位指令集,这些指令集包括更多的寄存器、更丰富的操作数类型以及更复杂的指令流水线。与以前的 32 位 ARM 执行状态(AArch32)相比,AArch64 具有以下特点:
1. 64 位寻址和数据处理:AArch64 执行状态支持 64 位寻址和数据处理能力,可以处理更大的地址空间和更大的数据。
2. 更多的通用寄存器:AArch64 提供了更多的通用寄存器,从 16 个增加到 31 个,这样可以提供更多的寄存器用于保存临时变量和计算结果,减少了内存访问次数,提高了性能。
3. 扩展指令集:AArch64 引入了新的指令集扩展,如 SIMD(Single Instruction, Multiple Data)和浮点指令集扩展,提供了更高效的并行计算能力和更强大的浮点运算能力。
4. 更好的代码密度:AArch64 的指令编码更为紧凑,能够在相同的指令数量下执行更多的操作,从而提高了代码密度,减少了存储空间的占用。
AArch64 执行状态在 ARMv8-A 架构中的引入使得 ARM 处理器能够处理更加复杂和计算密集的任务,提供了更高的性能和能效,并且保持了与之前 32 位 ARM 应用程序的兼容性。这使得 ARMv8-A 处理器在各种领域,如移动设备、服务器、物联网等都得到了广泛应用。
AArch32 执行状态是 ARMv8-A 架构中的一种 32 位执行状态。它是 ARMv8-A 架构为了向后兼容性而保留的旧的 32 位执行状态。
在 AArch32 执行状态下,ARMv8-A 处理器可以运行使用 32 位指令集的应用程序,并且保持与之前的 ARMv7-A 架构的兼容性。AArch32 执行状态具有以下特点:
1. 32 位寻址和数据处理:AArch32 执行状态使用 32 位地址和数据处理方式,与之前的 ARMv7-A 架构相同。它可以处理较小的地址空间和较小的数据类型。
2. 通用寄存器和指令集:AArch32 执行状态提供了 16 个通用寄存器,每个寄存器都是 32 位宽度。指令集包括 ARM 和 Thumb-2 指令集,其中 Thumb-2 是一种指令集压缩技术,可以提高代码密度。
3. 兼容性:AArch32 执行状态兼容以前基于 ARMv7-A 架构的软件和操作系统。这意味着现有的 32 位 ARM 应用程序可以在 ARMv8-A 架构上继续运行,而无需进行重写或修改。
AArch32 执行状态主要用于运行旧有的 32 位 ARM 应用程序,以确保向后兼容性。虽然 ARMv8-A 架构引入了 AArch64 执行状态以支持更高性能的 64 位应用程序,但 AArch32 仍然是许多嵌入式系统和移动设备中广泛使用的执行状态。
ARMv8-A 架构支持的指令集包括以下几种:
A64(AArch64)指令集:这是 ARMv8-A 架构引入的 64 位指令集,也称为 AArch64 执行状态。A64 指令集提供了更高效的寻址和数据处理能力,更多的通用寄存器以及更丰富的操作数类型,支持更复杂的指令流水线和并行计算。
A32(AArch32)指令集:这是 ARMv8-A 架构中继承自 ARMv7-A 架构的 32 位指令集,也称为 AArch32 执行状态。A32 指令集兼容以前的 ARMv7-A 架构,并保持与之前的 32 位 ARM 应用程序的兼容性。
T32(Thumb-2)指令集:这是一种具有指令压缩技术的 16 位/32 位混合指令集。T32 指令集可以在较小的代码空间下执行更多指令,提高代码密度和存储空间利用率。Thumb-2 指令集被广泛用于嵌入式系统和移动设备。
除了上述指令集,ARMv8-A 架构还支持一些可选的指令集扩展,例如:
- NEON SIMD(Single Instruction, Multiple Data)指令集扩展:提供了并行计算能力,用于加速图形处理、媒体处理和信号处理等应用。
- FP(浮点)指令集扩展:提供了更强大的浮点运算能力,用于科学计算、图形渲染和数字信号处理等应用。
- Cryptography 指令集扩展:提供了硬件加速的密码学功能,包括对称加密、哈希函数和公钥加密算法等。
这些指令集扩展可以根据具体的 ARMv8-A 架构实现进行配置,以满足不同领域和应用的需求。
ARMv8-A支持的数据类型包括以下几种:
ARMv8-A架构支持不同的异常级别,这些级别在体系结构中被称为异常级别(Exception Levels,EL) 。数字越高,异常等级越高。具体的异常级别包括EL0、EL1、EL2和EL3 。
EL0是最低的异常级别,大多数应用代码运行在这个级别。操作系统运行在EL1,而hypervisor运行在EL2。EL3是底层固件和安全代码所保留的级别。
ARMv8-A还提供了两种安全状态:Secure(Secure World)和Non-Secure(Normal World)。这种设计使得一个操作系统可以和一个可信赖的操作系统同时运行在同一个硬件上,并对软件或硬件的攻击提供保护。
在Secure World 中,运行着Secure firmware和Trusted OS。这些组件提供安全的启动和执行环境,可以确保系统的可信性和安全性。
在Non-Secure World 中,运行着Guest OS和Hypervisor。Guest OS是通过虚拟化技术运行的,相互之间并不知道对方的存在。Hypervisor则负责管理和运行多个guest OS,每个OS在各自的世界中运行,并且Hypervisor也提供了对虚拟化的支持。
这种安全模型的设计提供了对系统安全性的保护,特别是在涉及到虚拟化、多操作系统和系统安全性的场景中。
ARMv8-A的虚拟化架构包括以下关键组件:
这些组件共同构成了ARMv8-A的虚拟化架构,为Hypervisor和客户操作系统的运行提供了硬件支持。
ARMv8-A架构支持两种调试类型:外部调试和self-hosted调试。在外部调试中,开发工具运行在主机上,而目标系统通过调试接口连接到主机。在self-hosted调试中,开发工具在目标系统上运行,不需要外部硬件。
ARMv8-A体系结构提供了一些调试特性,包括:
1. 侵入式和非侵入式调试:侵入式调试会暂停指令的执行,而让调试器检查和修改被调试系统的状态。非侵入式调试允许调试器在不停止目标系统的情况下访问和检查系统资源。
2. 硬件调试和软件调试:硬件调试通过特定的硬件接口进行调试操作,而软件调试通过运行在目标系统上的调试软件进行。
3. 断点和观察点:断点和观察点是常用的调试工具,它们允许开发人员在特定条件下暂停程序的执行,或者观察程序的运行状态。
总的来说,ARMv8-A的调试支持为开发人员提供了灵活和强大的工具,帮助他们进行应用程序的开发和调试。
ARMv8-A架构包含多个系统寄存器,这些寄存器被用于控制和监控系统的各种特性和状态。以下是一些ARMv8-A系统寄存器的概述:
这些系统寄存器通过指令或特定的硬件操作进行访问和控制,为开发人员提供了管理和监控系统运行状态的机制。
在AArch64架构下,通用寄存器是指用于存储操作数、计算结果和临时数据的寄存器。AArch64架构提供了31个通用寄存器,每个寄存器的大小为64位。
通用寄存器的命名方式为Xn
,其中n
表示寄存器的编号,范围从0到30。
下面是AArch64状态下的通用寄存器列表:
这些通用寄存器在程序中广泛用于存储、传递数据以及控制程序流程。需要注意的是,通用寄存器的使用需遵循架构规范,避免出现不合法、冲突的寄存器用法。
在AArch64执行状态下,处理状态PSTATE被用于控制处理器的操作模式和状态。PSTATE寄存器包含多个位字段,每个位字段对应于特定的状态标志或控制信号。
PSTATE的位结构如下:
PSTATE = (SPSel | DAIFSet | DAIFClr | ATS | SPAnded | nSX投 | nA Flag | nF Flag | nZ Flag | nC Flag)
其中,每个字段的含义如下:
PSTATE寄存器中的这些位字段提供了对处理器操作模式的控制和异常处理机制的监控。通过设置或清除这些位字段,可以控制处理器的行为和操作模式。
在AArch64架构下,**特殊功能寄存器(Special Purpose Registers)**是用于控制和管理系统的寄存器。这些寄存器承担着特定的功能,例如处理器状态、异常处理、存储器管理、定时器等。
以下是AArch64执行状态下的一些常见特殊功能寄存器:
CPSR (Current Program Status Register): 当前程序状态寄存器,用于存储当前执行状态的标志位,如条件标志位、执行模式等。
SPSR (Saved Program Status Register): 保存程序状态寄存器,用于在发生异常时保存先前的程序状态。
ELR_ELx (Exception Link Register): 异常链接寄存器,用于保存异常返回地址,在异常处理程序完成后恢复执行。
TTBRx (Translation Table Base Register): 用于存储虚拟地址到物理地址的转换表基址。
TCR (Translation Control Register): 用于设置和控制内存访问的转换和保护属性。
SP_ELx (Stack Pointer Exception Level): 用于存储不同异常级别下的栈指针。
CNTPCT (Counter-timer Physical Count Register): 物理计数器寄存器,用于实现计时和定时器功能。
CNTP_TVAL (Counter-timer Timer Value Register): 定时器值寄存器,用于设置定时器的初始值。
CNTP_CTL (Counter-timer Control Register): 计时器控制寄存器,用于控制计时器的启动、停止和中断。
这些特殊功能寄存器的具体作用和用法在ARM体系结构手册中有详细的说明。在编程和系统调试过程中,合理使用这些寄存器可以实现对系统的控制和管理。注意,在访问特殊功能寄存器时,需要遵循架构规范和特权级别的要求。
ARMv8-A架构具有丰富的异常和中断处理机制,用于响应和处理系统发生的异常和中断事件。以下是ARMv8-A架构中异常和中断的一般概述:
异常(Exceptions):
- 异常是指在程序执行过程中发生的非预期事件,例如访问未授权的内存、除零错误等。
- ARMv8-A架构定义了几种不同类型的异常,包括中断、陷阱、故障和系统调用等。
- 异常处理是通过保存当前执行状态并切换到异常处理程序来进行的。
中断(Interrupts):
- 中断是由外部设备发出的信号,用于通知CPU需要处理某个事件,例如定时器中断、外部设备请求等。
- ARMv8-A架构支持多种类型的中断,如外部中断、软件中断等。
- 中断处理是通过保存当前执行状态并切换到中断处理程序来进行的。
在ARMv8-A架构中,异常和中断的处理涉及到以下关键组件和机制:
- 异常向量表(Exception Vector Table):存储异常和中断处理程序的入口地址。
- 异常模式(Exception Modes):用于确定异常处理程序的运行环境,如处理器状态、特权级别等。
- 异常处理程序(Exception Handling):负责处理异常和中断事件,并进行适当的处理和响应。
- 异常处理器(Exception Handler):在异常发生时,负责切换到适当的异常处理程序,并保存或恢复相关状态。
ARMv8-A架构通过这些组件和机制,提供了强大的异常和中断处理能力,使得系统能够灵活地响应各种异常与中断事件,并保证数据的完整性和系统的可靠性。
ARMv8-A架构的内存模型包括多种类型的内存访问和组织方式,以下是一些关键概念:
这些概念共同构成了ARMv8-A架构的内存模型,用于管理和控制对内存的访问,确保数据的一致性和安全性。
ARMv8-A架构的系统存储管理单元(System Memory Management Unit,SMMU) 是一种存储器管理单元,它控制着内存的访问和转换。
SMMU在处理器和内存之间插入了一个转换层,使得从处理器发出的虚拟地址可以被转换为物理地址。这样,多个进程可以同时访问物理内存,而不会发生地址冲突。
SMMU还提供了其他一些功能,如内存访问权限控制、缓存和TLB管理等。这些功能可以保护系统的内存安全,并提高内存访问效率。
在ARMv8-A架构中,SMMU是可选的,但推荐使用。SMMU通常被用于操作系统内核中,以便更好地管理内存访问。
ARMv8-A架构具备一些特性,使其在服务器领域得到广泛应用。以下是ARMv8-A架构的一些服务器特性:
1. 多核处理器:ARMv8-A架构支持多核处理器,这对于运行并发工作负载和提高服务器整体性能非常重要。 2. 虚拟化支持:ARMv8-A架构提供硬件虚拟化扩展,如Virtualization Host Extensions(VHE)和Nested Virtualization。这些功能使ARMv8-A服务器能够同时运行多个虚拟机实例,实现更高的资源利用率和灵活的虚拟化部署。 3. 安全扩展:ARMv8-A架构引入了TrustZone技术,该技术通过硬件支持创建安全区域,以隔离敏感数据和保护系统免受恶意攻击。这对于服务器中处理敏感数据的场景非常重要。 4. 64位寻址和大内存支持:ARMv8-A架构支持64位寻址,使服务器能够访问更大的物理和虚拟内存空间。这对于处理大规模数据和运行内存密集型应用程序非常重要。 5. 高性能计算:ARMv8-A架构在服务器领域也取得了显著进展,通过提供高性能的处理器核心设计、大型缓存以及高带宽的内存接口,使得ARMv8-A服务器能够处理各种计算密集型工作负载。 6. 能耗效率:ARMv8-A架构在能耗效率方面表现出色,这对于数据中心和云计算环境非常重要。低能耗的设计使得ARMv8-A服务器能够降低功耗成本,并减少对散热和能源消耗的需求。
总而言之,ARMv8-A架构的服务器特性包括多核处理器、虚拟化支持、安全扩展、64位寻址和大内存支持、高性能计算以及能耗效率。这些特性使得ARMv8-A架构成为构建高效、灵活和安全的服务器解决方案的理想选择。
ARMv8-A的服务器架构标准化主要由ARM和其他相关组织共同推动和定义。以下是与ARMv8-A服务器架构标准化相关的一些重要组织和标准:
1. ARM:作为ARMv8-A架构的设计和拥有者,ARM在推动ARMv8-A服务器架构标准化方面起到了关键作用。ARM提供了广泛的技术支持和文档,帮助厂商和开发者实现符合ARMv8-A架构标准的服务器产品。
2. ARM Server Base System Architecture (SBSA):ARM SBSA是对基于ARMv8-A架构的服务器硬件和软件的标准化规范。该规范定义了服务器平台的基本要求,包括硬件配置、启动流程、操作系统接口等,以确保不同ARMv8-A服务器的兼容性和可移植性。
3. ARM Server Base Boot Requirements (SBBR):ARM SBBR是对基于ARMv8-A架构的服务器引导过程的标准化规范。该规范定义了服务器引导的基本要求,包括UEFI固件、ACPI、设备树等,以确保服务器引导过程的标准化和互操作性。
4. Linaro Enterprise Group (LEG):Linaro是一个由ARM及其合作伙伴组成的工程组织,致力于促进ARM架构的开源软件生态系统的发展。Linaro Enterprise Group专注于ARM服务器领域,推动ARMv8-A服务器的标准化和开源软件支持。
5. ServerReady:ServerReady是一个由软件和硬件厂商共同发起的倡议,旨在提供对符合ARMv8-A架构标准的服务器进行认证和验证的程序。通过ServerReady认证,厂商可以获得对其产品的认可,增强其市场竞争力。
这些组织和标准共同推动了ARMv8-A服务器架构的标准化工作,并为ARMv8-A架构的服务器产品提供了一致的硬件、软件和生态支持。这有助于提高ARMv8-A服务器的互操作性、可靠性和市场竞争力,并推动ARM架构在服务器领域的广泛应用。
ARMv8-A的RAS拓展和PMU拓展都是为了增强ARM处理器的功能和性能而设计的。
RAS扩展(RAS Extension) 是对ARMv8.2体系结构的强制扩展,也是对ARMv8.0和ARMv8.1体系结构的可选扩展。它主要被用于提高系统的可靠性、可用性和可服务性(RAS)。
RAS扩展提供了一组扩展寄存器,这些寄存器是ARMv8-A体系结构定义的一部分。通过这些寄存器,可以控制和监控系统的关键部分,如内存控制器和中断控制器。
在ARMv8-A中,可以使用一组特定的指令来访问RAS扩展寄存器。这些指令可以用于读取和修改扩展寄存器的值,从而控制系统的行为。
PMU扩展(Performance Monitoring Unit Extension) 是ARMv8-A体系结构的一部分,主要用于监控系统性能。
PMU扩展提供了一种方法来监控处理器和内存的性能指标,如指令执行数、缓存命中率等。通过这些指标,可以更好地理解系统的运行情况,并在必要时进行调整以提高性能。
PMU扩展提供了一组功能强大的寄存器,用于记录和监控系统性能。这些寄存器可以用于收集各种性能指标,并可以在运行时进行读取和修改。
在ARMv8-A中,可以使用一组特定的指令来访问PMU扩展寄存器。这些指令可以用于读取和修改寄存器的值,从而控制系统的性能监控功能。
参考: