Cortex®-R52+ 程序员模型
本章介绍程序员模型。
1. 关于程序员模型¶
Cortex®-R52+处理器实现了 Armv8-R 架构。包括了:
- 所有异常级别(Exception levels):EL0 - EL2。
- 每个异常级别的 AArch32 执行状态。
- T32 和 A32 指令集包括:
- 浮点运算。
- 高级 SIMD 操作(可选)。
有关 Armv8-R AArch32 架构配置文件的更多信息,请参阅 Arm® 架构参考手册补充 Armv8。
1.1. 高级 SIMD 和浮点¶
高级 SIMD 是一种媒体和信号处理架构(media and signal processing architecture)。
浮点执行单精度和双精度浮点运算。
注意:
高级 SIMD、其相关实现和支持软件通常称为 NEON™技术。
所有高级 SIMD 和浮点运算都是 A32 和 T32 指令集的一部分。
有关 Armv8-R AArch32 架构配置文件的更多信息,请参阅 Arm® 架构参考手册补充 Armv8。
1.2. 通用中断控制器¶
Cortex®-R52+ 处理器不支持以下 GIC 版本 3 的功能:
- 1 of N 中断分配(1 of N interrupt distribution)。
- 特定于位置的外设中断(Locality-specific Peripheral Interrupts) (LPI)。
- 中断转换服务(Interrupt Translation Service) (ITS)。
1.3. Jazelle 实现¶
处理器仅支持简单的 Jazelle 实现。这意味着:
- 不支持 Jazelle 状态。
- BXJ 指令的行为与 BX 指令相同。
在简单的 Jazelle 实现中,处理器不会加速任何字节码的执行,并且 Java 虚拟机 (JVM) 使用软件例程(software routines)来执行所有字节码(bytecodes)。
1.4. 指令集状态¶
处理器操作由 CPSR.T 位控制的两个指令集状态:
- A32:处理器执行 32 位、字对齐(word-aligned)的 A32 指令。
- T32:处理器执行 16 位和 32 位、半字对齐(halfword-aligned)的 T32 指令。
1.5. 内存模型¶
Cortex®-R52+ 处理器将内存视为从零开始按升序编号的字节的线性集合。例如:字节 0-3 保存第一个存储的字,字节 4-7 保存第二个存储的字。
处理器可以以以下任一方式访问内存中的字:
- 大端格式(Big-endian format)。
- 小端格式(Little-endian format)。
有关大端和小端内存系统的更多信息,请参阅 Arm® 架构参考手册补充 Armv8,了解 Armv8-R AArch32 架构配置文件。
注意:
对于指令始终为小端。
1.6. 安全状态¶
Cortex®-R52+ 处理器未实现 TrustZone®技术。它不支持区分安全和非安全物理内存的能力。
2. Armv8-R AArch32 架构概念¶
Cortex®-R52+处理器的程序员模型主要由实现的架构定义。本手册不包含架构程序员模型的重复描述。本手册只描述了特定于Cortex®-R52+处理器实现的功能和行为。
以下部分介绍了本文档其余部分中使用的主要架构概念和术语。有关更多详细信息,请参阅 Arm® 架构参考手册补充 Armv8,了解 Armv8-R AArch32 架构配置文件。
注意:
理解本节中定义的术语是阅读本手册其余部分的先决条件。
2.1. 执行状态¶
Armv8-R AArch32架构只有一个执行状态,即:AArch32。执行状态定义处理器执行环境,包括:
- 支持的寄存器宽度。
- 支持的指令集。
- 重要方面:
- 执行模型。
- PMSA。
- 程序员模型。
2.2. 异常级别¶
Armv8-R AArch32 异常模型定义了异常级别 EL0-EL2,其中:
- EL0 具有最低的软件执行权限,在 EL0 执行称为非特权执行。
- 增加的异常级别,从1到2,表示软件执行权限增加。
- EL2 提供对处理器虚拟化的支持。
只有在发生异常或从异常返回时,执行才能在 Armv8-R AArch32 异常级别之间移动:
- 发生异常时,异常级别要么增加,要么保持不变。发生异常时,异常级别不能降低。
- 从异常返回时,异常级别要么降低,要么保持不变。从异常返回时,异常级别不能增加。
发生异常时,执行更改到(execution changes to)或保持(remains in)的异常级别称为异常的目标异常级别,并且:
- 每种异常类型都有一个目标异常级别,该级别可以是:
- 隐含在异常的性质中。
- 由系统寄存器中的配置位定义。
- 异常不能以 EL0 为目标。
2.3. 典型的异常级别使用模型¶
架构没有指定软件在不同异常级别使用什么,并且这种选择超出了架构的范围。但是,以下是异常级别的常见使用模型:
- EL0: 应用程序。
- EL1: 操作系统内核和通常被描述为特权的相关功能。
- EL2: 虚拟机管理程序。
2.4. 异常术语¶
本节定义用于描述异常级别之间导航的术语。
2.4.1. 异常发生的术语¶
当处理器首次响应异常情况时,将生成异常。
此时的处理器状态是异常发生前的状态。发生异常后立即出现的处理器状态是异常发生后的状态。
2.4.2. 从异常返回的术语¶
要从异常返回,处理器必须执行异常返回指令。提交执行异常返回指令时的处理器状态是从异常返回前状态。执行该指令后立即出现的处理器状态是异常返回后的状态。
2.4.3. 快速中断¶
启用快速中断后,当收到中断时,处理器将放弃任何已启动但未完成的可重启内存操作。可重启内存操作是加载和存储指令到普通内存(Normal memory)。
为了最大限度地减少中断延迟,Arm 建议您不要对设备内存(Device memory)执行多字(multiword)传输操作。
2.5. 指令集状态¶
处理器指令集状态决定处理器执行的指令集。
AArch32 执行状态支持的指令集有:
- A32: 这是一个使用32位指令编码的固定长度指令集。在 Armv8 推出之前,它被称为Arm指令集。
- T32: 这是一个使用16位和32位指令编码的可变长度指令集。在 Armv8 推出之前,它被称为Thumb指令集。
2.6. AArch32 执行模式¶
在 AArch32 状态下,处理器可以在几种模式之一中执行。每种模式都与一个异常级别相关联。某些模式具有一些通用寄存器的私有存储副本。异常会导致处理器切换到特定模式。
下表显示了 AArch32 处理器模式以及每种模式的异常级别。
| AArch32 处理器模式 | 异常级别 |
|---|---|
| User | EL0 |
| System、快速中断(FIQ)、中断(IRQ)、Supervisor、Abort、Undefined | EL1 |
| Hyp | EL2 |
2.7. v8 支持的内存类型¶
Armv8 提供互斥的内存类型(mutually exclusive memory types)。内存映射中的每个地址都有一个由 MPU 确定的内存类型。
内存类型包括:
- 普通内存(Normal):通常用于大容量内存,包括了读/写和只读内存。
- 设备内存(Device):通常用于外设(peripherals),可能是读敏感(read-sensitive)或者写敏感(write-sensitive)。Arm架构限制了对设备内存的访问的排序、合并或推测方式(ordered, merged, or speculated)。
Armv8 架构将设备内存(Device memory)细分为几种子类型。这些子类型与以下属性相关:
- G: 聚集(Gathering),将请求聚集并合并为单个事务(single transaction)的能力。
- R: 重新排序(Reordering),重新排序事务(reorder transactions)的能力。
- E: 提前确认(Early-acknowledge),接受来自互连的事务的提前确认的能力。
下表描述了 Armv8 内存类型。
| 内存类型 | 注释 |
|---|---|
| GRE | 与 Normal 不可缓存(Normal non-cacheable)类似,但不允许推测访问(speculative access)。 |
| nGRE | 在 Cortex®-R52+ 处理器中被视为 nGnRE,但可以通过外部互连重新排序。 |
| nGnRE | 对应于 Armv7 中的设备。 |
| nGnRnE | 对应于 Armv7 中的强排序。在 Cortex®-R52+ 处理器中与 nGnRE 相同,但在 ARCACHE 或 AWCACHE 上的报告不同。 |
2.8. 系统寄存器¶
系统寄存器提供控制和状态信息。例如,某个寄存器可以提供内核已接受的异常中止(abort)异常的综合征信息(syndrome information),或者提供一个用于启用或禁用缓存的控制位。
系统寄存器使用标准命名格式 <register_name>.<bit_field_name> 来标识特定寄存器以及寄存器内的控制和状态位。位也可以通过其数值位置描述为 <register_name>[x:y] 或通用形式 bits[x:y]。
系统寄存器包括:
- ID 寄存器。
- 通用系统控制寄存器。
- 调试寄存器。
- 通用定时器寄存器。
- 性能监视器寄存器。
- GIC CPU 接口寄存器。
相关参考
第 9 章 通用中断控制器(第 9-247 页)。
第 10 章 通用定时器(第 10-332 页)。
第 11 章 调试(第 11-336 页)。
第 12 章 性能监视单元(第 12-383 页)。
2.9. 通用寄存器¶
Armv8-R 架构提供对十五个 32 位通用寄存器 R0-R14 的访问。
其中两个具有专用或受限的用途:
- R13 通常标识为 SP,即堆栈指针(stack pointer)。
- R14 通常标识为 LR,即链接寄存器(link register)。
还存在一个 32 位程序计数器(Program Counter,PC),即 R15。
其中一些寄存器是分组的(banked)。这些是使用相同标识符访问的多个物理寄存器,由执行模式决定访问哪一个。例如:
- 在中止模式(abort mode)下,对 SP 的访问会访问物理寄存器 SP_abt。
- 在用户模式(user mode)下,对 SP 的访问会访问物理寄存器 SP_usr。
在虚拟机管理程序模式(Hypervisor mode)下,还有一个专用的链接寄存器 ELR_hyp。
高级 SIMD 和浮点指令使用另一组寄存器。这些寄存器可以作为 32 位单精度寄存器 S0-S31、64 位双精度寄存器 D0-D31 或 128 位四字寄存器 Q0-Q15 访问,但它们是同一数据的不同视图。数据可以在高级 SIMD 和浮点寄存器与整数寄存器之间传输。
2.10. 程序状态寄存器¶
程序状态寄存器包括当前程序状态寄存器(Current Program Status Register,CPSR)、应用程序状态寄存器(Application Program Status Register,APSR)和保存的程序状态寄存器(Saved Program Status Register,SPSR)。
CPSR 保存的信息包括:
- 可由特定指令设置并决定其他指令行为的标志(flags)。
- 反映处理器当前模式和其他状态的状态位(status bits)。
- 决定例如中断屏蔽和数据字节序的控制位(control bits)。
CPSR 中的许多位具有受限用途,只能:
- 在特权模式下修改。
- 作为异常或异常返回的副作用修改。
呈现给在异常级别 EL0 上运行的应用程序的 CPSR 视图称为 APSR。
异常可以进入的每个模式都有自己的 SPSR。每个 SPSR 用于在发生异常时保存 CPSR 的副本,以便在异常返回时恢复。
2.11. 数据类型¶
Armv8-R 架构内核支持以下整数数据类型:
- 字节(Byte,8 位)。
- 半字(Halfword,16 位)。
- 字(Word,32 位)。
- 双字(Doubleword,64 位)。
Armv8-R 架构还支持半精度、单精度和双精度浮点数据类型。
2.12. 内存模型¶
Armv8-R 架构定义了 PMSAv8 内存模型,该模型确定:
- 对指令和数据的内存访问如何执行的排序规则和其他限制。
- 内存访问的权限和其他属性,以及 MPU 如何确定这些权限和属性。
Cortex®-R52+ 支持 PMSAv8,并且没有 MMU 或地址转换能力。尽管 MPU 不执行任何实际的转换,该功能仍被统称为转换(translation)。这是因为物理地址始终与虚拟地址相同。虚拟地址和物理地址分别指转换过程之前(由指令生成)和转换过程之后(总线上可见)的地址。对于 Cortex®-R52+,虚拟地址和物理地址可以视为同义词。
2.13. GIC 架构¶
Cortex®-R52+ 处理器支持 GIC 架构的三个组件:分发器(Distributor)、重分发器(Redistributor)和 CPU 接口(CPU interface)。
分发器 包含支持 SPI 的寄存器,以及为每个内核计算最高优先级挂起中断的优先级逻辑。重分发器 包含支持 PPI 和 SGI 的寄存器。CPU 接口 跟踪当前运行优先级和虚拟中断,并确定内核是否被中断。
中断可以配置为边沿触发(edge-triggered)或电平敏感(level-sensitive)。每个中断都有可编程的使能、优先级(0-31)、组(0 或 1)和路由(仅 SPI)配置,以及一个当前状态。
当收到中断信号时,该中断被挂起(pended)。根据其配置,挂起的中断可能会中断内核的执行。软件可以读取中断的 ID,这一操作会产生将其激活的副作用。软件也可以结束中断,这会将其去激活(deactivates)。
虚拟中断由虚拟机管理程序软件写入 CPU 接口中的列表寄存器(list register)创建,通常是对物理中断的响应。虚拟中断的处理方式与物理中断类似,但只能在内核处于 EL0 或 EL1 时中断内核。当虚拟中断被去激活时,可以将其配置为在虚拟中断去激活时,也向 GIC 分发器发送相应的物理去激活消息。
相关参考
1.4 支持的标准(第 1-24 页)。