现在市面上存在许多 CPU 架构,其中最主要的是 x86 和 ARM,而 AArch64 可能在你的视野之外。尽管 AArch64 存在于数百万计的设备中,即便是相当了解技术的科技宅可能都没听说过它。其实 AArch64 并不神秘,就是这个技术术语容易让人困惑。本文总结了关于 AArch64 需要了解的一些内容。
AArch64 就是 ARM64?
AArch64 是 Arm 的 64 位指令集架构(ISA)的官方名称,也被人们常称为 ARM64,它是在 Armv8-A 更新中被引入。为什么经常用 ARM64 来代替 AArch64 已经不可考证,但部分混淆似乎源于两个方面:
-
其中一部分原因是因为 x86 的 64 位扩展是 x86-64,所以自然而然地,ARM 的 64 位扩展就应该是 ARM64。
-
直到 2014年,苹果公司也认为如此,并将 AArch64 称为 ARM64。对大多数人来说,「AArch64 是 ARM64」这个解释已经很令人满意了。
如果深入技术细节:AArch64 并不是 ISA,而是一种执行状态,允许 ARM CPU 使用(且仅使用) ARMv8 ISA 的 A64 指令集,该指令集首次出现在 Armv8-A 架构中。
从技术上讲,AArch64 是一种状态,而不是 ISA,但没有人关心这点,甚至包括 Arm 自己在内。
ARM 是一系列相关的 ISA(指令集架构)家族,尽管不同的 ISA 通常意味着不兼容,但这种说法并不完全正确。不同版本的 ARM ISA 被称为 ARMv1、ARMv2 等,但这些 ISA 实际上包含了基本的子 ISA:A-profile、M-profile 和 R-profile。子 ISA 之间的基本区别在于所使用的指令数量,其中 A-profile 使用最多,M-profile 使用最少。因此,ARM ISA 被划分为不同的版本(例如 ARMv8),这些版本进一步分为 ISA 的不同实现。
ARMv8-A 是 ARMv8 ISA 的最初 A-profile 实现,它添加了两个新的东西:AArch32 和 AArch64,被称为状态或模式,它们允许 ARM CPU 访问不同的指令集。
-
其中 AArch32 包含 32 位 A32 和 T32 指令,而 AArch64 包含 64 位 A64 指令。
-
如果处理器当前处于 AArch64 状态并且需要使用 A32 指令,就必须切换到 AArch32 状态。
-
在 AArch64 模式下,可以访问 32 位和 64 位寄存器,而在 AArch32 模式下只能使用 32 位寄存器。
最令人困惑的部分是,这些事物都被称为 ISA,甚至包括开发 ARM ISA 的 Arm 公司在内也是如此。但如果要非常技术化地描述,事实上是这样的:
-
ARM ISA 的第八个版本,ARMv8,首次由 Armv8-A 实现,其中包含两个称为 AArch32 和 AArch64 的状态。
-
当 CPU 处于 AArch64 状态时,可以执行 64 位的 A64 指令。因此,从技术上讲,AArch64 是 一种状态,而不是 ISA。
为什么 ARM 同时支持 32 位和 64 位
AArch64 实际上相当复杂,需要切换状态才能使用 32 位和 64 位指令,但同时支持 32 位和 64 位又非常重要。这涉及到两个重要问题:「对旧的 32 位软件的支持」和「满足现代高性能计算」。如果 Arm 在其首个 64 位 ISA 中不支持 32 位软件,那将是一场灾难。没有人愿意从零开始重构新代码,这生意就根本没得做了呗?。因此,对 32 位的支持是不容讨论的。
另一方面,不支持 64 位计算也是一条死路。x86 背后的 Intel 和 AMD 从 2000 年代初就使用 64 位架构设计 CPU。智能手机的出现改变了一切,人们都希望手机可以完成更多任务。64 位支持不仅可以帮助智能手机变得更加强大,还在传统 x86 主导的市场上抢占了一席之地,例如笔记本电脑、服务器和云计算。
基本上,命名混乱的原因是 Arm 需要根据不断变化的市场来优化技术实现。尽管 AArch64 不是一种 ISA,但大多数人用着用着也就成习惯了。