1 ARM介绍
ARM公司主要向客户提供处理器IP。通过这种独特的盈利模式,ARM软硬件生态变得越来越强大。表1.1展示了ARM公司重大的历史事件。
表1.1 ARM公司重大的历史事件
ARM体系结构是一种硬件规范,主要是用来约定指令集、芯片内部体系结构(如内存管理、高速缓存管理)等。以指令集为例,ARM体系结构并没有约定每一条指令在硬件描述语言(Verilog或VHDL)中应该如何实现,它只约定每一条指令的格式、行为规范、参数等。为了降低客户基于ARM体系结构开发处理器的难度,ARM公司通常在发布新版本的体系结构之后,根据不同的应用需求开发出兼容体系结构的处理器IP,然后授权给客户。客户获得处理器IP之后,再用它来设计不同的SoC芯片。以ARMv8体系结构为例,ARM公司先后开发出Cortex-A53、Cortex-A55、Cortex-A72、Cortex-A73等多款处理器IP。
ARM公司一般有两种授权方式。
- 体系结构授权。客户可以根据这个规范自行设计与之兼容的处理器。
- 处理器IP授权。ARM公司根据某个版本的体系结构来设计处理器,然后把处理器的设计方案授权给客户。
从最早的ARM处理器开始,ARM体系结构已经从v1版本发展到目前的v8版本。在每一个版本的体系结构里,指令集都有相应的变化,其主要变化如表1.2所示。
表1.2 ARM体系结构的变化
ARM体系结构又根据不同的应用场景分成如下3种系列。
- A系列:面向性能密集型系统的应用处理器内核。
- R系列:面向实时应用的高性能内核。
- M系列:面向各类嵌入式应用的微控制器内核。
2 ARMv8体系结构基础知识
2.1 ARMv8体系结构
ARMv8是ARM公司发布的第一代支持64位处理器的指令集和体系结构。它在扩充64位寄存器的同时提供了对上一代体系结构指令集的兼容,因此它提供了运行32位和64位应用程序的环境。
ARMv8体系结构除了提高了处理能力,还引入了很多吸引人的新特性。
- 具有超大物理地址(physical address)空间,提供超过4 GB物理内存的访问。
- 具有64位宽的虚拟地址(virtual address)空间。32位宽的虚拟地址空间只能供4 GB大小的虚拟地址空间访问,这极大地限制了桌面操作系统和服务器等的应用。64位宽的虚拟地址空间可以提供更大的访问空间。
- 提供31个64位宽的通用寄存器,可以减少对栈的访问,从而提高性能。
- 提供16 KB和64 KB的页面,有助于降低TLB的未命中率(miss rate)。
- 具有全新的异常处理模型,有助于降低操作系统和虚拟化的实现复杂度。
- 具有全新的加载-获取指令(Load-Acquire Instruction)、存储-释放指令(Store-Release Instruction),专门为C++11、C11以及Java内存模型设计。
ARMv8体系结构一共有8个小版本,分别是ARMv8.0、ARMv8.1、ARMv8.2、ARMv8.3、ARMv8.4、ARMv8.5、ARMv8.6、ARMv8.7,每个小版本都对体系结构进行小幅度升级和优化,增加了一些新的特性。
2.2 采用ARMv8体系结构的常见处理器内核
下面介绍市面上常见的采用ARMv8体系结构的处理器(简称ARMv8处理器)内核。
- Cortex-A53处理器内核:ARM公司第一批采用ARMv8体系结构的处理器内核,专门为低功耗设计的处理器。通常可以使用1~4个Cortex-A53处理器组成一个处理器簇或者和Cortex-A57/Cortex-A72等高性能处理器组成大/小核体系结构。
- Cortex-A57处理器内核:采用64位ARMv8体系结构的处理器内核,而且通过AArch32执行状态,保持与ARMv7体系结构完全后向兼容。除ARMv8体系结构的优势之外,Cortex-A57还提高了单个时钟周期的性能,比高性能的Cortex-A15高出了20%~40%。它还改进了二级高速缓存的设计和内存系统的其他组件,极大地提高了性能。
- Cortex-A72处理器内核:2015年年初正式发布的基于ARMv8体系结构并在Cortex-A57处理器上做了大量优化和改进的一款处理器内核。在相同的移动设备电池寿命限制下,Cortex-A72相对于基于Cortex-A15的设备具有3.5倍的性能提升,展现出了优异的整体功效。
2.3 ARMv8体系结构中的基本概念
ARM处理器实现的是精简指令集体系结构。在ARMv8体系结构中有如下一些基本概念和定义。
- 处理机(Processing Element,PE):在ARM公司的官方技术手册中提到的一个概念,把处理器处理事务的过程抽象为处理机。
- 执行状态(execution state):处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。ARMv8体系结构定义了两个执行状态。AArch64:64位的执行状态。提供31个64位的通用寄存器。提供64位的程序计数(Program Counter,PC)指针寄存器、栈指针(Stack Pointer,SP)寄存器以及异常链接寄存器(Exception Link Register,ELR)。提供A64指令集。定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。提供64位的内存模型。定义一组处理器状态(PSTATE)用来保存PE的状态。AArch32:32位的执行状态。提供13个32位的通用寄存器,再加上PC指针寄存器、SP寄存器、链接寄存器(Link Register,LR)。支持两套指令集,分别是A32和T32(Thumb指令集)指令集。支持ARMv7-A异常模型,基于PE模式并映射到ARMv8的异常模型中。提供32位的虚拟内存访问机制。定义一组PSTATE用来保存PE的状态。
- ARMv8指令集:ARMv8体系结构根据不同的执行状态提供不同指令集的支持。A64指令集:运行在AArch64状态下,提供64位指令集支持。A32指令集:运行在AArch32状态下,提供32位指令集支持。T32指令集:运行在AArch32状态下,提供16位和32位指令集支持。
- 系统寄存器命名:在AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器。系统寄存器的使用方法如下。
<register_name>_Elx //最后一个字母 x 可以表示0、1、2、3