ARMv8‑A 架构和处理器

摘要:主要包括ARMv8-A架构新增特性介绍


1. ARMv8体系结构特性

ARMv8是ARM公司发布的第一代支持64位处理器的指令集和体系结构。它在扩充64位寄存器的同时对上一代体系结构指令集兼容,因此它提供了运行32位和64位应用程序的环境。


ARMv8体系做了许多改变,处理处理器的性能有了较大提升之外,还引入了很多新特性。

  • 超大物理地址空间。使处理器能够访问超过4GB的物理内存。
  • 64位的虚拟地址空间。这将使虚拟内存超过4GB限制,在桌面应用和服务器中是重要的提升。
  • 通用寄存器增多。提供了31个64位的通用寄存器,可以减少栈的使用(函数传参可使用8个寄存器),从而提升性能。
  • 新增16KB和64KB的页面。有助于降低转换表(TLB)的未命中率和深度。
  • 基于PC指针的相对寻址范围加大。支持+/-4GB的寻址范围,提高内存空间访问效率。
  • 信号事件自动化。有助于实现实现低功耗、高性能的自旋锁。
  • 全新异常模式。降低了操作系统和虚拟机监控程序软件的复杂性。
  • 高效的缓存管理。用户空间缓存操作提高了动态代码生成效率。提供快速清除data cache的指令。
  • 高速硬件加密。比软件加密性能高3~10倍。对于小粒度的加解密很高效,例如http加载和发布:为C++11、C11、Java内存模型设计。使用消除显式内存屏障指令保证线程安全。
  • NEON双精度浮点高级SIMD。这使得SIMD矢量化能够应用于更广泛的算法集,例如,科学计算、高性能计算(HPC)和超级计算机。

2.使用ARMv8体系结构的常见处理器内核

下面介绍市面上常见的采用ARMv8体系结构的处理器(简称ARMv8处理器)内核。

例如常见Cotex-A53和Cotex-A57处理器内核比较。

2.1 Cortex-A53 处理器内核

Cortex-A53处理器是ARM公司第一批采用ARMv8体系结构的内核,是一种中端低功耗处理器。通常采用1~4个内核组成一个处理器簇(Cluster)或者和Cortex-A53、Cortex-A72等高性能处理器组成大小核体系结构,以实现最佳性能、可扩展性和能耗。

每个Cortex-A53内核都拥有一个1级缓存子系统、一个可选配的GICV3/V3接口和一个可选配的二级缓存控制器。Cortex-A53处理器是一款极为节能的处理器,能够支持32位和64位编码。

Cortex-A53具有以下特性:

  • 支持8级流程线。
  • 采用门时钟、能量域和高级的保持模式来达到较低的功耗。
  • 通过重复执行资源和双指令解码器提高并行能力。
  • 二级缓存的最有电源设计方案降低了系统延迟并均衡了对性能的影响。

2.2 Cortex-A57 处理器内核

Cortex-A57处理器完全实现了ARMv8-A体系结构,可以通过AArch32执行状态保持与ARMv7体系结构完全向后兼容。

它支持多核操作,在单个集群内进行一到四个核的多处理,通过AMBA 5 CHI或AMBA 4 ACE技术,可以实现多个一致的SMP集群。Cortex-A57处理器具有与其他处理器的高速缓存操作的一致性,包括ARM旗下的GPU产品。它可以与Cortex-A53处理器一起使用,通过配置以大小核的形式以达到可扩展的性能和更高效能耗。可通过CoreSight技术进行调试和跟踪。

Cortex-A57处理器面向移动和企业计算应用,包括计算密集型64位应用。

Cortex-A57具有以下特性:

  • 无序的15+级流水线。
  • 节能功能包括分支预测、减少标记和抑制缓存查找。
  • 通过复制执行资源提高了峰值指令吞吐量,采用本地解码和3-wide带宽解码方式保证解码的能耗最优性。
  • 高性能的二级缓存设置,让多个内核可同时访问二级缓存区域。

2.3 Cortex-A55 处理器内核

Cortex-A55 和Cortex-A75 是首批实现 DynamIQ 技术的Cortex-A 系列处理器。

Cortex-A55 采用最新的 ARMv8.2 架构,并在其前代产品 Cortex-A53的基础上打造而成。它在性能方面突破了极限,同时依旧保持了与 Cortex-A53 相同的功耗水平。

