学习Armv8架构参考手册时,对部分内容的翻译和整理

Armv8体系架构(1)


文章目录

  • Armv8架构概念
  • 1.执行状态
  • 1.1 AArch64执行状态
  • 1.2 AArch32执行状态
  • 2. Armv8指令集
  • 3. 系统寄存器
  • 3.1系统寄存器包括
  • 4. Armv8 调试


Armv8架构概念

1.执行状态

执行状态定义PE执行环境,包括:
(1)支持的寄存器宽度;
(2)支持的指令集;
(3)异常模型;
(4)虚拟内存系统架构(VMSA);
(5)程序员模型。

1.1 AArch64执行状态

AArch64即64位执行状态,主要有以下特征:

  • 提供31个64位通用寄存器,其中X30用作程序连接寄存器
  • 提供64位程序计数器(PC)、堆栈指针(SP)、和异常连接寄存器(ELR)
  • 为支持SIMD矢量和标量浮点提供32个128位寄存器
  • 提供单一指令集A64
  • 定义Armv8异常模型,最多具有四个异常级别,EL0~EL3,提供执行权限层次结构
  • 提供对64位虚拟寻址的支持
  • 定义了许多保持PE状态的进程状态(PSTATE)元素。A64指令集包括直接对各种PSTATE元素进行操作的指令。
  • 使用后缀命名每个系统寄存器,该后缀指示可以访问寄存器的最低异常级别

1.2 AArch32执行状态

AArch32即32位执行状态,主要有以下特征:

  • 提供13个32位通用寄存器和一个32位PC、SP和连接寄存器(LR)。LR用作ELR和过程连接寄存器。
  • 其中一些寄存器具有多个分组实例,用于不同的PE模式。
  • 提供单个ELR,用于从Hyp模式返回异常
  • 为支持高级SIMD矢量和标量浮点提供32个64位寄存器
  • 提供两个指令集,A32和T32
  • 支持基于PE模式的Armv7-A异常模型,并将其映射到基于异常级别的Aamv8异常模型
  • 提供对32位虚拟寻址的支持
  • 定义了许多保持PE状态的进程状态(PSTATE)元素。A32和T32指令集包括直接对各种PSTATE元素进行操作的指令,以及使用应用程序状态寄存器(APSR)或当前程序状态寄存器(CPSR)访问PSTATE的指令。

在AArch64和AAr32执行状态之间转移控制称为**交互处理**。PE只能在异常级别更改时在执行状态之间移动,并遵守交互处理中给出的规则。这意味着以不同异常级别执行的不同软件层,例如应用程序、操作系统内核和管理程序,可以在不同的执行状态下执行。

2. Armv8指令集

在Armv8中,可能的指令集取决于执行状态:
(1)AArch64执行状态只支持一个指令集,称为A64。这是一个使用32位指令编码的固定长度指令集。
(2)AArch32执行状态支持两种指令集:
   a. **A32:**这是一个使用32位指令编码的固定长度指令集;
   b. **T32:**这是一个使用16位和32位指令编码的可变长度指令集。

在AArch32状态下,指令集状态决定了PE执行的指令集。
Armv8指令集支持SIMD和标量浮点指令。

3. 系统寄存器

系统寄存器提供架构功能和的控制和状态信息。
系统寄存器使用标准命名格式:
<register_name>.<bit_field_name> 来标识特定寄存器以及寄存器中的控制位和状态位。

位也可以用 <register_name>[x:y]形式或通用形式bits[x:y]中的数字位置来描述。

AArch64状态下,大多数寄存器名称都包含可以访问寄存器的最低异常级别作为寄存器名称的后缀。即<register_name>_ELx,x可取值为0,1,2,

3.1系统寄存器包括

  1. 通用系统控制寄存器
  2. 调试寄存器
  3. 通用定时器寄存器
  4. 可选地,性能监视器寄存器
  5. 可选地,活动监视器寄存器

ARM通用中断控制器系统寄存器:

  • ICC_ GIC物理CPU接口系统寄存器
  • ICH_ GIC虚拟接口控制系统寄存器
  • ICV_ GIC虚拟CPU接口系统寄存器
    以上几个系统寄存器是对GIC内存映射寄存器组GICC_、GICD_、GICH_、GICR_、GICV_和GITS的补充。

4. Armv8 调试

Armv8 支持自托管调试和外部调试。

  1. 自托管调试: 在该模式下,PE会产生调试异常,调试异常是Armv8异常模型的一部分.
  2. 外部调试: 在该模式下,调试事件导致PE进入调试状态。在调试状态下,PE由外部调试器控制。

所有Armv8实现都支持这两种调试模型,特定用户选择的模型取决于产品设计和开发生命周期不同阶段的调试要求。例如,在硬件实现和操作系统启动的调试过程中可能会使用外部调试,而在应用程序开发过程中可能会使用自托管调试。