概览
Arm 架构为处理器或内核(称为处理单元PE)的设计提供了基础。
Arm架构已经集成到许多片上系统 (SoC) 设备中,比如智能手机、微型计算机、嵌入式设备、服务器甚至超级计算机。
Arm架构为软件开发人员提供了通用指令集和工作流程,也称为编程模型。这保证ARM架构的不同实现之间的互操作性,以便软件可以在不同的 Arm 设备上运行。
关于ARM架构
Arm架构是世界上最流行的处理器架构之一,每年有数十亿台基于 Arm架构的设备出货。
下表描述了ARM的三种系列架构:A,R,M。
A系列(应用) | R系列(实时) | M系列(微控制器) |
---|---|---|
高性能 | 针对有实时要求的系统 | 小型、高能效设备 |
设计用于运行复杂的操作系统,例如 Linux 或 Windows | 网络设备和嵌入式控制系统 | 物联网设备 |
这三个系列允许 Arm 架构根据不同的需求进行定制,同时仍然有一些共性。
下图展示了基于 Arm 系统的示例。
这个智能手机的例子包括以下处理器类型:
- A‑profile 处理器作为主CPU,运行Android 等丰富的操作系统
- 基于R-profile处理的蜂窝调制解调器,提供网络连接
- 多个M系列处理器,用于处理系统电源管理等操作
- SIM卡使用SecurCore,这是一款具有附加安全功能的M系列处理器。SecurCore 处理器通常用于智能卡。
在本篇指南中,我们只关注A系列架构的两个最新版本:Armv8-A和Armv9-A 。
什么是架构?
当提及术语架构时,我们指的是功能规范。但就 Arm 架构而言,指的是处理器的功能规范。架构指定处理器的行为方式,例如它有哪些指令以及这些指令的作用。
你可以认为架构是硬件和软件之间的契约。该架构描述了软件可以依赖硬件来提供哪些功能。正如我们在架构和微架构中解释的那样,某些功能是可选的。 该架构指定:
项目 | 描述 |
---|---|
指令集 | 每条指令的功能;指令在内存在内存中如何表示(编码) |
寄存器组 | 有多少个寄存器;寄存器的大小;寄存器的功能;初始状态 |
异常模型 | 不同级别的特权;异常的类型;发生异常或者从异常返回会发生什么 |
内存模型 | 内存访问的顺序如何;缓存的行为方式、软件必须何时以及如何执行显式维护 |
调试、跟踪和分析 | 如何设置和触发断点;跟踪工具可以捕获哪些信息以及以什么格式捕获 |
系统架构
系统不只是包含处理器核心。ARM还提供了规范来描述处理器系统的要求,如下图所示。
规范是软件兼容性的基础。根据规范构建硬件意味着可以编写与之匹配的软件。按照规范编写软件意味着它可以在兼容的硬件上运行。ARM架构是第一层,其通过指令集架构(ISA)兼容性为软件提供通用编程模型。
基本系统架构(BSA)规范描述了系统软件可以依赖的硬件系统架构。 BSA 涵盖处理器和系统架构的各个方面,
例如中断控制器、定时器和操作系统所需的其他常见设备。这为标准操作系统、虚拟机管理程序和固件提供了可
靠的平台。
BSA 广泛适用于不同的市场和场景。其他标准可以建立在 BSA 的基础上,为特定市场提供标准。例如,服务器基础系统架构(SBSA)是针对服务器BSA 的补充。 SBSA 描述了服务器操作系统的硬件和功能要求。该规范是一套文档,随着 CPU 架构的发展,越来越详细地记录硬件功能。
基本启动需求 (BBR) 规范涵盖了操作系统和虚拟机管理程序可以依赖的系统要求。该规范创建了固件接口要求,例如 PSCI、SMCCC、UEFI、ACPI 和 SMBIOS。
BBR还提供了针对特定用例的方法,如下。
- SBBR:提出用于启动通用的和现有的操作系统和虚拟机的UEFI、ACPI 和 SMBIOS 要求,如Windows,VMware,RHEL,Oracle Linux和Amazon Linux。SBSR还支持其他操作系统,如 Debian、Fedora、CentOS、SLES、Ubuntu、openSUSE、FreeBSD 和 NetBSD。
- EBBR:与 EBBR 规范一起指定 UEFI 启动通用、现有操作系统的要求,如Debian、Fedora、Ubuntu、openSUSE,并为垂直集成的操作系统平台提供优势。
- LBBR:指定 LinuxBoot 固件的潜在要求,以便启动超大规模应用程序使用。
架构和微架构
架构不会告诉您处理器是如何构建的或者它是如何工作的。处理器的构建和设计称为微架构。微架构会告诉您处理器是如何工作的。
微架构包括:
- 流水线速度和布局
- cache的个数和大小
- 各个指令集的周期
- 实施了哪些可选功能
例如,Cortex‑A53和Cortex‑A72都是Armv8‑A架构的实现。这意味着它们具有相同的架构,但它们的微架构却截然不同,如下图和表格所示:
架构 | Cortex-A53 | Cortex-A72 |
---|---|---|
目标 | 针对电源效率进行优化 | 针对性能进行优化 |
流水线 | 5级流水线、有序 | 15+级流水线、乱序 |
Cache | L1 I cache:8KB-64KB L1 D cache:8KB-64KB L2 cache: 可选,最大2MB | L1 I cache:固定48KB L1 D cache:固定32KB L2 cache: 强制,最大2MB |
架构上兼容的软件可以在 Cortex‑A53 或 Cortex‑A72 上运行,而无需修改。这是因为它们都实现相同的架构。
ARM架构的开发
Arm 架构随着时间的推移不断发展,每个版本都建立在之前的基础上。
您通常会看到这样的架构:
Armv8-A
这意味着A系列架构的第8个版本。
或者,简而言之:
v8-A
Armv8-A
Armv8‑A 于 2011 年发布,是 Arm 架构的第一个 64 位版本。基于 Armv8‑A 的设备已部署在从手机到超级计算机的各种设备中。
Armv9-A
Armv9‑A 是 A系列架构的最新版本。 Armv9‑A 基于 Armv8‑A 构建并添加了新功能,包括:
- 可伸缩矢量扩展,版本 2 (SVE2)
- 事务内存扩展(TME)
- 分支记录缓冲区扩展(BRBE)
- 内嵌跟踪扩展(ETE)
- 跟踪缓冲区扩展(TRBE)
另外,Armv8‑A 中的一些可选功能在 Armv9‑A 中是强制性的。
年度迭代升级
Arm 每年都会发布架构更新,添加新的指令和功能。 Armv9.0‑A 与 Armv8.5‑A 保持一致,继承了 Armv8.5‑A 的所有功能并添加了新功能。 Armv9‑A首次发布后,Armv8‑A和Armv9‑A一起更新。 Arm将布Armv9‑A的新功能,并将继续更新和维护Armv8‑A。下图显示了并行版本:
您可以在Understanding the Armv8.x extensions中找到有关每次年度更新中添加内容的更多信息。
其他ARM架构
Arm 架构是最著名的 Arm 规范,但并不是唯一的规范。 Arm 对于构成当今片上系统 (SoC) 的许多组件都有类似的规范。
-
通用中断控制器:通用中断控制器(GIC) 规范是与Armv7‑A/R 和Armv8‑A/R 配合使用的标准化中断控制器。
-
系统内存管理单元:系统内存管理单元(SMMU 或有时是IOMMU)为非处理器主机提供转换服务。
-
通用定时器:通用定时器为所有定时器提供通用参考系统计数。这些计时器用于操作系统调度程序滴答计数等功能。通用定时器是 Arm 架构的一部分,但系统计数器是系统组件。
-
服务器基础系统架构和可信基础系统架构:服务器基础系统架构(SBSA) 和可信基础系统架构(TBSA) 为SoC 开发人员提供系统设计指南。
-
先进微控制器总线架构:先进微控制器总线架构(AMBA)总线协议系列定义控制基于 Arm 系统中组件的连接方式以及这些连接上的协议 。
了解ARM文档
Arm 为开发人员提供了大量文档。在本指南的这一部分中,我们将解释在哪里可以找到有关在 Arm 上进行开发的文档和其他信息。
文档在哪里
你可以从Arm developer website下载ARM架构和处理器手册。
您可以提出开发问题,并查找Arm community中 Arm 专家针对特定主题的文章和博客。
哪个文档描述了什么
以下是不同类型文档的简短描述:
- 每份Arm 架构参考手册都描述了一个架构规范。Arm 架构参考手册与该架构的实现相关。
- 每个Arm Cortex 处理器都有一份技术参考手册(TRM)。 TRM描述了该处理器特有的功能。一般来说,TRM不会重复Arm架构参考手册中给出的任何信息。
- 每个Arm Cortex 处理器还具有配置和集成手册(CIM)。 CIM 描述了如何将处理器集成到系统中。一般来说,此信息仅与 SoC 设计人员相关。
那么,这对我意味着什么
如果您正在寻找有关某个处理器的信息,可能需要参考几个不同的文档。如果你打算使用Cortex‑A75 处理器,以下可能是你需要的各种文档:
Cortex‑A75 实现了 ARMv8.2‑A、GICv4 CPU 接口和 AMBA 总线接口,因此你必须参考每部分的单独文档。你还必须参考微架构的相关文档。
如果使用现有的SoC,你必须参考SoC制造商提供的文档,通常是以datasheet的形式,其给出的信息只针对该SoC。
我可以从每个文档中获取什么信息
下表展示了在不同类型文档中可以获取到的信息(X表示具有)。
- | 架构 | - | - | 微架构 | 微架构 | - |
---|---|---|---|---|---|---|
Arm架构参考手册 | GIC规范 | AMBA规范 | TRM | CIM | SoC Datasheet | |
指令集 | X | |||||
指令周期时序 | X | |||||
架构寄存器 | X | X | ||||
处理器寄存器 | X | |||||
内存模型 | X | |||||
异常模型 | X | |||||
可选功能 | X | X(有些是一起选) | ||||
cache/TLB大小 | X | |||||
电源管理 | X | |||||
总线接口 | X | X | ||||
所有合法总线事务 | X | |||||
处理器生成的总线事务 | X | |||||
内存表 | X | |||||
外设 | X | |||||
SoC引脚排列 | X |
参考手册和用户指南之间的差异
目前为止,我们查看的文档(Arm 架构参考手册、TRM 和 CIM)都是参考手册。这意味着他们不提供有关处理器的使用指南。例如,Arm 架构参考手册中没有关于如何打开 MMU的说明。
这种结构是经过深思熟虑的,这是为了在参考手册中找到架构所需的技术细节与提供更一般指导的文档(例如
本指南)之间保持清晰的界限。一般性指导文档将介绍概念,而其他文档则提供您需要遵循的说明。
常用架构术语
该架构使用了几个术语,通常在文档中以小写字母书写,它们具有非常具体的含义。 Arm 架构参考手册定义了每个术语。在本节中,我们将介绍最常见的术语,并为编程者提供需要的附加信息。
PE处理单元
处理单元(PE)是 Arm 架构实现的通用术语。您可以将 PE 视为具备程序计数器并可以执行程序的任何东西。例如,Arm 架构参考手册指出:
决定 PE 如何运行的状态,包括当前的异常级别和安全状态,以及在 AArch32 状态下的 PE 模式。
手册使用通用术语PE,因为有不同的微架构。例如,Arm Cortex‑A 处理器 可以采用下面的微架构:
- Cortex‑A8 是单核、单线程处理器,整个处理器就是一个PE。
- Cortex‑A53 是一个多核处理器,每个核心都是一个线程。每个核心都是一个PE。
- Cortex‑A65AE 是多核处理器,每个核心有两个线程。每个线程都是一个PE。
通过使用术语 PE,架构与不同处理器中的设计决策保持分离开。
IMPLEMENTATION DEFINED
实施定义(简称IMP DEF)的功能是由特定的微架构定义的。实现必须呈现一致的行为或值。
例如,缓存的大小是IMP DEF。该架构为软件提供了一种定义的机制来查询缓存大小,但缓存的大小取决于处理器设计者。
同样,对密码指令的支持是 IMP DEF。同样,有寄存器允许软件确定指令是否存在。
在这两个示例中,选择都是静态的。也就是说,给定的处理器要么支持,要么不支持这些功能和指令。该功能不能在运行时更改支持。
对于 Cortex‑A 处理器,一些 IMP DEF 选择将被修复,一些将是综合选项。例如,在 Cortex‑A57 上,L1 缓存的大小是固定的,L2 缓存的大小是综合选项。然而,L2 缓存的大小是在设计时决定的。它在运行时仍然是静态的。
IMP DEF 选项的完整详细信息记录在处理器的技术参考手册 (TRM) 中。
UNPREDICTABLE and CONSTRAINED UNPREDICTABLE
UNPREDICTABLE 和CONSTRAINED UNPREDICTABLE用于描述软件不应该做的事情。
当某些事情不可预测或受约束不可预测时,软件不能依赖处理器的行为。如果软件多次执行非法操作,处理器也可能表现出不同的行为。
例如,提供未对⻬的转换表是受限且不可预测的。这代表了糟糕的软件。糟糕的软件意味着违反翻译表应遵守的架构规则。
与 IMP DEF 行为不同,技术参考手册 (TRM) 通常不会描述所有不可预测的行为。
Deprecated
有时我们会从架构中删除某个功能。发生这种情况的原因有多种,例如性能或因为该功能不再常用且没有必要。但是,可能仍然有一些旧版软件依赖于该功能。
因此,在完全删除某个功能之前,我们首先将其标记为“已弃用”。例如,Arm 架构参考手册指出:
出于性能原因,不推荐使用IT指令以及CP15DMB、 CP15DSB和CP151SB屏障指令。
DEPRECATED 是向开发人员发出的警告:某个功能将来会被删除,他们应该开始从代码中删除它。
通常,一个控件会同时添加到架构中,从而允许禁用该功能。该控件允许开发人员测试遗留代码中该功能的使用情况。
RES0和RES1
RES0表示保留,应为零。 RES1表示Reserved,应该是1。
RES0和RES1用于描述未使用且对处理器功能没有影响的字段。
保留字段可能会在架构的某些未来版本中使用。在这种情况下, RES0/ RES1 字段值如果为 1 将表示新的行为。
RES0字段并不总是读取为 0,RES1 字段也不总是读取为 1。RES0和RES1 仅告诉您该字段未使用。
有时RES0和 RES1 字段必须是有状态的。有状态意味着该字段读到的是最后写入的值。
检查你学的知识
以下问题将帮助您检查您所学的知识:
-
如果您在某个文档中看到 Armv7‑R,指的是该架构的哪个版本和系列?
版本7,R系列
-
在哪个版本的 Arm 架构中,A系列添加了对于 64 位的支持?
版本8(Armv8-A)
-
指令编码、cache大小和内存序这三项分别是架构还是微架构?
- 指令编码:架构
- cache大小:微架构
- 内存序:架构
-
什么是PE
PE 是一个处理单元:实现 Arm 架构的machine。
相关信息
以下是与本指南中相关的一些资源:
其他Arm架构
后续步骤
本指南介绍了 Arm 架构的基本原理、它是如何发展的、它的系列及其应用。这些知识有助于为您进一步了解 Arm 技术奠定基础。
我们讨论了一些对于理解 Arm 架构至关重要的常见术语和概念,以及 Arm 架构的不同系列。我们描述了架构、系统架构和微架构的功能,以及 Arm 架构术语和概念是如何出现在 Arm 架构参考手册和其他 Arm 文档和资源中。我们还了解了 Arm 架构和其他 Arm 架构的不同系列。
本系列中的其他指南详细介绍了 Arm 架构的各个方面,并提供了示例和说明。
要继续了解 Arm 架构,请参阅我们的Learn the Architecture series of guides。