主要基于以下技术来实现性能的提升:

  1. 优化分支预测。融入了神经网络元素来改进预测, 同时还新增了零周期分支预测程序。这样可以使指令之间的空闲时间越来越短。
  2. 每个核心拥有独立的二级高速缓。
    3 推出了三级高速缓存,可供集群内的所有 Cortex-A55 CPU 共享。
    这让 DynamIQ 集群能够得益于 CPU 附近增多的内存容量,从而提升性能、降低系统功率。三级高速缓存是 DynamIQ 共享单元 (DSU) 的一部分,DSU 是 DynamIQ 处理器中的一个新的功能单元。
  3. NEON 和 FP 单元的改进, NEON 流水线中增添了新的架构指令。


重头戏是能很好的支持DynamIQ big.LITTLE芯片架构。DynamIQ big.LITTLE 是 DynamIQ 系统的新一代异构计算技术。

利用 Cortex-A75 “大” CPU 和 Cortex-A55 “小” CPU 打造出充分集成的解决方案,大小 CPU 在物理上位于单一 CPU 集群中。所有的软件线程迁移和由此造成的大小 CPU 之间的高速缓存窥探(cache snoop)现在均发生在该集群内。

与 Cortex-A73 相比,Cortex-A5 CPU 可以用于频率更高的使用场合,同时利用Cortex-A55 依旧保持持续的 DVFS 曲线。这是 big.LITTLE 系统的一项重要设计要求。这些特性合在一起,与上一代 big.LITTLE 技术相比,可大幅提升峰值性能、持续性能以及智能功能。

3. ARMv8体系结构中的基本概念

ARM处理器实现的是精简指令集体系结构。在ARMv8体系结构中,新出现了如下基本概念和定义。

3.1 处理机(Processing Element, PE)

在ARM公司的技术手册中定义,把处理器处理事务的过程抽象为处理机。

3.2 执行状态(Execution State)

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

ARMv8定义了两个执行状态:
1. AArch64: 64位的执行状态

  • 提供31个64位通用寄存器。
  • 提供64位程序计数(PC)指针寄存器、栈指针(SP)寄存器、异常链接寄存器(ELR)。
  • 提供A64指令集。
  • 定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。
  • 提供64位内存模型。
  • 定义一组处理器状态(PSTATE)用来包存PE的状态。、

2. AArch32: 32位的执行状态。

  • 提供13个32位通用寄存器再加上32位程序计数(PC)指针寄存器、栈指针(SP)寄存器、链接寄存器(LR)。
  • 支持两套指令集:A32和T32(Thumb)指令集。
  • 支持ARMv7-A异常模型。基于PE模式并映射到ARMv8的异常模型中。
  • 提供32位的虚拟内存访问机制。
  • 定义一组PSTATE用来保存PE的状态。

3.3 ARMv8指令集

  1. A64指令集:运行在AArch64状态下,提供64位指令集支持。
  2. A32指令集:运行在AArch32状态下,提供32位指令集支持。
  3. T32指令集:运行在AArch32状态下,提供16位和32位指令集支持。

需要注意的是:

  • A64指令集和A32指令集是不兼容的,是两套完全不同的指令集。
  • A64指令集和A32指令集的宽度一样,都是32位,而不是64位。

3.4 异常级别

在ARMv8中,程序总是运行在四种异常状态中的一种。

  • 在AArch64中,异常级别决定特权级别,与ARMv7中定义的特权级别类似。
  • 异常级别决定特权级别,例如ELn对应PLn。n越大则特权等级越高。
  • 在所有ARMv8架构中,特权等级的不同有着不同的操作权限,它类似于计算机中常见保护域的概念。

不用的特权级别如下所示:

  • EL0 应用程序
  • EL1 操作系统内核
  • EL2 虚拟化
  • EL3 低级固件,包含安全监控等

通常一个软件只在一个特权级运行,例如应用程序、操作系统内核、虚拟化,但KVM之类的内核虚拟机监控程序,它会在EL1和EL2上运行。

3.5 安全状态

ARMv8-A提供两种安全状态,安全和非安全。非安全状态也被称为正常世界。这使得操作系统可以和另一个trusted Os并行运行在同一个硬件上,并能针对某些软件、硬件入侵提供一定的保护。此技术可以支持系统被分割成安全世界和正常世界。就像ARMv7一样,安全监视器充当这个桥梁。

ARMv8-A还提供了对虚拟化的支持,它只允许在正常状态下。这意味着虚拟机监控程序或虚拟机管理器可以在系统上运行, 并可以管理多个os。这些os运行在虚拟机中,但这对于这些os来说是完全隔离的,os间并不知晓,对于os来说它并不能区分自己是运行在真实的硬件上还是虚拟机环境中。

