64位ARM处理器(AArch64)意味着什么
2014-10-06 20:32:13 阿炯

64位计算的历史相当丰富有趣。Cray等公司在70年代就已经开始在自己的系统当中使用64位寄存器,但真正纯粹的64位计算直到90年代才真正到来。首先是MIPS的R4000,然后是DEC的Alpha处理器。到90年代中期,英特尔和Sun都已经拥有64位设计。而对于消费者来说,真正的转折点是 AMD在2003年发布了一款兼容英特尔32位x86处理器的64位PC处理器。


再向前快进10年,PC销量不断下滑,大部分智能手机和平板电脑都拥有了主频在1-2GHz之间的多核心处理器。但它们使用的都是32位架构,而非现代PC 和服务器所使用的64位架构。到现在为止,这都是可以接受的。智能手机并不会去和PC拼性能,这些处理器需要足够节能,以实现续航的最大化。

但是,随着设备的发展和新技术——语音识别、3D游戏和高分辨率显示屏——逐渐普及,32位处理器的能力已经渐渐被推到了极限。


ARM 看到了64位节能处理器的需求,并在正式发布ARMv8-A架构(首个包含64位指令集的ARM架构)之前就早早开始了新设计的开发,还从其他选择发展 64位技术的芯片设计厂商那里学习到了经验和教训。ARM的新款64位架构具备对于旗下32位架构的全面兼容,这意味着如果处理器运行于64位系统,它就 可以运行未修改的ARMv7 32位二进制文件。对于Android来说,这意味着一旦内核被移植到64位(多亏了Linaro,它们已经如此了),系统的其余部分,从核心库到应用再 到游戏,都是可以在32位或64位之间进行切换的。

去年,苹果凭借着iPhone 5s的全新64位A7处理器震惊了整个移动领域。A7采用了苹果设计的ARMv8双核处理器,名为Cyclone。它使用了两个64KB L1缓存(供两个核心分别使用),一个1MB L2缓存(被两个核心所分享)和一个4MB L3缓存(为整个SoC所用)。苹果拥有ARM架构授权,这意味着它可以从头开始设计自己的处理器,但前提是这些处理器必须是ARM兼容的。ARM拥有一套测试套件,用以检查这些处理器是否具备兼容性。

在未来几个月里,我们将会看到高通、联发科和三星纷纷推出自己的64位ARM处理器。再考虑到Android在64位化的努力,用不了多久我们就将看到运行于64位Android系统的64位设备了。但对于开发者和终端用户来说,64位处理器意味着什么呢?

受益于ARM的64位架构


每一部CPU的中心都是一套寄存器,他们都是用以存储数字和地址的内部存储插槽。当执行复杂任务时,这些插槽会被反复使用。如果所有的寄存器都处于占用状态,那么处理的唯一方式是将其中一个寄存器存储在内存当中,使用寄存器进行下一个任务,然后再从内存当中重新载入之前的值。对于人类来说,这一切都发生在一瞬间。但对于处理器来说,这实际上是一个非常耗时的顺序,并不十分效率。

32位ARMv7架构拥有15个通用的寄存器,每一个都有32位 宽。而ARMv8架构拥有31个通用寄存器,每一个为64位宽。这就意味着优化代码使用内部寄存器的频率应该要比内存更高,同时也可以保留更大的数字和地 址。结果就是,ARM的64位处理器在运行速度上会更快一些。在能效上,64位寄存器的使用并不会提升功耗。在某些情况下,64位核心执行部分任务的速度会更快一些,由于运行时间的减少,这也就会使其显得比32位核心更加节能。

寻址(Addressing)是64位处理器的另一个层面。在PC和服务器领域,32位的局限主要在可访问的内存上。如果你想要使用超过4GB的内存,就需 要使用64位处理器。因为可以使用大物理地址拓展(LPAE),某些ARMv7处理器能够使用超过4GB内存,所以严格来讲,内存的限制并不是ARM处理 器所遭遇的问题。由于LPAE的存在,Cortex-A15处理器能够处理1024GB内存,而64位的处理能力更是高达200万TB。因此在短时间内, 任何一部智能手机都不需要完整的64位寻址。追求永远都不会被用到的寻址空间是毫无意义的,因此ARMv8架构采用了48位寻址,这已经是256TB了。

虽然没有什么程序或游戏会用到TB级别的内存,但在另一方面,这种寻址能力又非常重要。现代3D游戏通常都带有大量的资源,当拥有超过4GB的可访问空间时,这些资源能够被更加轻松地进行内存映射。这样一来,游戏的运行速度会得到提升,并让直接访问游戏多媒体资源成为可能。

不只是智能手机和平板

ARM 上64位计算的好处并不仅限于智能手机和平板电脑。ARM的生态系统很广阔,他们的处理器也被许多不同类型的设备所使用。服务器市场是ARM处理器影响力 有限的一个领域。信息时代的发展让维持数据中心所消耗的能源持续快速增长,而任何能够降低能源使用的技术都是对于资金和自然资源的节省。除了节能之外,在 服务器当中使用64位ARM芯片还有其他的好处。这些服务器都会被动散热,这意味着你可以将它们集中在一起,而无需担心会发生过热的情况。这样一来,用于 散热上的花费也将有所降低。

至于服务器软件,Linux这样的操作系统已经是64位的了,其主线内核当中也已经加入了对于ARMv8的支持。这也就是说,制作运行于64位Linux、ARM处理器的服务器并不会很困难。

小结

