摘要:主要包括ARMv8-A架构新增特性介绍
ARMv8是ARM公司发布的第一代支持64位处理器的指令集和体系结构。它在扩充64位寄存器的同时对上一代体系结构指令集兼容,因此它提供了运行32位和64位应用程序的环境。
ARMv8体系做了许多改变,处理处理器的性能有了较大提升之外,还引入了很多新特性。
下面介绍市面上常见的采用ARMv8体系结构的处理器(简称ARMv8处理器)内核。
例如常见Cotex-A53和Cotex-A57处理器内核比较。
Cortex-A53处理器是ARM公司第一批采用ARMv8体系结构的内核,是一种中端低功耗处理器。通常采用1~4个内核组成一个处理器簇(Cluster)或者和Cortex-A53、Cortex-A72等高性能处理器组成大小核体系结构,以实现最佳性能、可扩展性和能耗。
每个Cortex-A53内核都拥有一个1级缓存子系统、一个可选配的GICV3/V3接口和一个可选配的二级缓存控制器。Cortex-A53处理器是一款极为节能的处理器,能够支持32位和64位编码。
Cortex-A53具有以下特性:
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具有以下特性:
Cortex-A55 和Cortex-A75 是首批实现 DynamIQ 技术的Cortex-A 系列处理器。
Cortex-A55 采用最新的 ARMv8.2 架构,并在其前代产品 Cortex-A53的基础上打造而成。它在性能方面突破了极限,同时依旧保持了与 Cortex-A53 相同的功耗水平。
主要基于以下技术来实现性能的提升:
重头戏是能很好的支持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 技术相比,可大幅提升峰值性能、持续性能以及智能功能。
ARM处理器实现的是精简指令集体系结构。在ARMv8体系结构中,新出现了如下基本概念和定义。
在ARM公司的技术手册中定义,把处理器处理事务的过程抽象为处理机。
处理器运行的环境,包括寄存器位宽、支持的指令集、异常模型、内存管理以及编程模型等。
ARMv8定义了两个执行状态:
1. AArch64: 64位的执行状态。
2. AArch32: 32位的执行状态。
需要注意的是:
A64指令集和A32指令集是不兼容的,是两套完全不同的指令集。
A64指令集和A32指令集的宽度一样,都是32位,而不是64位。
在ARMv8中,程序总是运行在四种异常状态中的一种。
不用的特权级别如下所示:
通常一个软件只在一个特权级运行,例如应用程序、操作系统内核、虚拟化,但KVM之类的内核虚拟机监控程序,它会在EL1和EL2上运行。
ARMv8-A提供两种安全状态,安全和非安全。非安全状态也被称为正常世界。这使得操作系统可以和另一个trusted Os并行运行在同一个硬件上,并能针对某些软件、硬件入侵提供一定的保护。此技术可以支持系统被分割成安全世界和正常世界。就像ARMv7一样,安全监视器充当这个桥梁。
ARMv8-A还提供了对虚拟化的支持,它只允许在正常状态下。这意味着虚拟机监控程序或虚拟机管理器可以在系统上运行, 并可以管理多个os。这些os运行在虚拟机中,但这对于这些os来说是完全隔离的,os间并不知晓,对于os来说它并不能区分自己是运行在真实的硬件上还是虚拟机环境中。
正常世界(非安全世界)下具有以下同特权组件:
安全世界下具有以下特权组件:
在ARMv7体系结构中,处理器的模式可以在特权软件控制下更改(CPSR寄存器),也可以在发生异常时自动更改。当发生异常时,内核保存当前执行状态和返回地址,进入所需模式,并可能禁用硬件中断。
应用程序以最低特权级别PL0(以前的非特权模式)运行。操作系统在PL1上运行,系统中的虚拟化扩展在PL2上运行管理程序。安全监视器作为在安全和非安全(正常)世界之间移动的网关,也可以在PL1上运行。
在AArch64中,处理器模式映射到异常级别,如图3-6所示
与在ARMv7(AArch32)中一样,当发生异常时,处理器将更改为支持异常处理的异常级别(模式)
异常级别之间的切换遵循以下规则:
有时你必须更改系统的执行状态。例如,如果你正在运行64位操作系统,并且希望在EL0上运行32位应用程序,则可能会出现这种情况。为此,系统必须更改为AArch32。当应用程序完成或执行返回操作系统时,系统可以切换回AArch64。
AArch32操作系统无法加载64位应用程序。
要在同一异常级别的执行状态之间进行更改,必须切换到更高的异常级别,然后返回到原始异常级别。
例如,您可能有32位和64位应用程序在64位操作系统下运行。在这种情况下,32位应用程序可以执行并生成一条系统调用(SVC)指令,或接收一个中断,从而切换到EL1和AArch64。然后,操作系统可以执行任务切换并返回AArch64中的EL0。实际上,这意味着您不能混合使用32位和64位应用程序,因为它们之间没有直接的调用方式。您只能通过更改异常级别来更改执行状态。EL3处的代码无法将异常转移到更高的异常级别,因此无法更改执行状态,除非通过重置。
AArch64和AArch32执行状态之间更改时需要注意以下几点:
因此,这两种状态之间的转换是在安全监视器、虚拟机监控程序或操作系统级别执行的(特权级)。
在AArch64状态下执行的虚拟机监控程序或操作系统可以在较低的权限级别上支持AArch32操作。这意味着运行在AArch64中的操作系统可以同时承载AArch32和AArch64应用程序。类似地,AArch64虚拟机监控程序可以同时托管AArch32和AArch64 Guest Os,但AArch32不能支持64bit系统。
对于实现的最高异常级别(Cortex-A53和Cortex-A57处理器上的EL3),异常时异常级别使用的执行状态是固定的。只能通过重置处理器来更改异常级别。对于EL2和EL1,由系统寄存器控制,后面章节会介绍。