正常世界(非安全世界)下具有以下同特权组件:

  • guest os 内核:这些内核包括在非安全EL1中运行的Linux或Windows或vxworks等支持虚拟化的os。
  • 虚拟化:这是运行在EL2上的非安全区域,给os提供虚拟服务(如Qemu, Jailhouse等虚虚拟机管理程序)。

安全世界下具有以下特权组件:

  • 安全固件:在应用程序处理器上,这个固件必须是在启动时运行的第一步。它提供多种服务,包括平台初始化、初始化trusted Os、启动安全监控。
  • Trusted OS:为正常状态提供安全服务,并为执行安全或可信应用程序提供运行时环境。

4.切换异常等级

在ARMv7体系结构中,处理器的模式可以在特权软件控制下更改(CPSR寄存器),也可以在发生异常时自动更改。当发生异常时,内核保存当前执行状态和返回地址,进入所需模式,并可能禁用硬件中断。
应用程序以最低特权级别PL0(以前的非特权模式)运行。操作系统在PL1上运行,系统中的虚拟化扩展在PL2上运行管理程序。安全监视器作为在安全和非安全(正常)世界之间移动的网关,也可以在PL1上运行。

在AArch64中,处理器模式映射到异常级别,如图3-6所示
与在ARMv7(AArch32)中一样,当发生异常时,处理器将更改为支持异常处理的异常级别(模式)

异常级别之间的切换遵循以下规则:

  1. 切换到更高的异常级别,例如从EL0到EL1,表示软件执行权限增加
  2. 异常不能被切换到较低的异常级别
  3. EL0级别没有异常处理,除非在高级的异常等级中需要处理
  4. 异常会打破正常的程序流程,高于EL0的异常程序的执行入口是定义的异常向量表。异常包含如下情况:
  • IRQ或FIQ中断
  • 内存异常
  • 未定义的指令
  • 系统调用。允许用户对操作系统进行系统调用。
  • 安全监视器或陷入虚拟机监控程序
  1. 通过执行ERET指令来结束异常处理并返回到上一个异常级别
  2. 从异常返回可以保持在相同的异常级别,也可以输入较低的异常级别。无法切换到更高的异常级别
  3. 安全状态会随着异常级别的变化而变化,从EL3重新调用到非安全状态时除外。

5. 切换执行状态

有时你必须更改系统的执行状态。例如,如果你正在运行64位操作系统,并且希望在EL0上运行32位应用程序,则可能会出现这种情况。为此,系统必须更改为AArch32。当应用程序完成或执行返回操作系统时,系统可以切换回AArch64。

  • AArch32操作系统无法加载64位应用程序。
  • 要在同一异常级别的执行状态之间进行更改,必须切换到更高的异常级别,然后返回到原始异常级别。例如,您可能有32位和64位应用程序在64位操作系统下运行。在这种情况下,32位应用程序可以执行并生成一条系统调用(SVC)指令,或接收一个中断,从而切换到EL1和AArch64。然后,操作系统可以执行任务切换并返回AArch64中的EL0。实际上,这意味着您不能混合使用32位和64位应用程序,因为它们之间没有直接的调用方式。您只能通过更改异常级别来更改执行状态。
  • EL3处的代码无法将异常转移到更高的异常级别,因此无法更改执行状态,除非通过重置。

AArch64和AArch32执行状态之间更改时需要注意以下几点:

  1. AArch64和AArch32执行状态都具有通常相似的异常级别,但安全操作和非安全操作之间存在一些差异。
  2. 更改为AArch32需要从较高的异常级别转到较低的异常级别。这是通过执行ERET指令退出异常处理程序的结果。
  3. 如果在获取异常或从异常返回时,异常级别保持不变,执行状态无法更改。
  4. 当ARMv8处理器在特定异常级别的AArch32执行状态下运行时,它使用与ARMv7中相同的异常模型处理该异常级别的异常。在AArch64执行状态下,它使用异常处理模型见第AArch64异常处理章节。

因此,这两种状态之间的转换是在安全监视器、虚拟机监控程序或操作系统级别执行的(特权级)。

在AArch64状态下执行的虚拟机监控程序或操作系统可以在较低的权限级别上支持AArch32操作。这意味着运行在AArch64中的操作系统可以同时承载AArch32和AArch64应用程序。类似地,AArch64虚拟机监控程序可以同时托管AArch32和AArch64 Guest Os,但AArch32不能支持64bit系统。

对于实现的最高异常级别(Cortex-A53和Cortex-A57处理器上的EL3),异常时异常级别使用的执行状态是固定的。只能通过重置处理器来更改异常级别。对于EL2和EL1,由系统寄存器控制,后面章节会介绍。