ARMv8是ARM公司发布的第一代支持64位处理器的指令集和体系结构。它在扩充64位寄存器的同时提供了对上一代体系结构指令集的兼容,因此它提供了运行32位和64位应用程序的环境。
ARMv8体系结构除了提高了处理能力,还引入了很多吸引人的新特性。
●具有超大物理地址(physical address)空间,提供超过4 GB物理内存的访问。
●具有64位宽的虚拟地址(virtual address)空间。32位宽的虚拟地址空间只能供4 GB大小的虚拟地址空间访问,这极大地限制了桌面操作系统和服务器等的应用。64位宽的虚拟地址空间可以提供更大的访问空间。
●提供31个64位宽的通用寄存器,可以减少对栈的访问,从而提高性能。
●提供16 KB和64 KB的页面,有助于降低TLB的未命中率(miss rate)。
●具有全新的异常处理模型,有助于降低操作系统和虚拟化的实现复杂度。
●具有全新的加载-获取指令(Load-Acquire Instruction)、存储-释放指令(Store-Release Instruction),专门为C++11、C11以及Java内存模型设计。
ARMv8体系结构一共有8个小版本,分别是ARMv8.0、ARMv8.1、ARMv8.2、ARMv8.3、ARMv8.4、ARMv8.5、ARMv8.6、ARMv8.7,每个小版本都对体系结构进行小幅度升级和优化,增加了一些新的特性。
下面介绍市面上常见的采用ARMv8体系结构的处理器(简称ARMv8处理器)内核。
● Cortex-A53处理器内核 :ARM公司第一批采用ARMv8体系结构的处理器内核,专门为低功耗设计的处理器。通常可以使用1~4个Cortex-A53处理器组成一个处理器簇或者和Cortex-A57/Cortex-A72等高性能处理器组成大/小核体系结构。
● Cortex-A57处理器内核 :采用64位ARMv8体系结构的处理器内核,而且通过AArch32执行状态,保持与ARMv7体系结构完全后向兼容。除ARMv8体系结构的优势之外,Cortex-A57还提高了单个时钟周期的性能,比高性能的Cortex-A15高出了20%~40%。它还改进了二级高速缓存的设计和内存系统的其他组件,极大地提高了性能。
● Cortex-A72处理器内核 :2015年年初正式发布的基于ARMv8体系结构并在Cortex-A57处理器上做了大量优化和改进的一款处理器内核。在相同的移动设备电池寿命限制下,Cortex-A72相对于基于Cortex-A15的设备具有3.5倍的性能提升,展现出了优异的整体功效。
ARM处理器实现的是精简指令集体系结构。在ARMv8体系结构中有如下一些基本概念和定义。
●处理机(Processing Element,PE):在ARM公司的官方技术手册中提到的一个概念,把处理器处理事务的过程抽象为处理机。
●执行状态(execution state):处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。ARMv8体系结构定义了两个执行状态。
○AArch64:64位的执行状态。
■提供31个64位的通用寄存器。
■提供64位的程序计数(Program Counter,PC)指针寄存器、栈指针(Stack Pointer,SP)寄存器以及异常链接寄存器(Exception Link Register,ELR)。
■提供A64指令集。
■定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。
■提供64位的内存模型。
■定义一组处理器状态(PSTATE)用来保存PE的状态。
○AArch32:32位的执行状态。
■提供13个32位的通用寄存器,再加上PC指针寄存器、SP寄存器、链接寄存器(Link Register,LR)。
■支持两套指令集,分别是A32和T32(Thumb指令集)指令集。
■支持ARMv7-A异常模型,基于PE模式并映射到ARMv8的异常模型中。
■提供32位的虚拟内存访问机制。
■定义一组PSTATE用来保存PE的状态。
●ARMv8指令集:ARMv8体系结构根据不同的执行状态提供不同指令集的支持。
○A64指令集:运行在AArch64状态下,提供64位指令集支持。
○A32指令集:运行在AArch32状态下,提供32位指令集支持。
○T32指令集:运行在AArch32状态下,提供16位和32位指令集支持。
●系统寄存器命名:在AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器。系统寄存器的使用方法如下。
<register_name>_Elx //最后一个字母 x 可以表示0、1、2、3
如SP_EL0表示在EL0下的SP寄存器,SP_EL1表示在EL1下的SP寄存器。
本书重点介绍ARMv8体系结构下的AArch64执行状态以及A64指令集,对AArch32执行状态、A32以及T32指令集不做过多介绍,感兴趣的读者可以阅读ARMv8相关技术手册。
指令集是处理器体系结构设计的重点之一。ARM公司定义与实现的指令集一直在变化和发展中。ARMv8体系结构最大的改变是增加了一个新的64位的指令集,这是早前ARM指令集的有益补充和增强。它可以处理64位宽的寄存器和数据并且使用64位的指针来访问内存。这个新的指令集称为A64指令集,运行在AArch64状态下。ARMv8兼容旧的32位指令集——A32指令集,它运行在AArch32状态下。
A64指令集和A32指令集是不兼容的,它们是两套完全不一样的指令集,它们的指令编码是不一样的。需要注意的是,A64指令集的指令宽度是32位,而不是64位。
ARMv8处理器支持两种执行状态——AArch64状态和AArch32状态。AArch64状态是ARMv8新增的64位执行状态,而AArch32是为了兼容ARMv7体系结构的32位执行状态。当处理器运行在AArch64状态下时,运行A64指令集;而当运行在AArch32状态下时,可以运行A32指令集或者T32指令集。
如图1.1所示,AArch64状态的异常等级(exception level)确定了处理器当前运行的特权级别,类似于ARMv7体系结构中的特权等级。
●EL0:用户特权,用于运行普通用户程序。
●EL1:系统特权,通常用于操作系统内核。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。
●EL2:运行虚拟化扩展的虚拟机监控器(hypervisor)。
●EL3:运行安全世界中的安全监控器(secure monitor)。
▲图1.1 AArch64状态的异常等级
ARMv8体系结构允许切换应用程序的运行模式。如在一个运行64位操作系统的ARMv8处理器中,我们可以同时运行A64指令集的应用程序和A32指令集的应用程序,但是在一个运行32位操作系统的ARMv8处理器中就不能运行A64指令集的应用程序了。当需要运行A32指令集的应用程序时,需要通过一条管理员调用(Supervisor Call,SVC)指令切换到EL1,操作系统会做任务的切换并且返回AArch32的EL0,从而为这个应用程序准备好AArch32状态的运行环境。
ARMv8支持如下几种数据宽度。
●字节(byte):8位。
●半字(halfword):16位。
●字(word):32位。
●双字(doubleword):64位。
●四字(quadword):128位。