多亏了ARM,64位的移动计算时代就要到来了。这些新的处理器不仅速度更快,还为移动平台开启了更多的可能性。从32位向64位的迁移道路已经被铺就,无论是什么操作系统,开发者从32位进入64位都不会有任何意外。在未来一段时间里,ARM的合作伙伴都将推出Cortex-A53和Cortex-A57处理器。当中有的会采用双核或四核的标准配置,也有的会选择big.LITTLE配置。但有一点是肯定的,那就是这对于ARM和普通用户来说都是一个激动人心的时刻。


AArch64是ARMv8 架构的一种执行状态,ARMv8是ARM版本升级以来最大的一次改变,其架构继承以往ARMv7与之前处理器技术的基础,除了现有的16/32bit的Thumb2指令支持外,也向前兼容现有的A32(ARM 32bit)指令集,扩充了基于64bit的AArch64架构,除新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集。

为了更广泛地向企业领域推进,需要引入 64 位构架的同时也需要在 ARMv8 架构中引入新的 AArch64 执行状态。AArch64 不是一个单纯的 32 位 ARM 构架扩展,而是 ARMv8 内全新的构架,完全使用全新的 A64 指令集。这些都源自于多年对现代构架设计的深入研究。更重要的是,AArch64 作为一个分离出的执行状态,意味着一些未来的处理器可能不支持旧的 AArch32 执行状态。虽然最初的 64 位 ARM 处理器将会完全向后兼容,但可以大胆且前瞻性地将 AArch64 作为在 ARMv8 处理器中唯一的执行状态。在这些系统中将不支持 32 位执行状态,这将使许多有益的实现得到权衡,如默认情况下,使用一个较大的 64K 大小的页面,并会使得纯净的 64 位 ARM 服务器系统不受遗留代码的影响。立即进行这种划分是很重要的,因为有可能在未来几年内将出现仅支持 64 位的服务器系统。没有必要在新的 64 位架构中去实现一个完整的 32 位流水线,这将会提高未来 ARM 服务器系统的能效。这样AArch64作为在 Fedora ARM 项目中被支持的 ARM 构架是一个很自然的过程:armv5tel、armv7hl、aarch64。新的架构被命名为:aarch64,这同 ARM 自己选择的主线命名方式保持一致,同时也考虑到了 ARM 架构名与 ARM 商标分开的期望。

ARMv8-A 将 64 位架构支持引入 ARM 架构中,其中包括:
64 位通用寄存器、SP(堆栈指针)和 PC(程序计数器)
64 位数据处理和扩展的虚拟寻址

两种主要执行状态:
AArch64 - 64 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持
AArch32 - 32 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持

这些执行状态支持三个主要指令集

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

T32 (Thumb) 是以 16 位固定长度指令集的形式引入的,随后在引入 Thumb-2 技术时增强为 16 位和 32 位混合长度指令集。部分 32 位架构执行环境现在称为 AArch32。

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

ARM ISA 不断改进,以满足前沿应用程序开发人员日益增长的要求,同时保留了必要的向后兼容性,以保护软件开发投资。在 ARMv8-A 中,对 A32 和 T32 进行了一些增补,以保持与 A64 指令集一致。


A64新的指令和寄存器
固定大小32位操作码,清除基于5位寄存器说明符的解码表;
可以拥有32位或者64位参数;
地址设定为64位,主要针对LP64和LLP64数据模型;
比AArch32拥有更少的条件指令,条件指令有:分支,比较,选择;
没有LDM/STM(用于批量从内存中读取或者写入数据)指令,添加LDP/STP指令来操作以降低复杂性及功耗;
支持先进的SIMD(Single-Instruction,Multiple-Data:单指令多数据)和(FP浮点);
支持加密技术;
可随时访问31个通用的64位寄存器(X0-X30),没有banked(banked是指一个寄存器不同模式下会对应不同的物理地址)的通用寄存器,堆栈指针(SP),PC不是通用寄存器,附加专用的零寄存器(Xzr);

AArch32状态是使用CPSR来存储当前process执行状态,AArch64定义了一组PSTATE寄存器用以保存PE(Processing Element)状态;AArch32和AArch64之间的切换只能通过发生异常或者系统Reset来实现,A32 -> T32之间是通过BX指令切换的;在ARMv8 64bit出现之前,所使用的都是32位寻址,每个地址单位对应内存一个字节单元(B),所以最大的寻址范围为2^32B = 4GB,但是实际当中,内存设备有可能远远大于4GB内存空间,以前通过LPAE(大物理地址扩展)实现地址的扩展,可以支持最大2^40的地址寻址范围,ARMv8理论上最高可以提供提供了2^64个虚拟地址,但是超过16 Exabyte (2^4 * 2^60)意义并不大,所以选择跟x86一样,可以使用最大支持2^48虚拟地址的寻址范围就足够;

Armv8是Armv7之后的一个重要架构更新,其中一个主要的变化是引入了64的架构,即AArch64,因此AArch64状态只有在Armv8架构中才有。而且在AArch64状态下执行的代码只能使用A64指令集。当然ARM为了维持整个生态参与者的利益,Armv8还是保持与现有32位体系结构兼容性的AArch32,即Armv8之前的Armv7配置文件定义的那套设计规范。AArch32今天不会进行具体介绍,今天的重点是AArch64,但是不管怎么变最本质的规则是不会变的,ARM对所有硬件资源的操作,都抽象成对寄存器的操作,寄存器隐藏了硬件的具体操作细节提供配置的接口,硬件处理器拿着这些配置负责具体的执行。下面具体看一下在AArch64状态的一些主要技术细节:

1、AArch64状态下的寄存器

2、异常级别

3、链接寄存器

4、堆栈指针寄存器

5、预留的核心寄存器名字

6、预留的扩展的寄存器名字

7、程序计数器

8、带条件的执行

9、Q标志

10、进程状态

11、保存的程序状态寄存器(SPSR)

12、A64指令集