1 ARM64的历史

早在2007年,ARM公司已经开始了64位架构的研发;2011年ARM官方公布了第一套64位处理器架构“ARMv8”,并于当年11月签署了第一份授权协议。2012年10月,ARM公司发布了第一款基于64位架构的处理器核心“Cortex-A50”系列,该系列首批包括Cortex-A57和Cortex-A53两款型号,而这两款可以单独工作,也可以以big.LITTLE的形式协同工作。今年2月,ARM公司又发布了Cortex-A57的升级型号Cortex-A72,性能再次提升接近1倍,同样可以与Cortex-A53搭配形成big.LITTLE双架构组合。

在ARM公司提出64位处理器战略之初,各方人士均预测ARM准备抢占Intel的服务器市场,但随着智能终端设备的高速发展,ARM64却成为了高性能智能设备的主流选择,包括苹果与绝大多数Android设备厂商。目前为止,智能手机处理器前十大厂商已经全部购买ARM64授权,并且Intel开始代工生产ARM64芯片。可以预见,未来的智能终端一定是ARM64的天下。

当然,并不排除ARM64与Intel抢占服务器市场的可能性,尤其是“微服务器”市场。ARM64在注重功耗、网络能力的“微服务器”市场具有一定优势,DELL等厂商已经推出了基于ARM64的微型服务器。

2 ARM64的优势

首次实现ARM64的ARMv8-A架构在功能和性能上都有着32位ARM(ARMv7及更早)无可比拟的优势,同时ARMv8完全兼容32位的ARMv7。

从上图可以看出,基于ARMv8的Cortex-A53最高性能可以达到A7的1.7倍,Cortex-A53可以达到A15的近2倍。即使是运行原来相同的32位程序,ARM64处理器也远超过之前的32位处理器。

性能提升的同时,功耗并没有增加,反而有一定下降,如下图所示

3 ARM64新增特性

ARMv8引入了64位架构,新增64位指令集,完全兼容ARMv7架构,同时对原有的功能进行了改进。

3.1 新增A64指令集

ARM64引入“Execution State”的概念,用以区分64位架构模式和兼容的32位架构模式,分别是AArch64和AArch32两种模式。其中AArch64模式可以执行64位指令集A64,AArch32模式可以执行32位指令集A32和T32。

A32(或ARM):32位固定长度指令集,通过不同架构变体增强部分32位架构执行环境现在称为AArch32。

T32 (Thumb) 是以16位固定长度指令集的形式引入的,随后在引入Thumb-2技术时增强为16位和32位混合长度指令集。

A64:提供与ARM和Thumb指令集类似功能的32位固定长度指令集。随ARMv8-A一起引入,它是一种AArch64指令集。

A64是一种支持AArch64执行状态的全新32位固定长度指令集,主要有以下特点:

基于5位寄存器说明符的简洁解码表

指令语义与AArch32中大致相同

31个随时可供访问的通用64位寄存器

无模式GP寄存器组 – 改进的性能和能耗

程序计数器(PC)和堆栈指针(SP)非通用寄存器

可用于大多数指令的专用零寄存器

A64与A32的主要差异有:

支持 64 位操作数的新指令 大多数指令可具有 32 位或 64 位参数

地址假定为 64 位大小L P64和LLP64是主要目标数据模型

条件指令远少于 AArch32 条件 {跳转、比较、选择}

无任意长度的加载/存储多重指令 增加了用于处理寄存器对的 LD/ST ‘P’

3.2 增强的SIMD和浮点指令集

A64 高级 SIMD 和标量浮点支持在语义上类似于 A32 支持;它们共享浮点/向量寄存器文件(V0 至 V31)。A64 提供了 3 项主要功能增强:

更多 128 位寄存器:32 x 128 位宽寄存器;可视为 64 位宽寄存器

高级 SIMD 支持 DP 浮点执行

高级 SIMD 支持完全 IEEE 754 执行;舍入模式、非规范化数字、NaN 处理

有一些针对 IEEE754-2008 的附加浮点指令:

MaxNum/MinNum 指令

使用 RoundTiesAway 的浮点到整数转换

A64 中的寄存器封装模型也不同于 A32,所有向量寄存器均为 128 位宽,Vx[127:0]:

双精度标量浮点使用 Vx[63:0]

单精度标量浮点使用 Vx[31:0]

3.3 指令级支持加解密算法

支持AES。2个加密和2个解密指令。基于增强的SIMD 128位寄存器,2条加密/解密指令完成一轮AES算法。

支持SHA-1 and SHA-256。哈希算法持续在2个128位寄存器中进行,1条指令完成4个字的数据哈希,key的生成也可以通过指令加速。

Linux内核技术交流群: 【977878001】进群免费领取 内核资料包↓(含视频教程、电子书、实战项目及代码)

3.4 处理器特权级别模型Exception Level

与以往的处理器模式和特权级别定义不同,ARM64定义了EL0~EL3四个特权等级,级别从低到高。一个典型的应用如下图所示:

不同EL级别之间的转换必须遵循以下准则:

在AArch64模式下,EL转换只会发生在异常发生或者异常返回时;

异常发生时,EL级别只能提升或者保持不变;

异常返回时,EL级别只能下降或者保持不变;

EL转换的目标级别成为“目标异常级别”,只能由异常自身特征或者配置系统控制寄存器决定;

目标异常级别不能是EL0;

不同的EL级别访问的保留寄存器不同:

3.5 MMU 支持AArch64 模式

在AArch64模式下,处理能够访问更大范围的地址空间,不再仅仅是2^32B,地址可以用64位表示,但其中有效位是48位。也就是可以访问256T字节范围的物理地址。

在不同的EL级别下,MMU使用的地址转换机制不同,进而使用的地址转换控制寄存器也不同。MMU最关键的寄存器是TTBR(Translation Table Base Register)和TCR(Translation Control Register)

在EL1,根据TCR配置的不同,MMU访问的地址范围也有所不同,使用不同的基址寄存器进行地址转换。通常情况下,用户程序使用TTBR0,内核空间使用TTBR1。如下图:

AArch64模式有3个不同的地址转换粒度,4KB、16KB和64KB,不同的粒度大小定义了不同的内存页大小和各级页表大小:

以4K页和64K页为例,在这两种粒度下的虚拟地址使用方式如下: