目录
程序员指南的目的是补充而不是取代现有的ARM文档,例如处理器本身的技术参考手册(TRMs)、个别设备或板子的文档,或者最重要的是ARM架构参考手册(ARM ARM)。它们旨在以温和的方式介绍ARM架构,并以易于阅读的格式涵盖所有主要概念,包括实际的C语言和汇编语言代码示例,并提供编写自己代码的提示和技巧。
可以说,如果你是一个应用程序开发者,你不需要知道处理器内部发生了什么。ARM应用程序处理器可以很容易地被视为黑盒子,当你说开始时,它们就会运行你的代码。相反,这本书提供了一个单一的指南,汇集了来自广泛来源的信息,为那些将系统带到应用程序开发者可以运行应用程序的地步的程序员提供帮助,例如那些参与ASIC验证或从事启动代码和设备驱动程序工作的人员。
在新板卡或片上系统(SoC)的启动过程中,工程师可能需要调查硬件问题。内存系统行为是这些问题最常出现的地方之一,例如死锁,处理器由于内存系统锁定而无法取得进展。调试这些问题需要理解缓存或MMU使用的操作和影响。这与调试失败的代码段是不同的。
1.从32bit到64bit的转换
转移到64位处理器可以带来几个性能提升:
-
A64指令集提供了一些显著的性能优势,包括更大的寄存器池。额外的寄存器和ARM架构过程调用标准(AAPCS)在调用函数时需要传递超过四个寄存器时,可以提供性能提升。在ARMv7上,这将需要使用堆栈,而在AArch64中,可以在寄存器中传递多达八个参数。
-
更宽的整数寄存器使得操作64位数据的代码能够更高效地工作。32位处理器可能需要多个操作来执行64位数据的算术运算。而64位处理器可能能够在单一操作中完成相同的任务,通常以与执行32位操作相同的速度完成。因此,执行许多64位大小操作的代码速度会显著加快。
-
64位操作使应用程序能够使用更大的虚拟地址空间。尽管大型物理地址扩展(LPAE)将32位处理器的物理地址空间扩展到40位,但它并没有扩展虚拟地址空间。这意味着即使有LPAE,单个应用程序也限于32位(4GB)的地址空间。这是因为这个地址空间的某些部分是为操作系统保留的。
-
在32位架构上运行的软件在执行时可能需要将一些数据映射进或映射出内存。拥有更大的地址空间和64位指针可以避免这个问题。然而,使用64位指针确实会带来一些成本。同一段代码在运行时使用64位指针通常比使用32位指针占用更多的内存。每个指针在内存中存储需要8个字节而不是4个字节。这听起来可能微不足道,但可能会累积成显著的惩罚。此外,与转移到64位相关的内存空间增加可能会导致缓存命中率下降,这反过来又可能降低性能。
-
更大的虚拟地址空间还允许内存映射更大的文件。这是将文件内容映射到线程的内存映射中。这种情况可能发生,即使物理RAM可能不足以容纳整个文件。
2.introduction
这本书为想要使用实现ARMv8架构的Cortex-A系列处理器的程序员提供了一个指南。该指南汇集了对ARM汇编语言和C程序员都有用的各种信息来源。它旨在补充而不是取代现有的ARMv8处理器的其他ARM文档。其他文档包括处理器本身的ARM技术参考手册(TRMs)、个别设备或板子的文档,或者最重要的是ARM架构参考手册 - ARMv8,针对ARMv8-A架构配置文件 - ARM ARM。
这本书不是入门级别编写的。它假定读者对C编程语言和微处理器有一定的了解。书中涵盖了硬件概念,如缓存和内存管理单元,但只有在这些知识对应用程序编写者有价值时才会涵盖。本书探讨了操作系统如何利用ARMv8特性,以及如何充分利用ARMv8处理器的能力。一些章节包含了额外阅读的指导。我们还提到了可以提供更深层次背景信息的书籍和网站,但通常主要关注的是ARM特有的细节。本书不假定使用任何特定的工具链,并且在整个书中都提到了GNU和ARM工具。
如果你是ARMv8架构的新手,第2章ARMv8-A架构和处理器描述了以前的32位ARM架构,介绍了ARMv8,并描述了ARMv8处理器的一些属性。接下来,第3章ARMv8基础描述了架构的基本构件,以异常级别和执行状态的形式。第4章ARMv8寄存器然后描述了ARMv8架构中可用的寄存器。
ARMv8架构引入的最重大变化之一是增加了64位指令集,这补充了现有的32位架构。第5章ARMv8指令集简介描述了ARMv7(A32)的指令集架构(ISA)与A64指令集的区别。第6章A64指令集更详细地查看了指令集及其使用。除了用于一般操作的新指令集外,ARMv8还有改变了的NEON和浮点指令集。第7章AArch64浮点和NEON描述了ARMv8对ARM高级SIMD(NEON)和浮点指令的更改。有关NEON及其在ARMv7的功能的更详细指南,请参阅ARM® NEON™程序员指南。
本书的第8章移植到A64涵盖了在将代码从其他架构或以前的ARM架构移植到ARMv8时可能遇到的问题。第9章ARM 64位架构的ABI描述了ARM架构规范的应用程序二进制接口(ABI)。ABI是针对所有ARM目标的编程行为的规范,它规定了你的64位代码的形式。第10章AArch64异常处理描述了ARMv8在AArch64状态下的异常处理行为。
随后,重点转移到了处理器的内部架构上。第11章缓存描述了缓存的设计以及缓存的使用如何提高性能。ARMv8和转向64位架构的一个重要动机是可能能够访问比仅使用32位更大的地址空间。第12章内存管理单元描述了MMU如何将虚拟内存地址转换为物理地址。
第13章内存排序描述了ARMv8架构中的弱有序内存模型。通常,这意味着内存访问的顺序不必与程序顺序对于加载和存储操作相同。只有一些程序员必须意识到内存排序问题。如果你的代码直接与硬件交互或与其他核心上执行的代码交互,直接加载或写入要执行的指令,或修改页表,那么你可能需要考虑排序和屏障。如果你正在实现自己的同步功能或无锁算法,这也适用。
第14章多核处理器描述了ARMv8-A架构如何支持具有多个核心的系统。使用ARMv8处理器的系统几乎总是以这种方式实现。第15章电源管理描述了ARM核心如何使用它们的硬件来减少功耗。应用于多核和多集群系统的电源管理的另一个方面在第16章big.LITTLE技术中进行了介绍。本章描述了ARM的big.LITTLE技术如何将能效高的LITTLE核心与高性能的大核心结合起来,以提供高性能和能效的系统。
第17章安全描述了ARMv8处理器如何创建一个安全或受信任的系统,以防止资产(如密码或信用卡详细信息)未经授权的复制或损坏。本书的主要部分最后以第18章调试结束,描述了Cortex-A53和Cortex-A57处理器中可用的标准调试和跟踪功能。