D7 The AArch64 System Level Memory Model 中文翻译
D7 The AArch64 System Level Memory Model
AArch64 系统级内存模型
译者注: 本文档是 ARM Architecture Reference Manual for A-profile architecture 中 Chapter D7 的完整中文翻译。原文来自 ARM DDI 0487 文档。翻译过程中尽量保留技术细节和术语一致性。
D7.1 关于内存系统架构(About the memory system architecture)
D7.1 关于内存系统架构
ARM架构支持不同的内存系统微架构和内存层次结构的实现方案,具体取决于所实现系统的需求。在这方面,内存系统架构描述了一个进行实现的设计空间。架构并未规定内存系统的特定形式。关键概念以抽象的方式呈现,使得可以在做出实现选择的同时,能够开发通用的软件例程,而这些例程无需针对特定的内存系统微架构形式。以下关于分层内存系统概念的更多信息,请参见Memory hierarchy。
如果实现了FEAT_MTE2,则除非《Memory Tagging Extension》中另有规定,否则适用于数据访问和数据的内存模型定义同样适用于分配标签(Allocation Tag)访问和分配标签。
D7.1.1 内存系统架构的形式
A-profile架构包含虚拟内存系统架构(Virtual Memory System Architecture,VMSA)。AArch64虚拟内存系统架构描述了AArch64视角下的VMSA。
D7.1.2 内存属性
《Memory types and attributes》描述了内存属性,包括不同内存类型如何具有不同的属性。内存中的每个位置都有一组内存属性,页表定义了虚拟内存位置以及每个位置的属性。
表D7-1显示了系统层面可见的内存属性。
表D7-1 内存属性概要
| 内存类型 | 可共享性(Shareability) | 可缓存性(Cacheability) |
|---|---|---|
| Devicea | Outer Shareable(外部可共享) | Non-cacheable(不可缓存) |
| Normal | 以下之一: | 以下之一b: |
| • Non-shareable(非可共享) | • Non-cacheable(不可缓存) | |
| • Inner Shareable(内部可共享) | • Write-Through Cacheable(写通可缓存) | |
| • Outer Shareable(外部可共享) | • Write-Back Cacheable(写回可缓存) |
注解:
a. Device类型需要额外的属性,参见Device memory。
b. 另请参见Cacheability、cache allocation hints和cache transient hints。
译者注: 在ARM架构中,内存属性决定了处理器如何访问内存以及缓存的一致性行为。Device类型用于访问外设等不需要缓存的内存区域,而Normal类型用于普通内存访问。Shareability属性定义了多核系统中内存访问的一致性范围:Non-shareable表示只有单个处理器或核心可见;Inner Shareable表示在内部共享域内保持一致性;Outer Shareable则覆盖更大的共享范围。Cacheability属性则决定了数据是否可以被缓存以及使用何种缓存策略(Write-Through或Write-Back)。
有关可缓存性和可共享性的更多信息,请参见《Shareable Normal memory》、《Non-shareable Normal memory》和《Caches and memory hierarchy》。
M.b
The AArch64 System Level Memory Model
D7.2 Address space
D7.2 地址空间(Address space)
译者注: 本节描述ARMv8-A架构中地址空间的基本概念,包括虚拟地址(VA)和物理地址(PA)的支持机制。
该架构旨在支持具有不同内存需求的广泛应用。它支持多种物理地址(PA)大小,并提供相应的控制和识别机制。更多信息请参阅”已实现的物理地址大小”(Implemented physical address size)。
D7.2.1 虚拟地址空间溢出(Virtual address space overflow)
当PE执行简单顺序执行(Simple sequential execution)指令时,它计算:
1 | address_of_next_instruction = address_of_current_instruction + size_of_executed_instruction |
在每条指令执行后执行此计算,以确定下一条要执行的指令。
如果在执行一条指令后进行的地址计算溢出 0xFFFF_FFFF_FFFF_FFFF,则程序计数器(program counter)变为 UNKNOWN(未知)。类似地,如果基于链接寄存器(link register)或异常链接寄存器(exception link register)值的程序计数器进行的地址计算溢出 0xFFFF_FFFF_FFFF_FFFF,则这些寄存器的值也变为 UNKNOWN。
译者注: UNKNOWN 是ARM架构中的一种状态,表示该值是未知的或不可预测的。这与UNDEFINED(未定义)或RESERVED(保留)有区别,UNKNOWN意味着硬件可能返回任意值,软件不应依赖该值做任何决策。
注意
地址标签(address tags)不会传播到程序计数器,因此标签不会影响地址计算。
译者注: ARMv8.5-A引入了MTE(Memory Tagging Extension,内存标签扩展),允许在地址中嵌入标签。但这些标签仅用于安全检查,不会参与地址的算术运算。
当一条指令访问的连续字节集在未使用标签地址时跨越了 0xFFFF_FFFF_FFFF_FFFF 边界,或在使用标签地址时跨越了 0xXXFF_FFFF_FFFF_FFFF 边界,则该边界以上字节所访问的虚拟地址为 UNKNOWN。
UNKNOWN 虚拟地址行为也适用于由SVE和SME预测型(predicated)连续加载和存储所寻址的字节集,即使这些字节集跨越了 0xFFFF_FFFF_FFFF_FFFF 边界,即使边界以下的所有虚拟地址对应于非活跃元素(Inactive elements)的情况。相反,对于SVE聚集加载(gather loads)和分散存储(scatter stores),UNKNOWN 地址行为仅适用于跨越边界且对应于单个活跃元素(Active element)的访问。
译者注: SVE(Scalable Vector Extension,可扩展向量扩展)和SME(Scalable Matrix Extension,可扩展矩阵扩展)是ARM的向量/矩阵处理扩展。活跃元素指的是在预测(predication)机制下实际参与运算的元素,非活跃元素则被跳过。聚集加载和分散存储是SVE中用于非连续内存访问的指令,它们的行为与连续访问不同。
当使用标签地址时,与地址关联的标签值也变为 UNKNOWN。
注意
译者注: 此处说明本节描述的行为仅适用于具有两个VA范围的转换机制(translation regime)中,较高VA范围的上边界。对于较低VA范围顶部的地址计算,不适用这些行为。ARM架构支持虚拟地址空间的分割,例如在EL2和EL3级别可能存在不同的VA范围配置。
本节描述的行为仅适用于具有两个VA范围的转换机制中,较高VA范围的上边界。它们不适用于与较低VA范围顶部相关的地址计算。
D7.3 AArch64中的混合端序支持(Mixed-endian support in AArch64)
提供了一个控制位SCTLR_EL1.E0E,用于控制在EL0执行时产生的显式数据访问的端序(endianness),使其能够独立于在EL1执行时产生的显式数据访问的端序。表D7-2展示了显式数据访问以及转换表遍历(translation table walks)的端序。
表 D7-2 端序支持
| 异常级别 | 显式数据访问 | 阶段1转换表遍历 | 阶段2转换表遍历 |
|---|---|---|---|
| EL0 | SCTLR_EL1.E0Eᵃ | SCTLR_EL1.EE | SCTLR_EL2.EE |
| EL1 | SCTLR_EL1.EE | SCTLR_EL1.EE | SCTLR_EL2.EE |
| EL2 | SCTLR_EL2.EE | SCTLR_EL2.EE | 不适用 |
| EL3 | SCTLR_EL3.EE | SCTLR_EL3.EE | 不适用 |
**译者注:**ᵃ 当HCR_EL2.{E2H, TGE}的有效值为{1, 1}时,控制权来自SCTLR_EL2.E0E。
注意
SCTLR_EL1.E0E对在EL1执行时由非特权内存访问指令生成的显式内存效应(Explicit Memory Effects)的端序没有影响。
AArch64状态为端序支持提供以下选项:
• 所有异常级别均支持混合端序(mixed-endianness):
— SCTLR_ELx.EE、SCTLR_EL1.E0E和SCTLR_EL2.E0E为可读写(RW)。
• 仅EL0支持混合端序,EL1、EL2和EL3仅支持小端序(little-endianness):
— SCTLR_ELx.EE为RES0,SCTLR_EL1.E0E和SCTLR_EL2.E0E为可读写(RW)。
• 仅EL0支持混合端序,EL1、EL2和EL3仅支持大端序(big-endianness):
— SCTLR_ELx.EE为RES1,SCTLR_EL1.E0E和SCTLR_EL2.E0E为可读写(RW)。
• 所有异常级别仅支持小端序:
— SCTLR_ELx.EE、SCTLR_EL1.E0E和SCTLR_EL2.E0E均为RES0。
• 所有异常级别仅支持大端序:
— SCTLR_ELx.EE、SCTLR_EL1.E0E和SCTLR_EL2.E0E均为RES1。
译者注: RES0表示该位预留且必须保持为0;RES1表示该位预留且必须保持为1。
如果使用AArch32的异常级别实现了混合端支持,端序由PSTATE.E控制。对于返回AArch32状态的异常返回,PSTATE.E从SPSR_ELx.E复制。如果目标异常级别仅支持小端访问,则SPSR_ELx.E为RES0。如果目标异常级别仅支持大端访问,则SPSR_ELx.E为RES1。在AArch64状态中,PSTATE.E被忽略。
BigEndian()函数确定当前异常级别和执行状态是否使用大端数据。该函数在A-profile架构伪代码中定义。
有关Arm架构中端序的更多信息,请参阅端序支持(Endian support)。
M.b (非机密)
D7.4 内存加密上下文(Memory Encryption Contexts)
D7.4 内存加密上下文
IQLZZR 内存加密上下文扩展(MEC Extension)向所有PA空间引入内存加密上下文(MEC)。多个内存加密上下文被提供用于Realm物理地址空间,可分配给Realm虚拟机,其策略由Realm EL2控制。Root、Secure和Non-Secure物理地址空间每个只有一个上下文。
RLZNNK 本节及子节中的所有陈述都需要实现FEAT_MEC。
D7.4.1 内存加密上下文ID
INCBSV 内存加密上下文ID(MECID)用于将内存访问与MEC关联。
ITMSCH 关联的MEC基于当前Security状态、异常级别和转换配置。
RDWCZM MEC由PA空间和MECID的元组唯一标识。
RPNKQV 所有内存访问,除了PA空间和PA之外,还与MECID关联。
ILGNTZ 与MECID关联的内存访问包括读取、推测读取、写入、原子操作、指令取法和转换表查找。
RZSBJB 每个PA空间都有一个默认MECID,定义为零的MECID。
IGHVCX 对于支持内存加密的PA空间,与默认MECID(零)关联的内存访问会被加密。
RJQXXL Non-secure、Secure和Root PA地址空间每个仅支持一个MEC。
RRWTKJ 对Non-secure、Secure和Root PA空间的访问与默认MECID(零)关联。
RTPDCN Realm PA空间支持多个MEC。
IRMWYN 对Realm PA空间的访问可以与多个MECID关联。
RMWFGC 对于Realm PA空间的访问,MECID值0等效于默认MECID(零)。
IKZJFJ 每个MECID绑定到一个用于加密内存位置的加密上下文。一个MECID可以为不同资源绑定到不同的加密上下文。例如,多个存储体可以具有独立的加密引擎和独立密钥。
IXJZYD MECID值不是系统全局标识符,必须由PA空间限定。
RTRNQY 设备如何解释与寄存器读取或写入关联的MECID是实现定义的(IMPLEMENTATION DEFINED)。
IMXBDR 设备预计不是MECID感知的。
IWVTBQ MECD在每个支持的执行上下文和转换机制的系统寄存器中配置。
IVVJGP 软件可以独立于VMID和ASID分配来管理MECID分配。
D7.4.1.1 MECID宽度
RWVFDT MECID宽度为1至16位。
RRBXBC 对于PE,支持的MECID具有由MECIDR_EL2.MECIDWidthm1指定的实现定义位宽。
IQDYKJ 可以集成支持不同宽度MECID的系统组件。公共MECID宽度是整个系统支持的最小MECID宽度。
IBKQHQ 如果公共MECID宽度小于MECIDR_EL2.MECIDWidthm1报告的值,则软件应该用零填充高位。
IHGBXB 由于MECID宽度具有有限大小,预期MECID在运行系统的整个生命周期中被使用和重用。
译者注: MECID宽度决定了系统中可用的内存加密上下文数量上限。例如,4位MECID可支持16个不同的上下文值(0-15),其中0保留为默认上下文。
D7.4.1.2 MECID不匹配
IQBBQC 如果与内存位置访问关联的MECID不同于该位置在缓存中副本关联的MECID,则在该缓存中发生MECID不匹配。MECID不匹配可能因任何内存访问而发生,包括显式读取访问、显式写入访问、推测读取访问、指令取法和转换表查找。
IYDGXJ MECID不匹配由软件配置错误引起,例如:
- 多个转换表映射到具有不同关联MECID值的PA。
- 重新分配MECID值给粒度时缓存维护操作不足。
- 更新MECID寄存器或MEC配置时TLB维护和屏障不足。
- 使用的公共MECID宽度对系统来说过大。
IGWPRT 如果MECIDR_EL2.MECIDWidthm1宽于公共MECID宽度,则可能发生以下所有情况:
- 存储系统表现出由于MECID不匹配而导致的行为。
- MECID的别名集合导致内存加密不唯一。
IBLZTF MECID不匹配的内存访问可能导致跨上下文的数据损坏和/或数据泄漏。
IBVDCG 从MECID不匹配中恢复需要软件纠正配置状态,并对可能暴露于MECID不匹配的所有内存执行清除并使其失效到PoE。
译者注: MECID不匹配是严重的安全性和正确性问题。当不同加密上下文的 data 被错误地缓存到同一缓存行时,会导致数据损坏或加密密钥泄露。PoE(Point of Eviction)是缓存逐出点。
D7.4.2 内存加密块大小
IZQSGL 内存加密引擎用于加密数据的块大小取决于算法。对某个位置的内存写入会更新整个加密数据块。
RLTWYZ 内存加密数据块大小不允许大于支持的最小转换粒度大小。
IRGMPP 两个或多个具有不同MECID值的内存写入,如果写入同一最小支持转换粒度内的位置,可能会损坏整个粒度。
译者注: 内存加密以块为单位进行操作。如果两个不同MECID的写入操作作用于同一粒度(如4KB页面)内的不同位置,由于加密引擎以块(如64字节)为单位进行加密,这会导致加密块级别的数据损坏。
D7.4.3 关于推测执行效果的限制
RKLWFT MECID系统寄存器与相应的转换机制关联。
IPMLCM 对于任何超出上下文的转换机制,PE不会将配置MECID值用于推测性内存访问。对于推测性内存访问,架构要求以下所有内容:
- 当在EL3或EL2执行时,PE不得使用与EL1&0转换机制关联的寄存器。
- 当在EL3执行时,PE不得使用与EL2或EL2&0转换机制关联的寄存器。
译者注: “超出上下文”(out-of-context)指的是当前执行级别与目标转换机制不匹配的情况。例如在EL3执行时,EL1&0的转换机制对当前执行来说是超出上下文的。这种设计防止了推测性内存访问使用错误的MECID配置,从而避免加密数据泄露到错误的上下文中。
翻译说明:
- 所有ARM文档标签ID(如IQLZZR、RTRNQY等)已完整保留
- 技术术语已按要求保持一致:Memory Encryption Context=内存加密上下文,MECID=内存加密上下文ID,FEAT_MEC=内存加密上下文特性
- 译者注使用
> **译者注:**格式添加在相关段落之后 - 本节内容未涉及表格或图片,故无需创建占位符
D7.5 缓存支持(Cache support)
D7.5 缓存支持
本节描述缓存识别和控制机制,以及A64缓存维护指令,包括以下小节:
- 缓存的一般行为
- 缓存识别
- 缓存性、缓存分配提示和缓存瞬态提示
- 启用和禁用内存访问的缓存
- 复位时缓存的行为
- 不可缓存访问和指令缓存
- 关于AArch64状态下的缓存维护
- A64缓存维护指令
- 数据缓存清零指令
- 缓存锁定
- 系统级缓存
- 分支预测
- 执行、数据预测和预取限制系统指令
另见Caches(缓存)。
D7.5.1 缓存的一般行为
当一个内存位置具有Normal Cacheable内存属性时,确定该内存位置的副本是否保存在缓存中仍然取决于实现的许多方面。以下非穷举的因素列表可能涉及:
- 缓存的大小、行长度和关联度
- 缓存分配算法
- 可以访问内存的系统其他元素的活动
- 推测性指令预取算法
- 推测性数据预取算法
- 中断行为
鉴于这些因素以及可能实现的大量缓存系统,架构无法保证:
- 存在于缓存中的内存位置仍然留在缓存中
- 不存在于缓存中的内存位置会被带入缓存
相反,以下原则适用于缓存的行为:
- 架构有一个缓存中锁定的条目的概念。如何实现锁定是IMPLEMENTATION DEFINED(实现定义的),并且锁定可能不被以下情况支持:
- 特定实现
- 某些内存属性
- 缓存中的未锁定条目可能不会留在该缓存中。架构不保证未锁定的缓存条目留在缓存中或与内存的其余部分保持不一致。软件不得假设留在缓存中的未锁定项目保持脏状态。
- 缓存中的锁定条目保证留在该缓存中。架构不保证锁定的缓存条目与内存的其余部分保持不一致,也就是说,它可能不会保持脏状态。
译者注:
- “脏”(dirty)状态指缓存中的数据已被修改,但尚未写回到主内存
- 锁定机制允许某些缓存行被锁定在缓存中不被逐出,用于性能关键型代码
注意
更多信息参见缓存锁定与缓存维护指令的交互。
- 任何在当前异常级别或更高异常级别具有Normal Cacheable属性的内存位置都可以随时分配到缓存。
- 保证如果一个内存位置在以下任一翻译机制中不具有Normal Cacheable属性,则不会将其分配到数据缓存或统一缓存:
- 当前异常级别的翻译机制
- 任何更高异常级别的翻译机制
- 对于数据访问,任何具有Normal Inner Shareable或Normal Outer Shareable属性的内存位置保证在其共享性域内与所有Requester保持一致。
- 不保证任何内存位置与内存的其余部分保持不一致。
- 从缓存级别逐出缓存条目可能覆盖已被另一个observer写入的内存,但仅当该条目包含的内存位置已被共享性域中对该内存位置写入的observer写入时。最大可覆盖的内存大小称为Cache Write-back Granule(缓存回写粒度)。在某些实现中,CTR_EL0标识Cache Write-back Granule。
- 将内存位置分配到缓存不会导致该内存位置的最新的值对observer变得不可见,如果它之前对该observer可见的话。
译者注:
- PoC(Point of Coherency,一致性点):所有访问内存的代理保证看到内存位置相同副本的点
- Cache Write-back Granule:定义单次回写操作能覆盖的最大内存区域
注意
一个地址的缓存性属性由该地址适用的翻译表条目决定,经由任何适用的系统寄存器缓存性控制修改,如SCTLR_EL1.{I, C}控制。
出于这些原则的目的,缓存条目覆盖至少16字节且不超过2KB的连续地址空间,按缓存条目的大小对齐。
D7.5.2 缓存识别
缓存识别寄存器描述了在PE上执行的缓存维护指令所影响的已实现缓存。这包括以下缓存维护指令:
- 影响整个缓存的指令,例如IC IALLU
- 按VA操作的指令,例如IC IVAU
- 按set/way操作的指令,例如DC ISW
缓存识别寄存器包括:
缓存类型寄存器CTR_EL0,定义:
- 指令缓存维护指令所影响的任何指令缓存的最小行长度
- 数据缓存维护指令所影响的数据或统一缓存的最小行长度
- 1级指令缓存的缓存索引和标记策略
注意
是否报告超出PoC的缓存是IMPLEMENTATION DEFINED的,并且由于可能存在系统缓存,在PoC之前的某些缓存可能不会被报告。有关系统缓存的更多信息,请参见系统级缓存。单个缓存级别ID寄存器CLIDR_EL1,定义:
- 实现的缓存类型,可以使用按set/way操作或在整个缓存上操作的架构缓存维护指令在每个缓存级别进行维护,最多七级
- 缓存的一致性级别(LoC)。参见描述缓存维护指令所用的术语中LoC的定义
- 缓存的统一级别单处理器(LoUU)。参见描述缓存维护指令所用的术语中LoUU的定义
- 可选的ICB字段,用于指示用于缓存内部缓存性内存区域的缓存与仅用于缓存外部缓存性区域的缓存之间的边界
单个缓存大小选择寄存器CSSELR_EL1,选择当前缓存大小识别寄存器的缓存级别和类型(指令、数据/统一/标签)
对于通过此机制可识别的每个已实现缓存(在所有缓存级别中),一个缓存大小识别寄存器CCSIDR_EL1,定义:
- 缓存的组数、关联度和行长度。参见描述缓存维护指令所用的术语中这些术语的定义
注意
从Armv8.3起,支持多种格式的缓存大小识别寄存器。更多信息参见缓存大小识别寄存器CCSIDR_EL1的可能格式。
要确定与PE关联的缓存拓扑:
- 读取缓存类型寄存器以找到1级指令缓存使用的索引和标记策略。该寄存器还提供指令缓存和数据及统一缓存使用的最小缓存行大小。这些值用于缓存维护指令。
- 读取缓存级别ID寄存器以找出实现了哪些缓存。该寄存器包括七个缓存类型字段,用于缓存级别1到7。从级别1开始扫描这些字段,识别每个级别实现的指令、数据或统一缓存。当到达没有定义缓存的级别时,扫描结束。缓存级别ID寄存器还指定缓存实现的统一级别(LoU)和一致性级别(LoC)。
- 对于在阶段2中识别的每个缓存:
- 写入缓存大小选择寄存器以选择所需的缓存。缓存由其级别以及它是以下哪种类型标识:
- 指令缓存
- 数据或统一缓存
- 读取缓存大小识别寄存器以获取缓存的详细信息
- 写入缓存大小选择寄存器以选择所需的缓存。缓存由其级别以及它是以下哪种类型标识:
D7.5.2.1 缓存大小识别寄存器CCSIDR_EL1的可能格式
从Armv8.3起,缓存大小识别寄存器CCSIDR_EL1有两种不同的格式可用于定义缓存的组数和关联度。关于这些术语的定义,请参见描述缓存维护指令所用的术语。
当实现了FEAT_CCIDX时:
- CCSIDR_EL1是一个64位寄存器
- CCSIDR_EL1.Assoc字段的长度为21位。这将当前所选缓存的关联度限制为2^21
- CCSIDR_EL1.NumSets字段的长度为24位。这将当前所选缓存的组数限制为2^24
这是缓存大小识别寄存器的64位格式。
当未实现FEAT_CCIDX时:
- CCSIDR_EL1是一个32位寄存器
- CCSIDR_EL1.Assoc字段的长度为10位。这将当前所选缓存的关联度限制为2^10
- CCSIDR_EL1.NumSets字段的长度为15位。这将当前所选缓存的组数限制为2^15
这是缓存大小识别寄存器的32位格式。
当实现了其中一种格式时,它在所有缓存级别中实现。
D7.5.3 缓存性、缓存分配提示和缓存瞬态提示
缓存性仅适用于Normal内存,可以为内部和外部缓存位置独立定义。所有类型的Device内存始终被视为不可缓存。
如内存类型和属性中所述,内存属性包括以下缓存性属性之一:
- 不可缓存(Non-cacheable)
- 写通缓存(Write-Through cacheable)
- 写回缓存(Write-Back cacheable)
除不可缓存外的缓存性属性可以与缓存分配提示配合使用。这是向内存系统发出的关于将值分配到缓存是否可能提高性能的指示。此外,IMPLEMENTATION DEFINED是否支持缓存瞬态提示,参见瞬态缓存性提示。
缓存分配提示独立地为读和写访问分配,因此在支持瞬态提示时,可以分配以下缓存分配提示:
对于读访问:读分配(Read-Allocate)、瞬态读分配(Transient Read-Allocate)或无读分配(No Read-Allocate)
对于写访问:写分配(Write-Allocate)、瞬态写分配(Transient Write-Allocate)或无写分配(No Write-Allocate)
注意
- 同时具有无读分配和无写分配提示的缓存位置与不可缓存位置不同。不可缓存位置对系统内所有observer具有一致性保证,这对于缓存性、无读分配、无写分配的位置不适用。
- 实现可以使用缓存分配提示将缓存污染限制在缓存的一部分,例如限制在一组路(way)的子集中。
- 对于VMSAv8-64翻译表遍历,TCR_ELx.{IRGNn, ORGNn}字段定义翻译表的内存属性,包括缓存性。然而,此分配仅支持本节描述的缓存性属性的子集。
架构不要求实现使用任何缓存分配提示。这意味着实现可能不会在仅因缓存分配提示不同的属性内存位置之间做出任何区分。
D7.5.3.1 瞬态缓存性提示
在Armv8中,是否支持瞬态提示是IMPLEMENTATION DEFINED的。在支持瞬态提示的实现中,瞬态提示是缓存分配提示的限定符,表示缓存的益处持续相对较短的时间。它表明可能最好限制瞬态条目的分配,以避免可能逐出其他较不瞬态的条目。
注意
架构未指定”相对较短的时间”意味着什么。
对AArch64 MAIR_EL1、MAIR_EL2和MAIR_EL3寄存器以及AArch32 MAIR0、MAIR1、HMAIR0和HMAIR1寄存器的描述包括在支持此选项的实现中对瞬态提示的分配。在此分配中:
- 瞬态提示独立地为内部缓存性和外部缓存性内存区域定义
- 单个瞬态提示适用于对内存区域的读和写访问
D7.5.4 可缓存MEC事务
RKLLJD 本节及子节中的所有声明都需要实现FEAT_MEC。
INWLXR 每个缓存级别可以独立实现本节描述的行为。
RNMSQG 任何具有Normal Cacheable属性的内存位置都可以分配到缓存,与提供该Normal Cacheable属性的翻译的MECID关联。
RFKNTM 在允许将Normal不可缓存内存缓存在指令缓存中的情况下,它与提供不可缓存属性的翻译的MECID关联。
IRDDXP Normal内存的推测性分配仅从当前异常级别或更高异常级别发生。
RMVGSH 如果由于写访问或缓存回写将Normal内存位置分配到缓存条目,则该缓存条目与该写访问的MECID关联。
RKZCZX 如果由于写访问或缓存回写更新了Normal内存位置的缓存条目,则可以选择是否将缓存条目与该写访问的MECID关联。如果实现了FEAT_RME_GDI,且PA空间是System Agent(SA)或Non-secure Protected(NSP),则在写访问或缓存回写时MECID值会更新。
RPJNMC 如果写访问目标是已缓存且与不同MECID关联的位置,且写访问小于Cache writeback granule,则:
- 如果PA空间不是SA或NSP,发生以下一种CONSTRAINED UNPREDICTABLE行为:
- 写访问成功,位置内容变为UNKNOWN,且与缓存条目关联的MECID值被更新
- 写访问成功,就好像MECID值没有不匹配一样,且是否更新与缓存条目关联的MECID值是OPTIONAL的
- 写访问成功,写入位置的内容被更新,Cache writeback granule内未写入的位置变为UNKNOWN,且与缓存条目关联的MECID值被更新
- 如果PA空间是SA或NSP,则写访问成功,写入位置的内容被更新,Cache writeback granule内未写入的位置变为UNKNOWN,且与缓存条目关联的MECID值被更新。
RVXMVW 如果读访问(包括数据读、指令取或翻译表查找)目标是已缓存且与不同MECID关联的位置,则:
- 如果PA空间不是SA或NSP,发生以下一种CONSTRAINED UNPREDICTABLE行为:
- 读访问返回的数据为UNKNOWN
- 读访问成功,就好像MECID值没有不匹配一样
- 如果PA空间是SA或NSP,则读访问返回的数据为UNKNOWN
IHJXYJ Arm建议在RPJNMC和RVXMVW中使用全1作为UNKNOWN数据的值。
IMWGQN FEAT_RME_GDI将MEC提升为NSP和SA PA空间内跨上下文的主要安全机制。RKZCZX、RPJNMC、RVXMVW和IHJXYJ旨在防止跨上下文的缓存明文数据泄漏。它们不防止跨上下文的数据损坏。
RNTHZN 导致UNKNOWN数据的MECID不匹配不会导致MECID之间的明文数据泄漏。
ITYGBH 如果缓存检测到MECID不匹配,则允许记录PA和不匹配的MECID并生成IMPLEMENTATION DEFINED中断。
RBSTPQ 无论目标位置是否加密,将Normal Cacheable内存访问与MECID关联都是必需的。
D7.5.5 启用和禁用内存访问的缓存
缓存性控制字段可以强制所有具有Normal内存类型的内存位置被视为不可缓存,无论其分配的缓存性属性如何。为每个地址翻译阶段提供独立控制,分别为以下各项提供单独控制:
- 数据访问。这些控制也适用于对翻译表的访问
- 指令访问
注意
这些缓存性控制取代了先前版本Arm架构中提供的缓存启用控制。
缓存性控制字段及其效果如下:
对于EL1&0翻译机制
- 当SCTLR_EL1.C的值为0时:
- 所有对Normal内存的数据访问的阶段1翻译都是不可缓存的
- 所有对EL1&0阶段1翻译表的访问都是不可缓存的
- 当SCTLR_EL1.I的值为0时:
- 所有对Normal内存的指令访问的阶段1翻译都是不可缓存的
- 当HCR_EL2.CD为1时:
- 所有对Normal内存的数据访问的阶段2翻译都是不可缓存的
- 所有对EL1&0阶段2翻译表的访问都是不可缓存的
- 当HCR_EL2.ID为1时:
- 所有对Normal内存的指令访问的阶段2翻译都是不可缓存的
- 当HCR_EL2.DC为1时,所有阶段1翻译和对EL1&0阶段1翻译表的所有访问都被视为对Normal Non-shareable Inner Write-Back Cacheable Read-Allocate Write-Allocate, Outer Write-Back Cacheable Read-Allocate Write-Allocate内存的访问,无论SCTLR_EL1.{I, C}的值如何。这适用于数据和指令访问的翻译。
注意
- 阶段1和阶段2缓存性属性按组合Normal内存的阶段1和阶段2缓存性属性中所述进行组合
- SCTLR_EL1.{C, I}和HCR_EL2.DC字段对EL2、EL2&0和EL3翻译机制没有影响
- HCR_EL2.{ID, CD}字段仅影响EL1&0翻译机制的阶段2
- 实现了FEAT_XS时,SCTLR_EL1.{C, I}和HCR_EL2.{ID, CD}字段对XS属性的值没有影响
- 当EL2使用AArch64且EL1使用AArch32时,HCR_EL2.{ID, CD, DC}控制按此处所述适用,但EL1控制是SCTLR.{C, I}
对于EL2翻译机制
- 当SCTLR_EL2.C的值为0时:
- 使用EL2翻译机制对Normal内存的所有数据访问都是不可缓存的
- 对EL2翻译表的所有访问都是不可缓存的
- 当SCTLR_EL2.I的值为0时:
- 使用EL2翻译机制对Normal内存的所有指令访问都是不可缓存的
注意
- SCTLR_EL2.{I, C}字段对EL1&0和EL3翻译机制没有影响
- 实现了FEAT_XS时,SCTLR_EL2.{I, C}字段对XS属性的值没有影响
对于EL2&0翻译机制
- 当SCTLR_EL2.C的值为0时:
- 所有对Normal内存的数据访问的阶段1翻译都是不可缓存的
- 所有对EL2&0阶段1翻译表的访问都是不可缓存的
- 当SCTLR_EL2.I的值为0时:
- 所有对Normal内存的指令访问的阶段1翻译都是不可缓存的
注意
实现了FEAT_XS时,SCTLR_EL2.{I, C}字段对XS属性的值没有影响
对于EL3翻译机制
- 当SCTLR_EL3.C的值为0时:
- 使用EL3翻译机制对Normal内存的所有数据访问都是不可缓存的
- 对EL3翻译表的所有访问都是不可缓存的
- 当SCTLR_EL3.I的值为0时:
- 使用EL3翻译机制对Normal内存的所有指令访问都是不可缓存的
注意
- SCTLR_EL3{I, C}字段对EL1&0、EL2和EL2&0翻译机制没有影响
- 实现了FEAT_XS时,SCTLR_EL3.{I, C}字段对XS属性的值没有影响
此外:
- 对于EL1&0翻译机制以外的翻译机制,如果SCTLR_ELx.M的值为0,表示该翻译机制的阶段1翻译被禁用,则:
- 如果SCTLR_ELx.I的值为0,来自阶段1翻译的Normal内存指令访问是Outer Shareable、Inner Non-cacheable、Outer Non-cacheable
- 如果SCTLR_ELx.I的值为1,来自阶段1翻译的Normal内存指令访问是Outer Shareable、Inner Write-Through cacheable、Outer Write-Through cacheable
- 对于EL1&0翻译机制,如果SCTLR_EL1.M的值为0,表示该翻译机制的阶段1翻译被禁用,且HCR_EL2.DC的值为0:
- 如果SCTLR_EL1.I的值为0,来自阶段1翻译的Normal内存指令访问是Outer Shareable、Inner Non-cacheable、Outer Non-cacheable
- 如果SCTLR_EL1.I的值为1,来自阶段1翻译的Normal内存指令访问是Outer Shareable、Inner Write-Through Cacheable、Outer Write-Through Cacheable
SCTLR_ELx.C、HCR_EL2.DC和HCR_EL2.CD的效果反映在地址翻译指令在PAR中的结果中,当这些位对PAR中报告的翻译阶段有影响时。
注意
- 结合不可缓存访问和指令缓存中的要求,本节中的要求意味着SCTLR_ELx.I的架构要求效果仅限于其对统一缓存中指令访问缓存的影响
- 此规范可能导致对同一位置的指令和数据访问之间出现不同的缓存性属性。当发生这种情况时,必须遵循不匹配内存属性中所述的不匹配内存属性措施来管理相应的一致性丧失
以上为D7.5.1至D7.5.5的完整翻译。
D7.5 缓存支持(Cache support)— 第二部分
D7.5.6 复位时缓存的行为(Behavior of caches at reset)
缓存在复位时的行为如下:
- 所有缓存在复位时进入IMPLEMENTATION DEFINED状态,该状态可能为UNKNOWN。
- 缓存性控制字段(参见”启用和禁用内存访问的缓存”)复位为强制所有内存位置都按Non-cacheable处理的值。
译者注: IMPLEMENTATION DEFINED是ARM架构文档中的常用表述,意味着具体行为由处理器实现厂商定义,而非架构统一规定。UNKNOWN表示该状态值不确定,软件不应假设其初始值。
- 实现可以要求使用特定的缓存初始化例程来使其存储阵列失效,然后才能启用缓存。任何所需初始化例程的确切形式是IMPLEMENTATION DEFINED的,并且该例程必须作为设备文档的一部分清晰地记录。
- 如果实现允许在缓存性控制字段强制所有内存位置按Non-cacheable处理时发生缓存命中,则缓存初始化例程必须:
- 提供一种机制以确保缓存的正确初始化。
- 作为设备文档的一部分清晰地记录。
特别地,如果实现允许在缓存性控制字段强制所有内存位置按Non-cacheable处理时发生缓存命中,且缓存内容在复位时未被失效,则初始化例程必须避免从未初始化的缓存运行的可能性。初始化例程可以要求将固定指令序列放置在受限的内存范围内。
- Arm建议,每当需要失效例程时,应基于缓存维护指令。
参见”复位时TLB的行为”。
D7.5.7 非缓存访问和指令缓存(Non-cacheable accesses and instruction caches)
在AArch64状态下,对Non-cacheable Normal内存的指令访问可以被保存在指令缓存中。
相应地,确保指令修改可被执行的序列必须包括从指令缓存中失效修改位置的指令,即使指令保存在Normal Non-cacheable内存中。这包括System寄存器缓存性控制字段强制指令访问内存为Non-cacheable的情况。
因此,在单处理器系统中,在Non-cacheable空间中使用自修改代码时,需要以下序列:
1 | ; Enter this code with <Wt> containing the new 32-bit instruction |
在多处理器系统中,对non-cacheable位置的IC IVAU指令被广播到执行此序列的PE的Inner Shareable域内的所有PE。这是因为non-cacheable normal内存位置在架构的其他部分被当作Outer Shared处理。
译者注: DSB ISH是数据同步屏障(Inner Shareable域),确保在执行后续指令之前,所有之前的存储操作对其他observer可见。IC IVAU按虚拟地址失效指令缓存至统一点(PoU)。
可能需要额外的软件步骤来同步其他PE的线程。这可能是必要的,以便执行修改后指令的PE在完成失效后执行ISB,并避免与指令序列的并发修改和执行相关的问题。参见”指令的并发修改和执行”。
可以使用IC IALLU指令修改较大块的指令(用于单处理器系统),或使用IC IALLUIS(用于多处理器系统)。
译者注: IC IALLU失效所有指令缓存,IC IALLUIS在多处理器系统中广播失效到Inner Shareable域内的所有PE。
本节内容适用于即使缓存性控制字段强制AArch64状态下的指令访问内存为Non-cacheable的情况(如”启用和禁用内存访问的缓存”中所述)。
D7.5.8 关于AArch64状态下的缓存维护(About cache maintenance in AArch64 state)
以下各节给出缓存维护的一般信息:
- 描述缓存维护指令时使用的术语。
- 缓存层次结构的抽象。
以下各节描述A64缓存维护指令:
- 指令缓存维护指令(IC)。
- 数据缓存维护指令(DC)。
译者注: 一些缓存维护指令的描述涉及指令所操作地址的缓存性。地址的缓存性由该地址适用的转换表项决定,并由任何适用的系统寄存器缓存性控制(如SCTLR_EL1.{I, C}控制)修改。
D7.5.8.1 描述缓存维护指令时使用的术语(Terms used in describing the cache maintenance instructions)
内存位置是关联于特定地址空间中的地址的字节。例如,Root物理地址空间中的地址0x1000是与Secure物理地址空间中的地址0x1000不同的内存位置。
术语”资源(Resource)”指可以在一个或多个内存位置访问的物理实体。与物理地址空间关联的资源可在该物理地址空间中访问。
译者注:
资源的例子包括:
- 一个MMIO寄存器,可在Non-secure物理地址空间中地址0x2000的内存位置访问,也可在Secure地址空间中地址0x2000的内存位置访问。
- 一个SRAM,只能在Root物理地址空间中地址0x3000的内存位置访问。
- 可以存在于固定地址但在由配置选项决定的不同的物理地址空间中的内存字节。
缓存维护指令被定义为作用于特定的内存位置。根据指令类型,作用域定义为以下之一:
- 通过要维护的内存位置的虚拟地址进行操作,称为按VA操作。
- 通过要维护的内存位置的物理地址进行操作,称为按PA操作。
- 通过描述缓存在硬件中位置的方法进行操作,称为按set/way操作。
此外,对于指令缓存,有些指令会失效所有条目。
以下子节定义缓存维护指令描述中使用的术语:
- 按set/way操作的缓存维护指令的术语。
- Clean、Invalidate和Clean and Invalidate指令的术语。
译者注: 没有专门针对按VA操作的缓存维护指令的术语。当所有适用的转换阶段被禁用时,使用的VA与PA相同。关于禁用地址转换阶段时的内存系统行为,参见”禁用地址转换阶段的影响”。
D7.5.8.1.1 按set/way操作的缓存维护指令的术语(Terminology for cache maintenance instructions operating by set/way)
按set/way操作的缓存维护指令涉及缓存中的特定结构。三个参数描述指令在缓存层次结构中工作的位置:
Level(级别)
缓存层次结构的缓存级别。缓存级别数目是IMPLEMENTATION DEFINED的。可以使用按set/way操作的结构化缓存维护指令管理的缓存级别可从CLIDR_EL1确定。
在Arm架构中,较低编号的缓存级别是离PE最近的。参见”内存层次结构”。
Set(组)
缓存的每个级别被分成若干组。每个组是缓存级别中可分配给地址的一组位置。通常,组号是地址的IMPLEMENTATION DEFINED函数。
在Arm架构中,组从0开始编号。
Way(路)
缓存的关联性是组中特定地址可以分配到的位置数目。路号指定这些位置之一。
在Arm架构中,路从0开始编号。
译者注: 由于内存地址到缓存位置的分配完全是IMPLEMENTATION DEFINED的,Arm期望大多数可移植软件只将按set/way的缓存维护指令作为在例程中执行维护整个缓存的单个步骤使用。
D7.5.8.1.2 Clean、Invalidate和Clean and Invalidate指令的术语(Terminology for Clean, Invalidate, and Clean and Invalidate instructions)
缓存在两个可能的方向上引入一致性问题:
- 通过访问缓存的PE对内存位置的更新可能对可以访问内存的其他observer不可见。这是因为新更新仍在缓存中,尚未对不访问该缓存的其他observer可见。
- 可以访问内存的其他observer对内存位置的更新可能对访问缓存的PE不可见。这是因为缓存包含内存位置的旧副本或过时副本已被更新。
Clean和Invalidate指令解决这两个问题。这些指令的定义如下:
Clean
缓存clean指令确保由控制缓存的observer进行的更新对在指令执行到的点访问内存的其他observer可见。一旦Clean完成,新的内存值保证对执行到的点是可见的,例如到统一点(Point of Unification)。
从缓存中clean缓存条目只有在以下情况下才能覆盖由另一个observer写入的内存:该条目包含已被shareability域中访问该内存位置的observer写入的位置。
Invalidate
缓存invalidate指令确保由在指令定义到的点访问内存的observer所做的更新对控制缓存的observer可见。如果这些更新自写入以来尚未从缓存clean,则invalidate指令可能导致invalidate指令影响的那些位置更新的丢失。
如果invalidate指令操作的条目的地址是Normal、Non-cacheable或任何类型的Device内存,则invalidate指令还确保该地址不在缓存中。
译者注: 地址为Normal Cacheable的条目可以随时分配到缓存,因此缓存invalidate指令无法确保该地址不在缓存中。
Clean and Invalidate
缓存clean and invalidate指令的行为如同立即对同一位置执行clean指令后跟随invalidate指令。两个指令都执行到相同的位置。
缓存维护指令可以定义到的点因指令是按VA还是按set/way操作而异:
- 对于按set/way操作的指令,点定义为到下一级缓存。对于All操作,点定义为对于缓中保存的每个位置到统一点(PoU)。
- 对于按VA操作的指令:
- FEAT_OCCMO实现的指令操作到外部缓存级别。
- 对于所有其他按VA操作的指令,定义了以下概念点:
一致点(Point of Coherency, PoC)
保证所有可以访问内存的agent都能看到内存位置相同副本的点,适用于任何内存类型或缓存性属性的访问。在许多情况下,这实际上是主系统内存,尽管架构不禁止实现超出PoC但不影响内存系统agent之间一致性的缓存。
译者注: 系统缓存的存在可能影响一致点的确定,参见”系统级缓存”。
物理别名点(Point of Physical Aliasing, PoPA)
在特定资源的一个内存位置所做的更新对该资源所有其他内存位置可见的点,适用于对该点的任何内存类型或缓存性属性的访问,以及所有可以访问内存的agent。PoPA与PoC之间的关系是,将写入的内存位置clean到PoPA意味着系统中没有任何agent能够通过随后对PoC执行invalidate操作来揭示该内存位置的旧值。
加密点(Point of Encryption, PoE)
内存系统中任何已到达该点的写入使用与该写入关联的MECID进行加密的点。
到PoPA的缓存维护操作足以影响PoE之前的所有缓存。
统一点(Point of Unification, PoU)
对于PE,PoU是指该PE的指令缓存和数据缓存及其转换表walk保证看到内存位置相同副本的点。在许多情况下,统一点是单处理器内存系统中指令缓存和数据缓存及转换表walk已合并到的点。
对于Inner Shareable共享性域,PoU是指该Inner Shareable共享性域中所有PE的指令缓存和数据缓存及转换表walk保证看到内存位置相同副本的点。定义此点允许自修改软件通过使用以下标准正确性策略确保未来的指令获取与软件的修改版本关联:
- 按地址clean数据缓存条目。
- 按地址invalidate指令缓存条目。
持久点(Point of Persistence, PoP)
当FEAT_DPB实现时:内存系统中如果存在某个点,在系统断电时保持对内存的写入,并在电源恢复到内存中受影响位置时可靠地恢复。
当FEAT_DPB和FEAT_DPB2实现时:内存系统中的一个点,系统内有足够的能量保证如果系统断电,对内存的写入将是持久的。
译者注: 这样的内存有时称为非易失性内存。例如,图B2-1中所示的存储类内存可用作此功能的目标内存。
深度持久点(Point of Deep Persistence, PoDP)
内存系统中的点,任何已到达该点的写入即使在电源系统瞬时硬件故障的情况下也是持久的。
物理存储点(Point of Physical Storage, PoPS)
内存层次结构中的点,从中 following a clean and invalidate of a Location to the Point of Physical Storage, the first subsequent read of the Location will always return data。
译者注: 物理存储点通常在系统中所有缓存之后,包括系统缓存,这些缓存对软件来说是不可见的,用于管理一致性。
以下CLIDR_EL1中的字段与PoC和PoU相关:
LoC,Level of Coherence(一致性级别)
此字段定义在clean或invalidate到一致点时必须被clean或invalidated的最后一个缓存级别。LoC值是一个缓存级别,因此,例如,如果LoC包含值3:
- 到一致点的clean操作需要clean第1级、第2级和第3级缓存。
- 第4级缓存是不必维护的第一个级别。
如果LoC字段值为0x0,这意味着在clean或invalidate到一致点时不需要clean或invalidate任何缓存级别。
如果LoC字段值是一个非零值但对应于未实现的级别,则表示所有已实现的缓存都在一致点之前。
LoUU,Level of Unification, uniprocessor(统一级别,单处理器)
此字段定义在clean或invalidate到PE的统一点时必须被clean的最后一个数据缓存级别,或必须被invalidated的最后一个指令缓存级别。与LoC一样,LoUU值是一个缓存级别。
如果LoUU字段值为0x0,这意味着在clean或invalidate到统一点时不需要clean或invalidate任何数据缓存级别。
如果LoUU字段值是一个非零值但对应于未实现的级别,则表示所有已实现的缓存都在统一点之前。
LoUIS,Level of Unification, Inner Shareable(统一级别,Inner Shareable)
在任何实现中:
- 此字段定义在clean或invalidate到Inner Shareable共享性域的统一点时必须被clean的最后一个数据或统一缓存级别,或必须被invalidated的最后一个指令或统一缓存级别。与LoC一样,LoUIS值是一个缓存级别。
- 如果LoUIS字段值为0x0,这意味着在clean或invalidate到Inner Shareable共享性域的统一点时不需要clean或invalidate任何数据或统一缓存级别。
- 如果LoUIS字段值是一个非零值但对应于未实现的级别,则表示所有已实现的缓存都在统一点之前。
D7.5.8.2 缓存层次结构的抽象(Abstraction of the cache hierarchy)
以下子节描述缓存层次结构的抽象:
- 按VA操作的缓存维护指令。
- 按set/way操作的缓存维护指令。
D7.5.8.2.1 按VA操作的缓存维护指令(Cache maintenance instructions that operate by VA)
基于VA的缓存维护指令被描述为按VA操作。这些指令中的每一个始终被限定为以下之一:
- 执行到一致点。
- 执行到统一点。
- 当FEAT_DPB实现时,执行到持久点。
- 当FEAT_DPB2实现时,执行到深度持久点。
- 当FEAT_PoPS实现时,执行到物理存储点。
- 当FEAT_OCCMO实现时,执行到外部缓存级别。
参见”描述缓存维护指令时使用的术语”以获取这些术语的定义,以及关于VA的可能含义的更多信息。
A64缓存维护指令列出了基于VA的维护指令。
CTR_EL0保存以下内容的最小行长度值:
- 指令缓存。
- 数据和统一缓存。
这些值支持有效invalidate一系列VA,因为此值是应用一系列基于VA的维护指令到一系列VA时使用的最有效地址步长。
对于按VA invalidate数据或统一缓存行指令,CTR_EL0的Cache Write-back Granule字段定义单个invalidate指令可以invalidate的最大粒度。此Cache Write-back Granule的含义附加定义了可以写回的最大大小。
D7.5.8.2.2 按set/way操作的缓存维护指令(Cache maintenance instructions that operate by set/way)
A64缓存维护指令列出了基于set/way的维护指令。这些指令的一些编码包含指定指令缓存级别的必需字段:
- Clean指令从指定的缓存级别clean到至少下一级缓存,向远离PE的方向移动。
- Invalidate指令仅在指定级别invalidate。
D7.5.9 A64缓存维护指令(A64 Cache maintenance instructions)
A64缓存维护指令是寄存器编码空间中A64系统指令类的一部分。关于这些系统指令的编码详情和其他一般信息,参见”系统指令、SYS和缓存维护指令以及数据缓存零操作”。
以下子节提供有关这些指令的更多信息:
- 指令缓存维护指令(IC)。
- 数据缓存维护指令(DC)。
- 缓存维护指令在EL0的可访问性。
- 维护指令作用域的一般要求。
- 按VA操作到PoC的指令效果。
- 按VA操作到外部缓存级别的指令效果。
- 按VA操作到PoP的指令效果。
- 按VA操作到PoPS的指令效果。
- 按VA操作到PoU的指令效果。
- All和set/way维护指令的效果。
- 虚拟化和安全状态对缓存维护指令的影响。
- 缓存维护指令的边界条件。
- 数据和指令缓存指令的排序和完成。
- 执行缓存维护指令。
D7.5.9.1 指令缓存维护指令(IC)(The instruction cache maintenance instruction (IC))
系统指令描述了此指令的A64汇编语法。
当IC指令需要地址参数时,这采用持有VA参数的64位寄存器的形式。此地址没有对齐限制。
任何按VA操作的缓存维护指令作为任何所需的VA到PA转换的一部分包括:
- 对于在EL1执行的指令,或在EL2执行且HCR_EL2.E2H的有效值为1的指令,当前的ASID。
- 当前安全状态。
- 指令是在EL1还是EL2执行。
- 对于在EL1执行的指令,当前的VMID。
该VA到PA转换可能产生故障。但是,对于按VA操作的指令缓存维护指令:
- 指令是否可以生成以下故障是IMPLEMENTATION DEFINED的:
- 访问标志故障。
- 转换故障。
- 指令不能生成权限故障,但以下情况除外:
- 当在EL0执行IC IVAU指令且指定地址在EL0没有读访问权限时,可能生成权限故障,参见”缓存维护指令在EL0的可访问性”。
- 当FEAT_CMOW实现时,以下情况可能生成权限故障:
- 在EL0执行IC IVAU指令时,指定地址具有阶段1读权限,但没有阶段1写权限。
- 在EL1或EL0执行IC IVAU指令时,指定地址没有阶段2写权限。
- 阶段1转换表walk期间阶段2故障上可能的权限故障。
有关缓存维护指令按VA操作时可能故障的更多信息,参见”内存中止”。
参见”数据和指令缓存指令的排序和完成”。
如果CTR_EL0.DIC为1,则每个IC指令是否被当作NOP是IMPLEMENTATION DEFINED的。
如果按VA操作的IC指令被当作NOP,则它不执行转换,以下全部适用:
- 不会产生MMU故障。
- 如果启用硬件更新AF,则不要求设置AF。
如果IC指令被当作NOP,则指令的执行是否可以被捕获是IMPLEMENTATION DEFINED的。
D7.5.9.2 数据缓存维护指令(DC)(The data cache maintenance instruction (DC))
系统指令描述了此指令的A64汇编语法。
当DC指令需要set/way/level参数时,这采用64位寄存器的形式,其高32位为RES0。
如果按set/way的数据缓存维护指令指定的set、way或level参数大于实现支持的值,则指令是CONSTRAINED UNPREDICTABLE的,参见”缓存维护指令或指令描述中Set/Way/Index字段的超范围值”。
当DC指令需要地址参数时,这采用持有VA参数的64位寄存器的形式。此地址没有对齐限制。
任何按VA操作的缓存维护指令作为任何所需的VA到PA转换的一部分包括:
- 对于在EL1执行的指令,或在EL2执行且HCR_EL2.E2H的有效值为1的指令,当前的ASID。
- 当前安全状态。
- 指令是在EL1还是EL2执行。
- 对于在EL1执行的指令,当前的VMID。
该VA到PA转换可能产生故障。但是,按VA操作的数据或统一缓存维护指令不能生成权限故障,但以下情况除外:
- 以下情况可能生成权限故障:
- 当执行DC IVAC指令且指定地址没有写权限时。
- 当在EL0执行启用的DC指令且指定地址在EL0没有读访问权限时,参见”缓存维护指令在EL0的可访问性”。
权限故障描述包括按VA缓存维护指令生成权限故障的可能约束。
- 当FEAT_CMOW实现时,以下情况可能生成权限故障:
- 在EL0执行按VA操作并执行clean and invalidate的DC指令时,指定地址没有阶段1写权限。
- 在EL1或EL0执行按VA操作并执行clean and invalidate的DC指令时,指定地址没有阶段2写权限。
- 阶段1转换表walk期间阶段2故障上可能的权限故障。
有关VA到PA转换上可能故障的更多信息,参见”内存中止”。
当在EL1执行时,DC ISW指令执行clean and invalidate,这意味着它执行与DC CISW指令相同的维护,如果以下全部适用:
- EL2在当前安全状态中实现并启用。
- 以下之一:
- HCR_EL2.SWIO的值为1,强制缓存clean执行clean and invalidate。
- HCR_EL2.VM的值为1,表示EL1&0阶段2地址转换已启用。
当在EL1执行时,DC IVAC指令执行clean and invalidate,这意味着它执行与DC CIVAC指令相同的维护,如果以下全部适用:
- EL2在当前安全状态中实现并启用。
- HCR_EL2.VM的值为1,表示EL1&0阶段2地址转换已启用。
译者注: 强制缓存clean指令执行clean invalidate适用于AArch32缓存维护指令DCIMVAC和DCISW。参见”AArch32数据缓存维护指令(DC*)”。
当FEAT_DPB实现时(意味着DC CVAP指令已实现),如果内存系统不支持持久点,则到PoP的数据缓存clean(DC CVAP)的行为与到PoC的数据缓存clean(DC CVAC)相同。
译者注:
- 对持久点的支持不改变或影响CLIDR_EL1系统寄存器的定义或行为。
- 因为DSB SYS指令在所有之前的DC CVAP指令完成之前不会完成,所以以下序列可用于确保任何存储到持久点的完成,其中存储可能是到Non-cacheable内存的:
1
2
3 DMB ; Note this can be any DMB that applies to both loads and stores
DC CVAP, Xt
DSB SYS
- 如果在一致点之后但在持久点之前存在对程序员不可见的缓存且包含标记为Non-cacheable的数据,则DC CVAP操作会导致这些缓存中的Non-cacheable位置被clean。
如果一致点之后存在缓存且未实现FEAT_PoPS,则DC CIVAC和DC CIGDVAC指令不足以移除中毒位置的所有副本,是否存在任何IMPLEMENTATION DEFINED机制来移除位置中的poison是IMPLEMENTATION DEFINED的。
有关从中毒位置移除poison的更多信息,参见”从中毒位置清除延迟错误”。
如果从数据缓存维护指令产生为转换 regime适用的设置FAR的内存故障,则FAR持有指令寄存器参数中指定的地址。
译者注: 尽管其助记符,DC ZVA不是缓存维护指令。
参见”缓存维护指令在EL0的可访问性”和”数据和指令缓存指令的排序和完成”。
对于所有以下DC指令,指令是否被当作NOP是IMPLEMENTATION DEFINED的:
- 到PoU的DC且LoUIS和LoUU为0。
- 到PoC的DC且LoC为0。
- 到PoP的DC且内存系统不支持持久点且LoC为0。
- 到PoDP的DC且内存系统不支持深度持久点且不支持持久点且LoC为0。
如果实现了FEAT_OCCMO,且在系统中PoC在任何缓存级别之前,则Arm期望可以将DC CIVAOC、DC CIGDVAOC、DC CVAOC和DC CGDVAOC实现为NOP。在没有外部缓存级别的系统中,这些指令可以分别实现为DC CIVAC、DC CIGDVAC、DC CVAC和DC CGDVAC。
如果按VA操作的DC指令被当作NOP,则它不执行转换,以下全部适用:
- 不会产生MMU故障。
- 如果启用硬件更新AF,则不要求设置AF。
如果DC指令被当作NOP,则指令的执行是否可以被捕获是IMPLEMENTATION DEFINED的。
D7.5.9.3 缓存维护指令在EL0的可访问性(EL0 accessibility of cache maintenance instructions)
在EL0执行的软件可以访问按虚拟地址操作的数据缓存维护指令和指令缓存维护指令。当由于SCTLR_EL1.UCI为0而禁用EL0使用这些指令时,在EL0执行其中一条指令会产生到EL1的陷阱,使用EC = 0x18报告。当HCR_EL2.{E2H, TGE}的有效值为{1, 1}时,控制来自SCTLR_EL2。
译者注: DC CVAP仅在FEAT_DPB实现时实现。
对于这些指令,需要对虚拟地址的读访问权限。当SCTLR_EL1.UCI的值为1时:
- 如果DC指令在EL0执行且参数中指定的地址在EL0无法读取,则可能生成权限故障。
- 对于IC IVAU指令,如果指令在EL0执行且参数中指定的地址在EL0无法读取,则是否生成权限故障是IMPLEMENTATION DEFINED的。
- 当FEAT_CMOW实现时,对于按VA操作并执行clean and invalidate的DC指令以及按VA操作的IC指令,还需要写访问权限,如下所示:
- 当SCTLR_EL1.CMOW为1时,如果在EL0执行的指令没有阶段1写权限,则生成权限故障。
- 当HCRX_EL2.CMOW为1时,如果在EL0执行的指令没有阶段2写权限,则生成权限故障。
译者注: 此阶段2访问权限也适用于DCCIMVAC和ICIMVAU AArch32缓存维护指令。
更多信息,参见”权限故障”描述。在DC指令在EL0执行且指定地址在EL0无法读取的情况下,权限故障被生成,除非该节中描述的允许的约束之一适用并意味着不能生成故障。
软件可以读取CTR_EL0以发现缓存维护指令所需的步长。SCTLR_EL1.UCT位启用对CTR_EL0的EL0访问。当EL0对缓存类型寄存器的访问被禁用时,在EL0执行的寄存器访问指令使用EC = 0x18被捕获到EL1。
D7.5.9.4 维护指令作用域的一般要求(General requirements for the scope of maintenance instructions)
缓存维护指令的规范描述了每个指令在系统中保证执行的操作。它不限制可能发生的其他行为,前提是这些行为与”缓存的一般行为”、”复位时缓存的行为”和”预取到缓存”中描述的要求一致。
这意味着作为缓存维护指令的副作用:
- 缓存中的任何位置可能被clean。
- 缓存中的任何未锁定位置可能被clean and invalidated。
译者注: Arm建议,为获得最佳性能,此类副作用应保持在最少。Arm强烈建议,在一种安全状态中执行的操作的副作用不会对另一种安全状态中的执行产生重大性能影响。
如果实现可以覆盖已由另一个observer写入的内存中的分配标签(Allocation Tags),而这些分配标签尚未由该内存位置的共享性域中的observer写入,则:
- Clean数据从缓存级别的缓存维护操作必须也clean关联的分配标签。
- Invalidate或clean and invalidate数据从缓存级别的缓存维护操作必须也clean and invalidate关联的分配标签。
D7.5.9.5 按VA操作到PoC的指令效果(Effects of instructions that operate by VA to the PoC)
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoC操作的缓存维护指令影响执行指令的PE的共享性域中描述的其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoC的所有数据和统一缓存。表D7-3显示了这些数据和统一缓存维护指令的范围。
表D7-3 到PoC的缓存维护指令受影响的PE
| 共享性 | 受影响的PE | 有效于 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoC |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoC |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoC |
译者注: 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.6 按VA操作到外部缓存级别的指令效果(Effects of instructions that operate by VA to the Outer Cache level)
本节中的行为适用于实现了FEAT_OCCMO的情况。
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到外部缓存级别操作的缓存维护指令影响执行指令的PE的共享性域中描述的其他PE的缓存。
对于Device内存和Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到外部缓存级别的所有数据缓存。表D7-4显示了这些数据缓存维护指令的范围。
表D7-4 到外部缓存级别的缓存维护指令受影响的PE
| 共享性 | 受影响的PE | 有效于 |
|---|---|---|
| Non-shareable | 执行指令的PE | 外部缓存级别 |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 外部缓存级别 |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 外部缓存级别 |
译者注: 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.7 按PA操作到PoPA的指令效果(Effects of instructions that operate by PA to the PoPA)
缓存受按PA到PoPA的缓存维护指令影响。对于这些缓存,操作表现为clean and invalidate。按PA到PoPA操作的数据缓存维护指令具有以下所有属性:
- 指令影响Outer Shareable共享性域中到PoPA的所有缓存,用于指令指定的内存位置的所有副本。
- 指令可能影响同一资源的其他内存位置,例如与不同PA空间关联的相同资源的缓存副本。如果资源的多个内存位置已被写入,则哪个其他副本被clean到PoPA是CONSTRAINED UNPREDICTABLE的。如果粒度保护检查被配置为确保在任何时候只有一个内存位置可写,则此CONSTRAINED UNPREDICTABLE行为保证可以避免。
- 指令影响PoPA之前的所有缓存,即使缓存在PoC之后且对程序员不可见。
- 指令具有与发送到Outer Shareable共享性域的基于VA的缓存维护指令相同的排序、可见性和完成行为。这包括与缓存行最小大小相关的方面,由CTR_EL0.DminLine指示。
- 指令不受粒度保护检查约束。
- 如果指令针对超出已实现PA大小的PA,则不需要clean或invalidate任何缓存条目。
在包含与Outer Shareable域外部observer关联的缓存的系统中,对于这些缓存中的每一个,至少以下属性之一必须适用:
- 缓存受DC PAPA操作影响。对于该缓存,DC PAPA操作可以被当作invalidate操作而不是clean and invalidate操作。
- 从缓存传播到Outer Shareable域的任何访问都受粒度保护检查约束,并且系统还提供以下属性之一:
- 缓存只能存储来自Non-secure物理地址空间的内存位置。
- 来自缓存的访问受与缓存行关联的安全状态的转换约束。
D7.5.9.8 按PA操作到PoE的指令效果(Effects of instructions that operate by PA to the PoE)
按PA到PoE操作的数据缓存维护指令具有以下所有属性:
- 指令影响Outer Shareable共享性域中到PoE的所有缓存,用于指令指定的内存位置的所有副本。
- 指令影响PoE之前的所有缓存,即使缓存在PoC之后且对程序员不可见。
- 指令具有与发送到Outer Shareable共享性域的基于VA的缓存维护指令相同的排序、可见性和完成行为。这包括与缓存行最小大小相关的方面,由CTR_EL0.DminLine指示。
- 指令clean and invalidate指令指定的内存位置的所有副本,无论与该内存位置关联的任何MECID如何。Clean操作产生的内存访问使用与缓存条目关联的MECID。
- 指令是否受粒度保护检查约束是IMPLEMENTATION DEFINED的。
- 如果HCR_EL2.NV为1,则在Realm EL1执行指令会被捕获到Realm EL2。使用EC = 0x18报告这些异常及其关联的ISS字段。
D7.5.9.9 按VA操作到PoP的指令效果(Effects of instructions that operate by VA to the PoP)
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoP操作的缓存维护指令影响执行指令的PE的共享性域中描述的其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoP的所有数据和统一缓存。表D7-5显示了这些到PoP的数据和统一缓存维护指令的范围。
表D7-5 到PoP的缓存维护指令受影响的PE
| 共享性 | 受影响的PE | 有效于 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoP |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoP |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoP |
译者注: 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.10 按VA操作到PoPS的指令效果(Effects of instructions that operate by VA to the PoPS)
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoPS操作的缓存维护指令影响执行指令的PE的共享性域中描述的其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoPS的所有数据和统一缓存。表D7-6显示了这些到PoPS的数据和统一缓存维护指令的范围。
表D7-6 到PoPS的缓存维护指令受影响的PE
| 共享性 | 受影响的PE | 有效于 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoPS |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoPS |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoPS |
译者注: 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.11 按VA操作到PoU的指令效果(Effects of instructions that operate by VA to the PoU)
对于按VA到PoU操作的缓存维护指令,表D7-7显示了对于Normal或Device内存位置中的VA,VA的共享性属性如何确定受影响的PE最小集合以及指令必须有效的点。
表D7-7 到PoU的缓存维护指令受影响的PE
| 共享性 | 受影响的PE | 有效于 |
|---|---|---|
| Non-shareable | 执行指令的PE | 执行指令的PE的指令缓存填充、数据缓存填充和写回以及转换表walk的PoU |
| Inner Shareable或Outer Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 与执行指令的PE在同一Inner Shareable共享性域中所有PE的指令缓存填充、数据缓存填充和写回以及转换表walk的PoU |
译者注:
- 保证受影响的PE集合从不大于包含执行指令的PE的Inner Shareable共享性域中的PE。
- 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.12 All和set/way维护指令的效果(Effects of All and set/way maintenance instructions)
DC set/way指令仅适用于执行指令的PE的缓存。IC IALLU指令仅适用于执行指令的PE的缓存,除非HCR_EL2.FB=1,这会导致指令在从EL1执行时被广播到Inner Shareable域。
IC IALLUIS指令可以影响与执行指令的PE在同一Inner Shareable共享性域中所有PE的缓存。此指令对同一Inner Shareable共享性域中所有PE的指令缓存填充、数据缓存填充和写回以及转换表walk的统一点有效。
译者注:
- 系统缓存的可能存在(如”系统级缓存”中所述)意味着架构不保证所有缓存级别都可以使用set/way指令维护。
- 系统是否对受影响的共享性域之外的observer的缓存有影响是IMPLEMENTATION DEFINED的。
D7.5.9.13 虚拟化和安全状态对缓存维护指令的影响(Effects of virtualization and Security state on the cache maintenance instructions)
每个安全状态有自己的物理地址(PA)空间,因此缓存条目与PA空间关联。
表D7-8显示了虚拟化和安全对缓存维护指令的影响。在表中,指定条目是架构要求指令影响的条目。
译者注: “缓存的一般行为”中描述的规则意味着指令也可能影响其他条目。
表D7-8 虚拟化和安全对维护指令的影响
数据和统一缓存维护指令
| 缓存维护指令 | 安全状态 | 指定条目 |
|---|---|---|
| 按VA的Invalidate、Clean或Clean and Invalidate:DC IVAC、DC CVAC、DC CVAP、DC CVAU、DC CIVAC、DC CIVAPS、DC CIGDVAPS、DC CIVAOC、DC CIGDVAOC、DC CVAOC、DC CGDVAOC | Non-secure和Secure。当FEAT_RME实现时,还有Realm和Root。 | 在当前安全状态中映射到以下组合的所有行:• 指定的VA。• 对于在EL1、EL0执行或在EL2执行且HCR_EL2.E2H有效值为1的指令,如果位置映射到非全局页面,则为当前ASID。• 对于在EL1执行且SCR_EL3.NS为1或SCR_EL3.EEL2为1的指令,为当前VMID。• 对于在EL0执行且(SCR_EL3.NS为1或SCR_EL3.EEL2为1)且HCR_EL2.{E2H, TGE}的有效值不为{1, 1}的指令,为当前VMID。 |
| 按set/way的Invalidate、Clean或Clean and Invalidate:DC ISW、DC CSW、DC CISW、DC IGSW、DC CGSW、DC CIGSW、DC IGDSW、DC CGDSW、DC CIGDSW | Non-secure | 由set/way指定的行,前提是条目来自Non-secure PA空间。 |
| Secure | 由set/way指定的行,前提是条目来自Secure或Non-secure PA空间。 | |
| 当FEAT_RME实现时:Realm | 由set/way指定的行,前提是条目来自Realm或Non-secure PA空间。 | |
| Root | 由set/way指定的行,无论条目来自哪个PA空间。 |
指令缓存维护指令
| 缓存维护指令 | 安全状态 | 指定条目 |
|---|---|---|
| 按VA的Invalidate:IC IVAU | Non-secure和Secure。当FEAT_RME实现时,还有Realm和Root。 | 当前转换regime中与指定VA对应的所有行,以及:• 对于在EL1、EL0执行或在EL2执行且HCR_EL2.E2H有效值为1的指令,为当前ASID。• 对于在EL1执行且SCR_EL3.NS为1或SCR_EL3.EEL2为1的指令,为当前VMID。• 对于在EL0执行且(SCR_EL3.NS为1或SCR_EL3.EEL2为1)且HCR_EL2.{E2H, TGE}的有效值不为{1, 1}的指令,为当前VMID。 |
| Invalidate All:IC IALLU、IC IALLUIS | Non-secure和Secure | 对于在以下时机执行的指令:• 在EL1执行且SCR_EL3.{NSE, NS}的有效值为{0, 0}且SCR_EL3.EEL2==1时,所有包含与当前VMID关联的Secure或Non-secure条目的指令缓存行。• 在EL1执行且SCR_EL3.{NSE, NS}的有效值为{0, 1}时,所有包含与当前VMID关联的Non-secure条目的指令缓存行。• 在EL2执行且SCR_EL3.{NSE, NS}的有效值为{0, 1}时,所有包含Non-secure条目的指令缓存行。• 在EL1执行且SCR_EL3.{EEL2, NSE, NS}的有效值为{0, 0, 0}时,在EL2执行且SCR_EL3.{EEL2, NSE, NS}为{1, 0, 0}时,或在EL3时,所有包含Secure或Non-secure条目的指令缓存行。 |
| Realm | 对于在以下时机执行的指令:• 在EL1执行且SCR_EL3.{NSE, NS}的有效值为{1, 1}时,所有包含与当前VMID关联的Realm或Non-secure条目的指令缓存行。• 在EL2执行且SCR_EL3.{NSE, NS}的有效值为{1, 1}时,所有包含Realm或Non-secure条目的指令缓存行。 | |
| Root | 对于在EL3执行的指令,所有指令缓存行,无论条目来自哪个PA空间。 |
译者注:
a. 对VMID的依赖即使在HCR_EL2.VM设置为0时也适用。架构不定义VTTBR_EL2.VMID的复位值,因此在任何包含EL2的实现中,在复位解除时执行的引导软件必须初始化VTTBR_EL2.VMID。b. 使用的指令缓存类型影响本表中指定条目的解释:
- 对于PIPT指令缓存,缓存维护适用于所有其物理地址对应于指定地址的条目。
- 对于VIPT指令缓存,缓存维护适用于其虚拟索引和物理标签对应于指定地址的条目。
有关指令缓存类型的详细信息,参见”指令缓存”。
对于锁定条目和可能锁定的条目,”缓存锁定与缓存维护指令的交互”中描述的缓存维护指令行为适用。
在生成关于条目在缓存中被锁定或可能被锁定的中止的实现中,当使用锁定中止时,这些中止可能在任何缓存维护指令上发生。
在包含EL2的实现中:
- 架构不要求在虚拟机之间切换时进行缓存clean。在set/way by invalidate时不得为第二虚拟机提供腐化与第二虚拟机关联状态的机会。为确保满足此要求,set/way by invalidate指令可以改为执行set/way by clean and invalidate。
- 如”数据缓存维护指令(DC)”中所述,AArch64数据缓存invalidate指令DC IVAC和DC ISW在EL1和EL0执行时,以及AArch32数据缓存invalidate指令DCIMVAC和DCISW在EL1执行时,可以被配置为执行缓存clean以及缓存invalidate。
- 当以下全部为真时,在EL1执行的TLB invalidate指令和IC IALLU指令被广播到Inner Shareable域:
- EL2在当前安全状态中实现并启用。
- HCR_EL2.FB的值为1。
有关缓存维护指令的更多信息,参见”关于AArch64状态下的缓存维护”、”A64缓存维护指令”和”AArch64虚拟内存系统架构”。
D7.5.9.14 缓存维护指令的边界条件(Boundary conditions for cache maintenance instructions)
缓存维护指令对缓存进行操作,无论系统寄存器缓存性控制是否强制所有内存访问为Non-cacheable。
对于基于VA的缓存维护指令,指令对缓存进行操作,无论VMSA转换表条目中标记的内存地址的内存类型和缓存性属性。这意味着缓存维护指令的效果可能不取决于:
- 访问的地址是Normal内存还是Device内存。
- 地址是具有Cacheable属性还是Non-cacheable属性。
- 访问地址的任何适用域控制。
- 访问地址的访问权限,但阶段2写权限对数据或统一缓存invalidate指令的影响除外。
D7.5.9.15 数据和指令缓存指令的排序和完成(Ordering and completion of data and instruction cache instructions)
所有数据缓存指令,除指定地址的DC ZVA、DC GVA和DC GZVA外:
- 相对于具有以下所有属性的加载或存储按程序顺序执行:
- 在最小大小缓存行的相同缓存行内访问具有Inner Write Through或Inner Write Back属性的Normal内存中的地址,如CTR_EL0.DMinLine所示。
- 使用与传递给数据缓存指令的地址具有相同缓存性属性的地址。
- 相对于具有以下所有属性的加载或存储可以任何顺序执行:
- 在最小大小缓存行的相同缓存行内访问具有Inner Write Through或Inner Write Back属性的Normal内存中的地址,如CTR_EL0.DMinLine所示。
- 使用与传递给数据缓存指令的地址具有不同缓存性属性的地址。
- 在加载或存储指令与数据缓存指令之间没有执行DMB或DSB。
- 相对于访问具有Device内存属性或Inner Non-cacheable属性的Normal内存的任何地址的加载或存储可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于其他指定地址在最小大小缓存行的相同缓存行内的数据缓存指令(如CTR_EL0.DMinLine所示)按程序顺序执行。
- 相对于访问最小大小(如CTR_EL0.DMinLine所示)不同缓存行中的地址的加载或存储可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于其他指定地址在最小大小(如CTR_EL0.DMinLine所示)不同缓存行中的数据缓存指令可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指令缓存维护指令可以任何顺序执行,除非在指令之间执行了DSB。
- 相对于不指定地址的数据缓存维护指令可以任何顺序执行,除非在指令之间执行了DMB或DSB。
译者注: 尽管其助记符,DC ZVA、DC GVA和DC GZVA指令不是数据缓存维护指令。
译者注:
- 数据缓存按地址排序规则与物理索引物理标记缓存一致。参见”数据和统一缓存”。
- 数据缓存零指令描述了数据缓存零的排序和完成规则。
所有不指定地址的数据缓存维护指令:
- 相对于不指定地址的其他数据缓存维护指令可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指定地址的数据缓存维护指令(DC ZVA、DC GVA和DC GZVA除外)可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于加载或存储可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指令缓存维护指令可以任何顺序执行,除非在指令之间执行了DSB。
所有指令缓存维护指令可以相对于其他指令缓存指令、数据缓存指令、加载和存储以任何顺序执行,除非在指令之间执行了DSB。
缓存维护指令可以在执行后任何时间完成,但仅在执行缓存维护指令的PE执行DSB指令后才能保证完成,且其效果对其他observer可见。参见”完成和端点排序”中对缓存维护指令的要求。
在所有情况下,本节中提到的DMB或DSB是指其所需访问类型为加载和存储的DMB或DSB。
译者注: 本节根据
译者注: 这些排序要求从AArch32状态中的要求扩展而来,参见:
- 缓存和分支预测器维护指令的排序。
- AArch32指令缓存维护指令(IC*)。
D7.5.9.15.1 数据缓存Clean到持久点的排序和完成(Ordering and completion of Data Cache Clean to Point of Persistence)
由于数据缓存clean到持久点而导致持久内存更新的保证已发生,要么在:
- 在数据缓存clean到持久点之后执行适用于读取和写入的DSB之后。
- 由不同的数据缓存clean到持久点导致的持久内存更新,该更新在原始数据缓存clean到持久点之后出现并适用于读取和写入的DMB之后排序。
译者注: 第二点是数据缓存clean到持久点指令由DMB排序这一事实的一个方面,这控制着在持久内存中到达的顺序。
DMB(适用于读取和写入)对数据缓存clean到持久点的排序效果不足以确保在示例D7-1中,在内存位置X3中观察到值’1’意味着数据缓存clean到持久点已导致持久内存的更新:
示例D7-1 数据缓存Clean到持久点的排序效果
1 | ; initial condition has [X3]=0 |
然而,在示例D7-2中,DMB指令的排序效果将确保位置P0:X1将在与位置P1:X8相同或之前的时间到达持久点。
示例D7-2 数据缓存Clean到持久点的排序效果
1 | ; initial conditions has P0: X3 and P1: X3 point to the same location, which is 0 at the start of this example |
D7.5.9.15.2 数据缓存Clean到深度持久点的排序和完成(Ordering and completion of Data Cache Clean to Point of Deep Persistence)
由于数据缓存clean到深度持久点而导致深度持久内存更新的保证已发生,要么在:
- 在数据缓存clean到深度持久点之后执行适用于读取和写入的DSB之后。
- 由不同的数据缓存clean到深度持久点导致的深度持久内存更新,该更新在原始数据缓存clean到深度持久点之后出现并适用于读取和写入的DMB之后排序。
译者注: 第二点是数据缓存clean到深度持久点指令由DMB排序这一事实的一个方面,这控制着在深度持久内存中到达的顺序。
DMB(适用于读取和写入)对数据缓存clean到深度持久点的排序效果不足以确保在示例D7-3中,在内存位置X3中观察到值’1’意味着数据缓存clean到深度持久点已导致深度持久内存的更新:
示例D7-3 数据缓存Clean到深度持久点的排序效果
1 | ; initial conditions has [X3]=0 |
然而,在示例D7-4中,DMB指令的排序效果将确保位置P0:X1将在与位置P1:X8相同或之前的时间到达深度持久点。
示例D7-4 数据缓存Clean到深度持久点的排序效果
1 | ; initial conditions has P0: X3 and P1: X3 point to the same location, which is 0 at the start of this example |
D7.5.9.16 执行缓存维护指令(Performing cache maintenance instructions)
为确保地址空间块中的所有缓存行通过所有缓存级别进行维护,Arm强烈建议软件:
- 对于数据或统一缓存维护,使用CTR_EL0.DMinLine值确定数据缓存维护按VA指令循环的循环增量大小。
- 对于指令缓存维护,使用CTR_EL0.IMinLine值确定指令缓存维护按VA指令循环的循环增量大小。
D7.5.9.16.1 缓存维护指令的示例代码(Example code for cache maintenance instructions)
按set/way的缓存维护指令可以clean或invalidate,或两者兼有,连接到PE的一个或多个级别的全部缓存。然而,除非连接到缓存的所有PE将所有内存位置视为Non-cacheable,否则在此类缓存维护指令序列期间不可能防止位置被分配到缓存。
译者注: 由于set/way指令仅在本地执行,即使这些不同的PE同时执行相同的缓存维护指令,也无法保证不同PE之间缓存维护的原子性。由于任何可缓存行可以随时分配到缓存,缓存行可能以导致该行不受基于set/way的缓存维护影响的方式从一PE的缓存条目迁移到不同PE的缓存。因此,Arm强烈反对使用set/way指令在一致性系统中管理一致性。预期按set/way操作的缓存维护指令的用途仅限于与缓存的电源关闭和电源开启相关联的缓存维护(如果实现需要的话)。
set/way维护的局限性意味着维护不会在多个PE上发生,并且不能为每个PE上的每个地址原子地发生。因此,在具有非常大缓冲区或地址未知缓冲区的多处理器或多线程系统中,使用set/way来clean或clean and invalidate整个缓存以进行一致性管理可能无法提供预期的一致性结果,这是因为其他PE或可能其他线程的推测。 这些指令可以以此方式使用的唯一方法是首先确保所有可能导致需要维护的缓存的推测访问的PE不能生成推测访问。这可以通过确保这些PE没有具有Normal Cacheable属性的内存位置来实现。这种方法可能对系统性能产生非常大的影响,Arm建议实现者在将成为问题的系统中使用硬件一致性机制。
系统级缓存指的是按set/way缓存维护的其他局限性。
以下示例代码用于将数据或统一缓存clean到一致点,说明了将整个数据或统一缓存clean到一致点的通用机制。它假定当前缓存大小标识寄存器为32位格式。更多信息,参见”缓存大小标识寄存器的可能格式,CCSIDR_EL1”。
1 | MRS X0, CLIDR_EL1 |
类似的方法可用于所有缓存维护指令。
D7.5.10 数据缓存零指令(Data cache zero instruction)
数据缓存零地址指令DC ZVA将0x00写入大小为N字节的块的每个字节,块在内存中对齐到N字节,其中:
- 内存中的块由作为DC ZVA指令参数提供的地址标识。此地址没有对齐限制。
译者注: 这意味着包括所提供地址的内存块的每个字节都设置为零。
- DCZID_EL0寄存器指示写入零字节值的块大小N字节。
软件可以限制对此指令的访问。参见”可配置指令控制”和DC ZVA指令的描述。
DC ZVA指令表现为一组存储到被访问的位置,并且:
- 如果执行指令时使用的转换regime不允许写入该位置,则生成权限故障。
- 需要与任何其他存储指令相同的排序和一致性管理考虑。
此外:
- 当执行指令时,它可能产生以与其他内存相关故障或观察点相同的方式优先化的内存故障或观察点。当生成同步数据中止故障或观察点时,综合字段中的CM位未设置为1,这与所有其他缓存维护指令不同。参见”数据中止异常的ISS编码”以获取有关关联的ESR_ELx.ISS字段编码的更多信息。
- 如果被清零的内存区域是不支持未对齐访问的任何类型的Device内存,则DC ZVA生成对齐故障,该故障以与内存类型确定的其他对齐故障相同的方式优先化。
译者注: 架构没有说明DC ZVA指令是否导致分配到任何特定级别缓存的问题,对于具有这些缓存级别可缓存属性的地址。
尽管其助记符,DC ZVA指令不是数据缓存维护指令。
D7.5 缓存支持(Cache support)— 第三部分
D7.5.8 关于AArch64状态下的缓存维护
以下各节提供有关缓存维护的一般信息:
- 描述缓存维护指令时使用的术语。
- 缓存层次结构的抽象。
以下各节描述A64缓存维护指令:
- 指令缓存维护指令(IC)。
- 数据缓存维护指令(DC)。
译者注: A64指令集是ARM的64位指令集架构,用于AArch64执行状态。
译者注: 缓存维护指令用于管理软件对CPU缓存的操作,包括清除(Clean)、无效化(Invalidate)和清除并无效化(Clean and Invalidate)等操作。
D7.5.8.1 描述缓存维护指令时使用的术语
内存位置是关联于特定地址空间中的某个地址的字节。例如,根物理地址空间中的地址0x1000与安全物理地址空间中的地址0x1000是不同的内存位置。
术语”资源(Resource)”指可在一个或多个内存位置访问的物理实体。与物理地址空间关联的资源可在该物理地址空间中访问。
译者注: 这里的”资源”概念指的是同一块物理硬件可能映射到不同的物理地址空间(如安全与非安全地址空间),访问同一资源在不同地址空间的位置会访问同一物理实体。
缓存维护指令被定义为作用于特定内存位置。根据指令类型,作用域定义为以下之一:
- 通过要维护的内存位置的虚拟地址进行操作,称为按VA操作。
- 通过要维护的内存位置的物理地址进行操作,称为按PA操作。
- 通过描述缓存在硬件中位置的方法进行操作,称为按set/way操作。
此外,对于指令缓存,有些指令会使所有条目无效。
以下小节定义缓存维护指令描述中使用的术语:
- 按set/way操作的缓存维护指令的术语。
- Clean、Invalidate和Clean and Invalidate指令的术语。
译者注: “set/way”是描述缓存结构的方法。Set(组)表示缓存中可分配给定地址的位置集合,Way(路)表示该集合中的具体位置。
D7.5.8.1.1 按set/way操作的缓存维护指令的术语
按set/way操作的缓存维护指令引用缓存中的特定结构。三个参数描述指令工作的缓存层次结构中的位置:
Level(级别) 缓存层次结构的级别。缓存级别数量是实现定义的。可以使用按set/way操作的结构化缓存维护指令管理的缓存级别可从CLIDR_EL1确定。
在ARM架构中,较低编号的缓存级别是更接近PE的级别。
Set(组) 缓存的每个级别被分割成若干个组。每个组是缓存级别中可分配地址的一组位置。通常,组号是地址的实现定义函数。
在ARM架构中,组号从0开始编号。
Way(路) 缓存的关联性是指定地址可分配到的组中位置的数量。路号指定这些位置中的一个。
在ARM架构中,路号从0开始编号。
译者注: 例如,一个4路组相联缓存意味着每个组有4个可能的位置(4个way)来存储同一地址的数据。
D7.5.8.1.2 Clean、Invalidate和Clean and Invalidate指令的术语
缓存在两个可能的方向上引入一致性问题:
- 通过访问缓存的PE对内存位置的更新可能对可访问内存的其他观察者不可见。这可能是因为新更新仍在缓存中,尚未对不访问该缓存的其他观察者可见。
- 可访问内存的其他观察者对内存位置的更新可能对访问缓存的PE不可见。当缓存包含已被更新的内存位置的旧副本或过时副本时,可能发生这种情况。
Clean和Invalidate指令解决这两个问题。这些指令的定义如下:
Clean 缓存Clean指令确保由控制缓存的观察者进行的更新对可访问内存的其他观察者可见,执行点为指令执行到的位置。Clean完成后,新的内存值保证对指令执行到的位置(例如统一点)可见。
从缓存中Clean缓存条目仅当该条目包含的内存位置已被shareability域中该内存位置的观察者写入时,才能覆盖由另一个观察者写入的内存。
Invalidate 缓存Invalidate指令确保在指令执行到的位置可访问内存的观察者所做的更新对控制缓存的观察者可见。如果自这些更新被写入以来尚未从缓存中Clean,则Invalidate指令可能导致被Invalidate指令影响的已被观察者写入的位置的更新丢失。
如果Invalidate指令操作的条目的地址是Normal Non-cacheable或任何类型的Device内存,则Invalidate指令还确保该地址不在缓存中。
译者注: Normal Cacheable地址的条目可随时分配到缓存,因此缓存Invalidate指令无法确保该地址不在缓存中。
Clean and Invalidate
缓存Clean and Invalidate指令的行为如同执行Clean指令然后立即执行Invalidate指令。两个指令都对同一位置执行。
缓存维护指令可定义执行到的点因指令是按VA还是按set/way操作而不同:
- 对于按set/way操作的指令,点被定义到下一级缓存。对于All操作,点被定义为对保存在缓存中每个位置的统一点。
- 对于按VA操作的指令:
- FEAT_OCCMO实现的指令操作到外部缓存级别。
- 对于所有其他按VA操作的指令,定义以下概念点:
一致点(Point of Coherency,PoC)
所有可访问内存的代理(agent)保证看到相同内存位置副本的点,无论访问任何内存类型或缓存属性。在许多情况下,这实际上是主系统内存,但架构不禁止在PoC之外实现对代理间一致性没有影响的缓存。
译者注: 系统中所有观测者(包括CPU、DMA控制器等)看到同一内存位置的相同值的最远点。
物理别名点(Point of Physical Aliasing,PoPA)
资源的一个内存位置的更新对所有其他可访问该资源的内存位置可见的点,对于访问该点的任何内存类型或缓存属性,以及所有可访问内存的代理。PoPA与PoC之间的关系是,将写入的内存位置Clean到PoPA意味着系统中没有任何代理随后可以通过对PoC执行Invalidate操作来揭示该内存位置的旧值。
加密点(Point of Encryption,PoE)
内存系统中任何已到达该点的写入使用与该写入关联的MECID加密的位置。
到PoPA的缓存维护操作足以影响PoE之前的所有缓存。
统一点(Point of Unification,PoU)
对于PE,PoU是指该PE的指令缓存和数据缓存及其页表遍历保证看到相同内存位置副本的点。在许多情况下,统一点是单处理器内存系统中指令缓存、数据缓存和页表遍历已合并的点。
对于Inner Shareable共享性域,PoU是指该Inner Shareable共享性域中所有PE的指令缓存、数据缓存及其页表遍历保证看到相同内存位置副本的点。定义此点允许自修改软件通过使用以下标准正确性策略来确保后续指令获取与软件修改版本关联:
- 按地址Clean数据缓存条目。
- 按地址Invalidate指令缓存条目。
持久点(Point of Persistence,PoP)
当FEAT_DPB实现时:内存系统中如果存在某个点,在系统电源被移除时保持对该内存位置的写入,并在电源恢复到受影响内存位置时可靠地恢复。
当FEAT_DPB和FEAT_DPB2都实现时:内存系统中系统内有足够能量确保如果系统电源被移除,写入内存将保持持久的点。
译者注: 这种内存有时称为非易失性内存。例如,图B2-1中所示的存储类内存可用作此功能的目标内存。
深度持久点(Point of Deep Persistence,PoDP)
内存系统中任何已到达该点的写入即使在电源系统瞬时硬件故障的情况下也能保持持久的点。
物理存储点(Point of Physical Storage,PoPS)
从缓存层次结构中的某个点开始,随后对某位置执行Clean and Invalidate到物理存储点后,该位置的第一次后续读取将始终返回数据。
译者注: 物理存储点通常在系统中所有缓存之后,包括系统缓存,这些缓存对于管理软件一致性目的是不可见的,如系统级缓存中所述。
CLIDR_EL1中的以下字段与PoC和PoU相关:
LoC,一致性级别(Level of Coherence)
此字段定义执行Clean或Invalidate到一致点时必须Clean或Invalidate的最后缓存级别。LoC值是一个缓存级别,因此例如如果LoC包含值3:
- 到一致点的Clean操作需要Clean第1级、第2级和第3级缓存。
- 第4级缓存是不需要维护的第一级。
如果LoC字段值为0x0,表示执行到一致点的Clean或Invalidate时不需要维护任何缓存级别。
如果LoC字段值是非零值但对应于未实现的级别,则表示所有已实现的缓存都在一致点之前。
LoUU,单处理器统一级别(Level of Unification, uniprocessor)
此字段定义执行到PE的统一点时必须Clean的最后数据缓存级别,或必须Invalidate的最后指令缓存级别。与LoC一样,LoUU值是一个缓存级别。
如果LoUU字段值为0x0,表示执行到统一点的Clean或Invalidate时不需要维护任何数据缓存级别。
如果LoUU字段值是非零值但对应于未实现的级别,则表示所有已实现的缓存都在统一点之前。
LoUIS,内部可共享统一级别(Level of Unification, Inner Shareable)
在任何实现中:
- 此字段定义执行到内部可共享共享性域的统一点时必须Clean的最后数据或统一缓存级别,或必须Invalidate的最后指令或统一缓存级别。与LoC一样,LoUIS值是一个缓存级别。
- 如果LoUIS字段值为0x0,表示执行到内部可共享共享性域的统一点的Clean或Invalidate时不需要维护任何数据或统一缓存级别。
- 如果LoUIS字段值是非零值但对应于未实现的级别,则表示所有已实现的缓存都在统一点之前。
D7.5.8.2 缓存层次结构的抽象
以下小节描述缓存层次结构的抽象:
- 按VA操作的缓存维护指令。
- 按set/way操作的缓存维护指令。
D7.5.8.2.1 按VA操作的缓存维护指令
基于VA的缓存维护指令被描述为按VA操作。这些指令中的每一个始终被限定为以下之一:
- 执行到一致点。
- 执行到统一点。
- 当FEAT_DPB实现时,执行到持久点。
- 当FEAT_DPB2实现时,执行到深度持久点。
- 当FEAT_PoPS实现时,执行到物理存储点。
- 当FEAT_OCCMO实现时,执行到外部缓存级别。
有关这些术语的定义以及关于VA可能含义的更多信息,请参阅描述缓存维护指令时使用的术语。
A64缓存维护指令列出了基于VA的维护指令。
CTR_EL0保存以下内容的最小行长度值:
- 指令缓存。
- 数据和统一缓存。
这些值支持高效地使一系列VA无效,因为此值是应用一系列基于VA的维护指令到一系列VA时使用的最有效地址步长。
对于按VA使数据或统一缓存行无效的指令,CTR_EL0的Cache Write-back Granule字段定义单个无效指令可以无效的最大粒度。Cache Write-back Granule的这一定义补充了其定义可写回的最大大小的含义。
D7.5.8.2.2 按set/way操作的缓存维护指令
A64缓存维护指令列出了基于set/way的维护指令。这些指令的某些编码包含指定缓存级别的必需字段:
- Clean指令从指定的缓存级别Clean到至少下一级缓存,远离PE。
- Invalidate指令仅在指定级别执行Invalidate。
D7.5.9 A64缓存维护指令
A64缓存维护指令是寄存器编码空间中的A64系统指令类的一部分。有关编码细节和这些系统指令的其他一般信息,请参阅系统指令、SYS和缓存维护指令以及数据缓存零操作。
以下小节提供有关这些指令的更多信息:
- 指令缓存维护指令(IC)。
- 数据缓存维护指令(DC)。
- EL0对缓存维护指令的可访问性。
- 维护指令作用域的一般要求。
- 按VA操作到PoC的指令效果。
- 按VA操作到外部缓存级别的指令效果。
- 按VA操作到PoP的指令效果。
- 按VA操作到PoPS的指令效果。
- 按VA操作到PoU的指令效果。
- All和set/way维护指令的效果。
- 虚拟化和安全状态对缓存维护指令的影响。
- 缓存维护指令的边界条件。
- 数据和指令缓存指令的排序和完成。
- 执行缓存维护指令。
D7.5.9.1 指令缓存维护指令(IC)
系统指令描述了此指令的A64汇编语法。
当IC指令需要地址参数时,其形式为持有VA参数的64位寄存器。此地址没有对齐限制。
任何按VA操作的缓存维护指令在执行任何必需的VA到PA转换时都包括:
- 对于在EL1执行的指令,或在EL2执行且HCR_EL2.E2H的有效值为1的指令,当前的ASID。
- 当前安全状态。
- 指令是在EL1还是EL2执行。
- 对于在EL1执行的指令,当前的VMID。
该VA到PA转换可能产生故障。但是,对于按VA操作的指令缓存维护指令:
- 指令是否可以生成以下故障是实现定义的:
- 访问标志故障。
- 转换故障。
- 指令不能生成权限故障,但以下情况除外:
- 在EL0执行IC IVAU指令时,如果指定地址在EL0没有读访问权限,可能生成权限故障,如EL0对缓存维护指令的可访问性中所述。
- 当实现FEAT_CMOW时,以下情况可能生成权限故障:
- 在EL0执行IC IVAU指令时,如果指定地址有stage 1读权限但没有stage 1写权限。
- 在EL1或EL0执行IC IVAU指令时,如果指定地址没有stage 2写权限。
- 在stage 1转换表遍历时Stage 2故障上可能的权限故障。
有关按VA操作的缓存维护指令上可能故障的更多信息,请参阅内存中止。
另请参阅数据和指令缓存指令的排序和完成。
如果CTR_EL0.DIC为1,则每个IC指令是否被当作NOP对待是实现定义的。
如果按VA操作的IC指令被当作NOP,则它不执行转换,所有以下情况适用:
- 不会产生MMU故障。
- 如果启用了AF的硬件更新,则不需要设置AF。
如果IC指令被当作NOP,则指令的执行是否可以被陷阱是实现定义的。
D7.5.9.2 数据缓存维护指令(DC)
系统指令描述了此指令的A64汇编语法。
当DC指令需要set/way/level参数时,其形式为64位寄存器,其高32位为RES0。
如果按set/way的数据缓存维护指令指定的set、way或level参数大于实现支持的值,则指令是约束不可预测的,请参阅缓存维护指令或指令描述中的Set/Way/Index字段的超范围值。
当DC指令需要地址参数时,其形式为持有VA参数的64位寄存器。此地址没有对齐限制。
任何按VA操作的缓存维护指令在执行任何必需的VA到PA转换时都包括:
- 对于在EL1执行的指令,或在EL2执行且HCR_EL2.E2H的有效值为1的指令,当前的ASID。
- 当前安全状态。
- 指令是在EL1还是EL2执行。
- 对于在EL1执行的指令,当前的VMID。
该VA到PA转换可能产生故障。但是,按VA操作的数据或统一缓存维护指令不能生成权限故障,但以下情况除外:
- 以下情况可能生成权限故障:
- 执行DC IVAC指令时,如果指定地址没有写权限。
- 在EL0执行启用的DC指令时,如果指定地址在EL0没有读访问权限,如EL0对缓存维护指令的可访问性中所述。
权限故障的描述包括关于在按VA缓存维护指令上生成权限故障的可能约束。
- 当实现FEAT_CMOW时,以下情况可能生成权限故障:
- 在EL0执行按VA操作并执行clean and invalidate的DC指令时,如果指定地址没有stage 1写权限。
- 在EL1或EL0执行按VA操作并执行clean and invalidate的DC指令时,如果指定地址没有stage 2写权限。
- 在stage 1转换表遍历时Stage 2故障上可能的权限故障。
有关VA到PA转换上可能故障的更多信息,请参阅内存中止。
当在EL1执行时,DC ISW指令执行clean and invalidate,这意味着如果满足以下所有条件,它执行与DC CISW指令相同的维护:
- EL2在当前安全状态中实现并启用。
- 以下任一条件为真:
- HCR_EL2.SWIO的值为1,强制缓存clean执行clean and invalidate。
- HCR_EL2.VM的值为1,表示启用了EL1&0 stage 2地址转换。
当在EL1执行时,DC IVAC指令执行clean and invalidate,这意味着如果满足以下所有条件,它执行与DC CIVAC指令相同的维护:
- EL2在当前安全状态中实现并启用。
- HCR_EL2.VM的值为1,表示启用了EL1&0 stage 2地址转换。
译者注: 强制clean指令执行clean invalidate适用于AArch32缓存维护指令DCIMVAC和DCISW。请参阅AArch32数据缓存维护指令(DC*)。
当实现FEAT_DPB时,意味着实现了DC CVAP指令,如果内存系统不支持持久点,则数据缓存Clean到PoP(DC CVAP)的行为如同数据缓存Clean到PoC(DC CVAC)。
译者注:
- 对持久点的支持不改变或影响CLIDR_EL1系统寄存器的定义或行为。
- 因为DSB SYS指令在所有先前的DC CVAP指令完成之前不会完成,所以可以使用以下序列来确保任何存储到持久点的完成,其中存储可能到非缓存内存:
1
2
3 DMB ; 注意这可以是适用于加载和存储的任何DMB
DC CVAP, Xt
DSB SYS
- 如果在一致点之后存在缓存但在持久点之前存在,并且持有标记为非缓存的数据,则DC CVAP操作会导致这些缓存中的非缓存位置被Clean。
如果在一致点之后存在缓存且未实现FEAT_PoPS,则DC CIVAC和DC CIGDVAC指令不足以移除被污染位置的所有副本,是否存在移除位置污染的实现定义机制是实现定义的。
有关从被污染位置移除污染的更多信息,请参阅从被污染位置清除延迟错误。
如果从适用于缓存维护指令的转换 regime 生成设置FAR的内存故障,则FAR保存指令寄存器参数中指定的地址。
译者注: 尽管其助记符,DC ZVA不是缓存维护指令。
另请参阅EL0对缓存维护指令的可访问性以及数据和指令缓存指令的排序和完成。
对于所有以下DC指令,指令是否被当作NOP对待是实现定义的:
- DC到PoU且LoUIS和LoUU为0。
- DC到PoC且LoC为0。
- DC到PoP且内存系统不支持持久点且LoC为0。
- DC到PoDP且内存系统不支持深度持久点且不支持持久点且LoC为0。
如果实现了FEAT_OCCMO,且在系统中PoC在任何缓存级别之前,则Arm预计可以将DC CIVAOC、DC CIGDVAOC、DC CVAOC和DC CGDVAOC实现为NOP。在没有外部缓存级别的系统中,这些指令可以分别实现为DC CIVAC、DC CIGDVAC、DC CVAC和DC CGDVAC。
如果按VA操作的DC指令被当作NOP,则它不执行转换,所有以下情况适用:
- 不会产生MMU故障。
- 如果启用了AF的硬件更新,则不需要设置AF。
如果DC指令被当作NOP,则指令的执行是否可以被陷阱是实现定义的。
D7.5.9.3 EL0对缓存维护指令的可访问性
在EL0执行的软件可以访问按虚拟地址操作的数据缓存维护指令和指令缓存维护指令。当由于SCTLR_EL1.UCI为0而禁用EL0使用这些指令时,在EL0执行其中一个指令会产生陷阱到EL1,使用EC = 0x18报告。当HCR_EL2.{E2H, TGE}的有效值为{1, 1}时,控制来自SCTLR_EL2。
译者注: DC CVAP仅在实现FEAT_DPB时实现。
对于这些指令,需要对虚拟地址的读访问权限。当SCTLR_EL1.UCI的值为1时:
- 如果DC指令在EL0执行且参数中指定的地址在EL0不可读,则可能生成权限故障。
- 对于IC IVAU指令,如果指令在EL0执行且参数中指定的地址在EL0不可读,则是否生成权限故障是实现定义的。
- 当实现FEAT_CMOW时,对于按VA操作并执行clean and invalidate的DC指令以及按VA操作的IC指令,还需要写访问权限,如下所示:
- 当SCTLR_EL1.CMOW为1时,如果在EL0执行的指令没有stage 1写权限,则生成权限故障。
- 当HCRX_EL2.CMOW为1时,如果在EL0执行的指令没有stage 2写权限,则生成权限故障。
译者注: 此stage 2访问权限也适用于AArch32缓存维护指令DCCIMVAC和ICIMVAU。
有关更多信息,请参阅权限故障的描述。在DC指令在EL0执行且参数中指定的地址在EL0不可读的情况下,除非权限故障描述中描述的允许约束之一适用并意味着不能生成故障,否则生成权限故障。
软件可以读取CTR_EL0来发现缓存维护指令所需的步长。SCTLR_EL1.UCT位启用对CTR_EL0的EL0访问。当禁用对缓存类型寄存器的EL0访问时,在EL0执行的寄存器访问指令使用EC = 0x18被陷阱到EL1。
D7.5.9.4 维护指令作用域的一般要求
缓存维护指令的规范描述了每个指令在系统中的保证行为。它不限制可能发生的其他行为,只要它们与一般缓存行为、复位时缓存行为和预取到缓存中描述的要求一致。
这意味着作为缓存维护指令的副作用:
- 缓存中的任何位置可能被Clean。
- 缓存中的任何未锁定位置可能被Clean and Invalidate。
译者注: Arm建议,为了获得最佳性能,此类副作用应保持在最少。Arm强烈建议,在一种安全状态下执行的操作对另一种安全状态中的执行不会产生显著的性能影响。
如果实现可以覆盖已被另一观察者写入的内存中的分配标签,而这些分配标签尚未被该内存位置的共享性域中的观察者写入,则:
- 从缓存级别Clean数据的缓存维护操作也必须Clean相关的分配标签。
- 从缓存级别Invalidate或Clean and Invalidate数据的缓存维护操作也必须Clean and Invalidate相关的分配标签。
D7.5.9.5 按VA操作到PoC的指令效果
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoC操作的缓存维护指令影响执行指令的PE共享性域中其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoC的所有数据和统一缓存。表D7-3显示了这些数据和统一缓存维护指令的范围。
表D7-3 到PoC的缓存维护指令影响的PE
| 共享性 | 受影响的PE | 有效范围 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoC |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoC |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoC |
译者注: 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.6 按VA操作到外部缓存级别的指令效果
本节中的行为适用于实现了FEAT_OCCMO的情况。
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到外部缓存级别操作的缓存维护指令影响执行指令的PE共享性域中其他PE的缓存。
对于Device内存和Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到外部缓存级别的所有数据缓存。表D7-4显示了这些数据缓存维护指令的范围。
表D7-4 到外部缓存级别的缓存维护指令影响的PE
| 共享性 | 受影响的PE | 有效范围 |
|---|---|---|
| Non-shareable | 执行指令的PE | 外部缓存级别 |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 外部缓存级别 |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 外部缓存级别 |
译者注: 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.7 按PA操作到PoPA的指令效果
缓存在按PA到PoPA操作的缓存维护指令的影响范围内。对于这些缓存,操作表现为clean and invalidate。数据缓存维护指令按PA操作到PoPA具有以下所有属性:
- 指令影响Outer Shareable共享性域中到PoPA的所有缓存,用于指令指定的内存位置的所有副本。
- 指令可能影响同一资源的其他内存位置,例如与不同PA空间关联的同一资源的缓存副本。如果资源的多个内存位置已被写入,则哪个其他副本被Clean到PoPA是约束不可预测的。如果粒度保护检查被配置为确保在任何时候只有一个内存位置可写,则此约束不可预测行为得到保证。
- 指令影响PoPA之前的所有缓存,即使这些缓存在PoC之后且对程序员不可见。
- 指令具有与发布到Outer Shareable共享性域的基于VA的缓存维护指令相同的排序、可见性和完成行为。这包括与缓存行最小大小相关的方面,由CTR_EL0.DminLine指示。
- 指令不受粒度保护检查的约束。
- 如果指令针对高于已实现PA大小的PA,则不需要缓存任何条目被Clean或Invalidate。
在包含与Outer Shareable域之外的观察者关联的缓存的系统中,对于这些缓存中的每一个,至少以下属性之一必须适用:
- 缓存受DC PAPA操作的影响。对于该缓存,DC PAPA操作可以被当作Invalidate操作而不是clean and invalidate操作。
- 从缓存传播到Outer Shareable域的任何访问都受粒度保护检查约束,并且系统另外提供以下属性之一:
- 缓存只能存储来自非安全物理地址空间的内存位置。
- 来自缓存的访问受与缓存行关联的安全状态的转换控制。
D7.5.9.8 按PA操作到PoE的指令效果
按PA操作到PoE的数据缓存维护指令具有以下所有属性:
- 指令影响Outer Shareable共享性域中到PoE的所有缓存,用于指令指定的内存位置的所有副本。
- 指令影响PoE之前的所有缓存,即使这些缓存在PoC之后且对程序员不可见。
- 指令具有与发布到Outer Shareable共享性域的基于VA的缓存维护指令相同的排序、可见性和完成行为。这包括与缓存行最小大小相关的方面,由CTR_EL0.DminLine指示。
- 指令Clean and Invalidate指令指定的内存位置的所有副本,无论与内存位置关联的任何MECID如何。Clean操作产生的内存访问使用与缓存条目关联的MECID。
- 指令是否受粒度保护检查约束是实现定义的。
- 如果HCR_EL2.NV为1,则在Realm EL1执行指令会被陷阱到Realm EL2。使用EC = 0x18报告这些陷阱产生的异常及其关联的ISS字段。
D7.5.9.9 按VA操作到PoP的指令效果
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoP操作的缓存维护指令影响执行指令的PE共享性域中其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoP的所有数据和统一缓存。表D7-5显示了到PoP的数据和统一缓存维护指令的范围。
表D7-5 到PoP的缓存维护指令影响的PE
| 共享性 | 受影响的PE | 有效范围 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoP |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoP |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoP |
译者注: 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.10 按VA操作到PoPS的指令效果
对于不是Inner Non-cacheable、Outer Non-cacheable的Normal内存,按VA到PoPS操作的缓存维护指令影响执行指令的PE共享性域中其他PE的缓存。
对于Device内存或Inner Non-cacheable、Outer Non-cacheable的Normal内存,这些指令影响执行指令的PE的Outer Shareable共享性域中所有PE的缓存。
在所有情况下,对于任何受影响的PE,这些指令影响到PoPS的所有数据和统一缓存。表D7-6显示了到PoPS的数据和统一缓存维护指令的范围。
表D7-6 到PoPS的缓存维护指令影响的PE
| 共享性 | 受影响的PE | 有效范围 |
|---|---|---|
| Non-shareable | 执行指令的PE | 整个系统的PoPS |
| Inner Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 整个系统的PoPS |
| Outer Shareable | 与执行指令的PE在同一Outer Shareable共享性域中的所有PE | 整个系统的PoPS |
译者注: 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.11 按VA操作到PoU的指令效果
对于按VA到PoU操作的缓存维护指令,表D7-7显示了对于Normal或Device内存位置中的VA,VA的共享性属性如何确定受影响的PE最小集合,以及指令必须有效的点。
表D7-7 到PoU的缓存维护指令影响的PE
| 共享性 | 受影响的PE | 有效范围 |
|---|---|---|
| Non-shareable | 执行指令的PE | 执行指令的PE上指令缓存填充、数据缓存填充和写回以及页表遍历的PoU |
| Inner Shareable或Outer Shareable | 与执行指令的PE在同一Inner Shareable共享性域中的所有PE | 执行指令的PE同一Inner Shareable共享性域中所有PE的指令缓存填充、数据缓存填充和写回以及页表遍历的PoU |
译者注:
- 保证受影响的PE集合永远不会大于包含执行指令的PE的Inner Shareable共享性域中的PE。
- 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.12 All和set/way维护指令的效果
DC set/way指令仅适用于执行指令的PE的缓存。IC IALLU指令仅适用于执行指令的PE的缓存,除非HCR_EL2.FB=1,这会导致指令在从EL1执行时被广播到Inner Shareable域。
IC IALLUIS指令可以影响与执行指令的PE在同一Inner Shareable共享性域中所有PE的缓存。此指令对于该Inner Shareable共享性域中所有PE的指令缓存填充、数据缓存填充和写回以及页表遍历的统一点有效果。
译者注:
- 系统缓存的可能存在(如同系统级缓存中所述)意味着架构不能保证所有缓存级别都可以使用set/way指令维护。
- 系统是否使缓存维护指令对受影响的共享性域中不是PE的观察者的缓存有影响,由系统实现定义。
D7.5.9.13 虚拟化和安全状态对缓存维护指令的影响
每个安全状态都有自己的物理地址(PA)空间,因此缓存条目与PA空间关联。
表D7-8显示了虚拟化和安全对缓存维护指令的影响。在表中,指定条目是架构要求指令影响的条目。
译者注: 缓存行为中描述的规则意味着指令也可能影响其他条目。
表D7-8 虚拟化和安全对维护指令的影响
| 缓存维护指令 | 安全状态 | 指定条目 |
|---|---|---|
| 数据和统一缓存维护指令 | ||
| 按VA的Invalidate、Clean或Clean and Invalidate: | Non-secure和Secure | 所有保存PA的行,该PA在当前安全状态下映射到以下组合的所有: |
| DC IVAC、DC CVAC、DC CVAP、 | 当实现FEAT_RME时,Realm和Root | • 指定的VA |
| DC CVAU、DC CIVAC、DC CVAP、 | • 对于在EL1、EL0执行或在EL2执行且HCR_EL2.E2H的有效值为1的指令,如果位置映射到非全局页面,则为当前ASID | |
| DC CIVAPS、DC CIGDVAPS、DC CIVAOC、DC CIGDVAOC、DC CVAOC、DC CGDVAOC | • 对于在EL1执行且SCR_EL3.NS为1或SCR_EL3.EEL2为1的指令,为当前VMIDᵃ | |
| • 对于在EL0执行且(SCR_EL3.NS为1或SCR_EL3.EEL2为1)且HCR_EL2.{E2H, TGE}的有效值不为{1, 1}的指令,为当前VMIDᵃ | ||
| 按set/way的Invalidate、Clean或Clean and Invalidate: | Non-secure | 由set/way指定的行,前提是条目来自Non-secure PA空间 |
| DC ISW、DC CSW、DC CISW、DC IGSW、DC CGSW、DC CIGSW、DC IGDSW、DC CGDSW、DC CIGDSW | Secure | 由set/way指定的行,前提是条目来自Secure或Non-secure PA空间 |
| 当实现FEAT_RME时添加以下情况: | ||
| Realm | 由set/way指定的行,前提是条目来自Realm或Non-secure PA空间 | |
| Root | 由set/way指定的行,无论条目来自哪个PA空间 | |
| 指令缓存维护指令 | ||
| 按VA的Invalidate: | Non-secure和Secure | 当前转换 regime中与指定VA对应的所有行ᵇ,并且在: |
| IC IVAU | 当实现FEAT_RME时,Realm和Root | • 对于在EL1、EL0执行或在EL2执行且HCR_EL2.E2H的有效值为1的指令,为当前ASID |
| • 对于在EL1执行且SCR_EL3.NS为1或SCR_EL3.EEL2为1的指令,为当前VMIDᵃ | ||
| • 对于在EL0执行且(SCR_EL3.NS为1或SCR_EL3.EEL2为1)且HCR_EL2.{E2H, TGE}的有效值不为{1, 1}的指令,为当前VMIDᵃ | ||
| Invalidate All: | Non-secure和Secure | 对于在以下情况执行的指令: |
| IC IALLU、IC IALLUIS | • EL1当SCR_EL3.{NSE, NS}的有效值为{0, 0}且SCR_EL3.EEL2 == 1时,所有包含与当前VMID关联的Secure或Non-secure条目的指令缓存行 | |
| • EL1当SCR_EL3.{NSE, NS}的有效值为{0, 1}时,所有包含与当前VMID关联的Non-secure条目的指令缓存行 | ||
| • EL2当SCR_EL3.{NSE, NS}的有效值为{0, 1}时,所有包含Non-secure条目的指令缓存行 | ||
| • EL1当SCR_EL3.{EEL2, NSE, NS}的有效值为{0, 0, 0}、EL2当SCR_EL3.{EEL2, NSE, NS}为{1, 0, 0}或EL3时,所有包含Secure或Non-secure条目的指令缓存行 | ||
| Realm | 对于在以下情况执行的指令: | |
| • EL1当SCR_EL3.{NSE, NS}的有效值为{1, 1}时,所有包含与当前VMID关联的Realm或Non-secure条目的指令缓存行 | ||
| • EL2当SCR_EL3.{NSE, NS}的有效值为{1, 1}时,所有包含Realm或Non-secure条目的指令缓存行 | ||
| Root | 对于在EL3执行的指令,所有指令缓存行,无论条目来自哪个PA空间 |
ᵃ 对VMID的依赖即使在HCR_EL2.VM设置为0时也适用。架构不定义VTTBR_EL2.VMID的复位值,因此在包含EL2的任何实现中,在复位被解除时执行的引导软件必须初始化VTTBR_EL2.VMID。
ᵇ 使用的指令缓存类型影响对此表中指定条目的解释,使得:
- 对于PIPT指令缓存,缓存维护适用于其物理地址对应于指定地址的所有条目。
- 对于VIPT指令缓存,缓存维护适用于其虚拟索引和物理标签对应于指定地址的条目。
有关指令缓存类型的信息,请参阅指令缓存。
对于锁定条目和可能锁定的条目,缓存维护指令的行为如缓存锁定与缓存维护指令的交互中所述。
对于在条目已锁定或可能已锁定时生成中止的实现,当使用锁定中止时,这些中止可能发生在任何缓存维护指令上。
在包含EL2的实现中:
架构不要求在虚拟机之间切换时进行缓存Clean。必须防止按set/way的缓存Invalidate为虚拟机提供腐败与第二个虚拟机关联的状态的机会。为确保满足此要求,按set/way的Invalidate指令可以改为执行按set/way的Clean and Invalidate。
如数据缓存维护指令(DC)中所述,当在EL1、EL0执行AArch64数据缓存Invalidate指令DC IVAC和DC ISW,以及当在EL1执行AArch32数据缓存Invalidate指令DCIMVAC和DCISW时,可以配置为执行缓存Clean以及缓存Invalidate。
当以下全部为真时,在EL1执行的TLB Invalidate指令和IC IALLU指令在Inner Shareable域上广播:
- EL2在当前安全状态中实现并启用。
- HCR_EL2.FB的值为1。
有关缓存维护指令的更多信息,请参阅关于AArch64状态下的缓存维护、A64缓存维护指令和AArch64虚拟内存系统架构。
D7.5.9.14 缓存维护指令的边界条件
缓存维护指令对缓存进行操作,无论系统寄存器缓存性控制是否强制所有内存访问为Non-cacheable。
对于基于VA的缓存维护指令,指令对缓存进行操作,无论VMSA转换表条目中标记的内存地址的内存类型和缓存属性如何。这意味着缓存维护指令的效果可能适用,无论:
- 访问的地址是Normal内存还是Device内存。
- 地址是否有Cacheable属性还是Non-cacheable属性。
- 访问地址的任何适用域控制。
- 访问地址的访问权限,但stage 2写权限对数据或统一缓存Invalidate指令的影响除外。
D7.5.9.15 数据和指令缓存指令的排序和完成
所有数据缓存指令,除了指定地址的DC ZVA、DC GVA和DC GZVA:
- 相对于具有以下所有属性的加载或存储按程序顺序执行:
- 在最小大小缓存行的同一缓存行内访问具有Inner Write Through或Inner Write Back属性的Normal内存地址,如CTR_EL0.DMinLine所示。
- 使用与传递给数据缓存指令的地址具有相同缓存属性的地址。
- 相对于具有以下所有属性的加载或存储可以任何顺序执行:
- 在最小大小缓存行的同一缓存行内访问具有Inner Write Through或Inner Write Back属性的Normal内存地址,如CTR_EL0.DMinLine所示。
- 使用与传递给数据缓存指令的地址具有不同缓存属性的地址。
- 在加载或存储指令与数据缓存指令之间没有执行DMB或DSB。
- 相对于访问具有Device内存属性或Inner Non-cacheable属性的Normal内存的任何地址的加载或存储可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指定最小大小缓存行同一缓存行中地址的其他数据缓存指令(除DC ZVA、DC GVA和DC GZVA外)按程序顺序执行,如CTR_EL0.DMinLine所示。
- 相对于访问最小大小缓存行不同缓存行中地址的加载或存储可以任何顺序执行,如CTR_EL0.DMinLine所示,除非在指令之间执行了DMB或DSB。
- 相对于指定最小大小缓存行不同缓存行中地址的其他数据缓存指令(除DC ZVA、DC GVA和DC GZVA外)可以任何顺序执行,如CTR_EL0.DMinLine所示,除非在指令之间执行了DMB或DSB。
- 相对于指令缓存维护指令可以任何顺序执行,除非在指令之间执行了DSB。
- 相对于不指定地址的数据缓存维护指令可以任何顺序执行,除非在指令之间执行了DMB或DSB。
译者注: 尽管其助记符,DC ZVA、DC GVA和DC GZVA指令不是数据缓存维护指令。
译者注:
- 按地址的数据缓存排序规则与物理索引物理标记缓存一致。请参阅数据和统一缓存。
- 数据缓存零指令描述了数据缓存零的排序和完成规则。
所有不指定地址的数据缓存维护指令:
- 相对于不指定地址的其他数据缓存维护指令可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指定地址的数据缓存维护指令(除DC ZVA、DC GVA和DC GZVA外)可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于加载或存储可以任何顺序执行,除非在指令之间执行了DMB或DSB。
- 相对于指令缓存维护指令可以任何顺序执行,除非在指令之间执行了DSB。
所有指令缓存维护指令可以相对于其他指令缓存指令、数据缓存指令、加载和存储以任何顺序执行,除非在指令之间执行了DSB。
缓存维护指令可以在执行后的任何时间完成,但仅在执行缓存维护指令的PE执行DSB指令后才能保证完成,且其效果对其他观察者可见。另请参阅缓存维护指令在完成和端点排序中的要求。
在所有情况下,本节中提到的DMB或DSB是指其所需访问类型为加载和存储的DMB或DSB。
译者注: 本节根据
译者注: 这些排序要求从AArch32状态中的以下要求扩展而来:
- 缓存和分支预测器维护指令的排序。
- AArch32指令缓存维护指令(IC*)。
D7.5.9.15.1 数据缓存Clean到持久点的排序和完成
由于数据缓存Clean到持久点导致的对持久内存的更新保证在以下情况之后发生:
- 在执行数据缓存Clean到持久点之后执行适用于读取和写入的DSB。
- 由在原始数据缓存Clean到持久点之后出现的适用于读取和写入的DMB排序的另一个数据缓存Clean到持久点引起的对持久内存的更新。
译者注: 第二点是数据缓存Clean到持久点指令由DMB排序这一事实的一个方面,这控制着持久内存中的到达顺序。
DMB对数据缓存Clean到持久点的排序效果不足以确保在示例D7-1中,在内存位置X3中观察到值’1’意味着数据缓存Clean到持久点已导致对持久内存的更新:
示例D7-1 数据缓存Clean到持久点的排序效果
1 | ; 初始条件 [X3]=0 |
然而,在示例D7-2中,DMB指令的排序效果将确保位置P0:X1将在P1:X8之前或同时到达持久点。
示例D7-2 数据缓存Clean到持久点的排序效果
1 | ; 初始条件 P0:X3和P1:X3指向同一位置,在此示例开始时为0 |
D7.5.9.15.2 数据缓存Clean到深度持久点的排序和完成
由于数据缓存Clean到深度持久点导致的对深度持久内存的更新保证在以下情况之后发生:
- 在执行数据缓存Clean到深度持久点之后执行适用于读取和写入的DSB。
- 由在原始数据缓存Clean到深度持久点之后出现的适用于读取和写入的DMB排序的另一个数据缓存Clean到深度持久点引起的对深度持久内存的更新。
译者注: 第二点是数据缓存Clean到深度持久点指令由DMB排序这一事实的一个方面,这控制着深度持久内存中的到达顺序。
DMB对数据缓存Clean到深度持久点的排序效果不足以确保在示例D7-3中,在内存位置X3中观察到值’1’意味着数据缓存Clean到深度持久点已导致对深度持久内存的更新:
示例D7-3 数据缓存Clean到深度持久点的排序效果
1 | ; 初始条件 [X3]=0 |
然而,在示例D7-4中,DMB指令的排序效果将确保位置P0:X1将在P1:X8之前或同时到达深度持久点。
示例D7-4 数据缓存Clean到深度持久点的排序效果
1 | ; 初始条件 P0:X3和P1:X3指向同一位置,在此示例开始时为0 |
D7.5.9.16 执行缓存维护指令
为确保地址块中的所有缓存行通过所有缓存级别得到维护,Arm强烈建议软件:
- 对于数据或统一缓存维护,使用CTR_EL0.DMinLine值来确定数据缓存维护按VA指令循环的循环增量大小。
- 对于指令缓存维护,使用CTR_EL0.IMinLine值来确定指令缓存维护按VA指令循环的循环增量大小。
D7.5.9.16.1 缓存维护指令的示例代码
按set/way的缓存维护指令可以Clean或Invalidate,或同时两者,连接到PE的一个或多个级别的全部缓存。然而,除非附加到缓存的所有PE将所有内存位置视为Non-cacheable,否则无法防止在这种缓存维护指令序列期间将位置分配到缓存。
译者注: 由于set/way指令仅在本地执行,即使不同的PE同时执行相同的缓存维护指令,也不能保证不同PE之间缓存维护的原子性。由于任何可缓存行可以随时分配到缓存,缓存行可能以意味着该行不受基于set/way的缓存维护影响的方式从PE缓存迁移到不同PE的缓存。因此,Arm强烈反对使用set/way指令在相干系统中管理一致性。预期按set/way操作的缓存维护指令的用途仅限于与缓存的电源关闭和电源启动相关的缓存维护(如果实现需要)。
基于set/way维护的缓存维护限制意味着维护不会在多个PE上发生,并且不能为每个PE上的每个地址原子地发生。因此,在多处理器或多线程系统中,使用基于set/way的缓存维护来Clean或Clean and Invalidate整个缓存以进行一致性管理,对于具有非常大缓冲区或具有未知地址的缓冲区可能无法提供预期的一致性结果,这是由于其他PE或可能其他线程的推测性访问。可以在这种情况下使用这些指令的唯一方法是首先确保可能对需要维护的缓存产生推测性访问的所有PE不能产生推测性访问。这可以通过确保这些PE没有具有Normal Cacheable属性的内存位置来实现。这种方法可能对系统性能产生非常大的影响,Arm建议实现者在将成为问题的系统中使用硬件一致性机制。
系统级缓存指出了按set/way进行缓存维护的其他限制。
以下示例代码说明了将数据或统一缓存Clean到一致点的通用机制。它假定当前缓存大小标识寄存器为32位格式。有关更多信息,请参阅缓存大小标识寄存器CCSIDR_EL1的可能格式。
1 | MRS X0, CLIDR_EL1 |
类似的方法可用于所有缓存维护指令。
D7.5.10 数据缓存零指令
数据缓存零地址指令DC ZVA将0x00写入N字节块的每个字节,其中:
- 内存中的块由作为DC ZVA指令参数提供的地址标识。此地址没有对齐限制。
译者注: 这意味着包括所提供地址的内存块中的每个字节都设置为零。
- DCZID_EL0寄存器指示写入零字节值的块大小N字节。
软件可以限制对此指令的访问。请参阅可配置指令控制和DC ZVA指令的描述。
DC ZVA指令的行为如同对正在访问的位置执行一组存储,并且:
- 如果执行指令时使用的转换 regime 不允许写入位置,则生成权限故障。
- 需要与任何其他存储指令相同的排序和一致性管理注意事项。
此外:
- 当执行指令时,它可以生成以与其他内存相关故障或观察点相同的方式优先处理的内存故障或观察点。当生成同步数据中止故障或观察点时,综合字段中的CM位未设置为1,这将是所有其他缓存维护指令的情况。请参阅数据中止异常的ISS编码以获取有关关联ESR_ELx.ISS字段编码的更多信息。
- 如果被零初始化的内存区域是不支持非对齐访问的任何类型的Device内存,则DC ZVA生成优先级与内存类型确定的其他对齐故障相同的对齐故障。
译者注: 架构对DC ZVA指令是否会导致分配到任何特定缓存级别不作任何声明,对于为这些缓存级别具有可缓存属性的地址。
尽管其助记符,DC ZVA指令不是数据缓存维护指令。
D7.5.11 缓存锁定
缓存中条目锁定的概念是允许的,但架构未定义。如何实现锁定是实现定义的,可能不被以下支持:
- 某一实现。
- 某些内存属性。
缓存中未锁定的条目可能不在该缓存中。架构不保证未锁定的缓存条目保留在缓存中或与内存的其余部分保持不一致。软件不能假设未锁定的项目保留在缓存中时保持脏。
缓存中锁定的条目保证保留在该缓存中。架构不保证锁定的缓存条目与内存的其余部分保持不一致,即它可能不保持脏。
译者注: “锁定”是指将缓存行固定在缓存中,使其不会被驱逐。这用于关键代码/数据的性能优化。
D7.5.11.1 缓存锁定与缓存维护指令的交互
缓存锁定与缓存维护指令的交互是实现定义的。但是,锁定缓存行上的架构定义缓存维护指令必须遵守以下一般规则:
到PoPA的缓存维护操作影响缓存条目,无论锁定状态如何。
以下指令对锁定缓存条目的效果是实现定义的:
- 按set/way的缓存Clean,DC CSW。
- 按set/way的缓存Invalidate,DC ISW。
- 按set/way的缓存Clean and Invalidate,DC CISW。
- 指令缓存全部Invalidate,IC IALLU和IC IALLUIS。
但在所有这些情况下,必须采用以下方法之一:
- 如果指令指定了Invalidate,则锁定条目不会从缓存中Invalidate。
- 如果指令指定了Clean,则锁定条目是否被Clean是实现定义的。
- 如果条目被锁定或可能被锁定,则生成实现定义的数据中止异常,使用为此目的定义的DFSC值,请参阅数据中止异常的ISS编码。
这允许缓存Invalidate例程的使用模型通过对整个缓存执行所需操作来对大范围地址进行操作,而不必考虑任何缓存条目是否被锁定。
以下指令对锁定缓存条目的效果是实现定义的:
- 按虚拟地址的缓存Clean,DC CVAC、DC CVAP和DC CVAU。
- 按虚拟地址的缓存Invalidate,DC IVAC。
- 按虚拟地址的缓存Clean and Invalidate,DC CIVAC。
但在所有这些情况下,必须采用以下方法之一:
- 如果指令指定了Invalidate,则锁定条目从缓存中Invalidate。对于Clean and Invalidate指令,必须在Invalidate之前执行Clean。
- 如果指令指定了Invalidate,则锁定条目不会从缓存中Invalidate。如果指令指定了Clean,则锁定条目是否被Clean是实现定义的。
- 如果条目被锁定或可能被锁定,则生成实现定义的数据中止异常,使用为此目的定义的DFSC值。请参阅ESR_ELx。
在包含在当前安全状态中启用的EL2的实现中,如果HCR_EL2.TIDCP设置为1,则与条目锁定相关的任何异常都路由到EL2。
译者注: 使用中止机制处理可能被锁定但实际未锁定的条目的实现必须:
- 记录执行未锁定条目所需操作的实现定义指令序列。
- 为锁定条目实现其他允许的替代方案之一。
Arm建议,当可能时,这种实现定义的指令序列使用架构定义的指令。这最大限度地减少了所需的定制指令数量。
此外,使用中止来处理可能已锁定缓存维护指令的实现必须提供确保缓存中没有条目被锁定的机制。
缓存的复位设置必须是缓存中没有条目被锁定。
D7.5.11.1.1 用于实现锁定的附加缓存功能
实现可以添加额外的缓存维护功能来处理实现定义空间中保留的缓存锁定,请参阅实现定义寄存器的保留编码。
D7.5.12 系统级缓存
ARM架构将系统缓存定义为未在PE缓存标识寄存器CCSIDR_EL1和CLIDR_EL1中描述的缓存,且对于这些缓存,set/way缓存维护指令不适用。
从概念上讲,可以设想三类系统缓存:
位于一致点之前且无法通过任何缓存维护指令管理的系统缓存。这类系统从根本上破坏了到一致点操作的缓存维护指令的概念,因为它们意味着使用非架构机制来管理一致性。ARM架构明确禁止使用此类系统。
位于一致点之前且可以通过适用于一致点的按地址缓存维护指令管理,但无法通过按set/way缓存维护指令管理的系统缓存。当必须对此类缓存的全部进行维护时(如电源管理情况),必须使用非架构机制执行。
位于一致点之外因此对程序员管理一致性目的不可见的系统缓存。
译者注: 如果支持对此类缓存全部的维护,则是系统的实现定义属性。
D7.5.13 分支预测
在AArch64架构中,分支预测器在架构上不可见。
有关对分支预测器推测效果的限制的详细信息,请参阅推测效果的限制。
D7.6 外部中止(External aborts)
D7.6 外部中止(External aborts)
ARM架构将外部中止定义为发生在内存系统中的错误,但不包括由MMU或调试逻辑检测到的错误。外部中止可能会向PE发送数据损坏信号。例如,某个内存位置可能已被损坏,而硬件使用奇偶校验或纠错码(ECC)检测到了这种损坏。该错误可能已被传播。RAS扩展为软件提供了确定损坏程度和阻止错误传播的机制。有关更多信息,请参阅《RAS PE架构》。
外部中止包括以下类型:
- 同步中止(Synchronous)。
- 精确异步中止(Precise asynchronous)。
- 非精确异步中止(Imprecise asynchronous)。
有关更多信息,请参阅异常入口术语。
RAS扩展提供了更细粒度的中止分类。当未实现RAS扩展时,ARM架构不提供区分精确异步外部中止和非精确异步外部中止的方法。
支持哪些外部中止(如果有的话)是实现定义的(IMPLEMENTATION DEFINED)。
数据访问和页表遍历(数据访问)上的外部中止可以是同步的,也可以是异步的。
当未实现FEAT_DoubleFault时,指令取址和页表遍历(指令取址)上的外部中止可以是同步的,也可以是异步的。
当实现了FEAT_DoubleFault时,所有指令取址和页表遍历(指令取址)上的外部中止异常必须是同步的。
指令取址(包括页表遍历)上的同步外部中止通过指令中止异常精确获取。
数据读取或写入(包括页表遍历)上的同步外部中止通过数据中止异常精确获取。
请参阅同步异常类型。
异步外部中止通过SError异常获取。请参阅异步异常类型。
失败内存访问的效果在精确异常和非精确异常的定义中描述。
通常,外部中止很少见。非精确异步外部中止可能导致正在运行的进程致命崩溃,ARM建议实现尽可能将外部中止变为精确的。
以下小节提供有关可能发生的外部中止的更多信息:
- 外部中止分类的规定。
- 奇偶校验或ECC错误报告(RAS扩展未实现时)。
D7.6.1 外部中止分类的规定
在AArch64状态下,实现可以使用ESR_ELx.EA、ISS[9]来提供关于同步外部中止的更多信息。对于除同步外部中止之外的所有同步中止,ESR_ELx.EA、ISS[9]返回值为0。
如果实现了FEAT_RAS:
- ESR_ELx.SET字段提供关于同步外部中止后PE状态的信息。
- ESR_ELx.AET字段可能包含关于作为SError异常获取的异步中止的更多信息。
- 实现可以定义错误记录寄存器。
有关更多信息,请参阅:
- 指令中止异常的ISS编码。
- 数据中止异常的ISS编码。
- SError异常的ISS编码。
- 错误异常获取。
D7.6.2 奇偶校验或ECC错误报告,RAS扩展未实现
ARM架构支持从缓存系统报告同步和异步奇偶校验或ECC错误。缓存系统中的奇偶校验或ECC错误(如果有的话)是导致同步还是异步奇偶校验或ECC错误是实现定义的。
定义了错误代码用于报告奇偶校验或ECC错误。但是,当实现奇偶校验或ECC错误报告时,奇偶校验或ECC错误是使用指定的错误代码报告还是使用其他适当的编码报告是实现定义的。
除错误状态编码外的所有目的,奇偶校验或ECC错误都被视为外部中止。
D7.7 内存屏障指令(Memory barrier instructions)
D7.7 内存屏障指令
内存屏障描述了内存屏障指令。本节描述这些指令的系统级控制机制。
D7.7.1 EL2对在EL0或EL1执行的DSB指令维护作用域的控制
在包含EL2且在当前安全状态下启用了该实现中,且支持对DSB指令的维护作用域控制时,HCR_EL2.BSU字段可以修改在EL0或EL1执行的指令所需的维护作用域。表D7-9显示了该字段的编码。
表D7-9 EL2对DSB维护作用域的控制,用于约束在EL0或EL1执行的加载和存储
| HCR_EL2.BSU | DSB指令的最小维护作用域 |
|---|---|
| 00 | 无效果,维护作用域由指令指定 |
| 01 | 内部共享域(Inner Shareable) |
| 10 | 外部共享域(Outer Shareable) |
| 11 | 全系统(Full system) |
译者注: HCR_EL2是Hypervisor Configuration Register(虚拟机监控器配置寄存器),BSU(Barrier Shareability Upstream)字段用于控制内存屏障指令的共享域属性向上转换。当在EL0或EL1执行的DSB指令指定的共享域小于BSU字段指定的值时,实际执行的维护作用域会被提升到BSU指定的值。
对于在EL0或EL1执行的指令,表D7-10显示了HCR_EL2.BSU如何与DSB参数指定的维护作用域(针对加载和存储)组合,以得出指令的实际维护作用域。
表D7-10 HCR_EL2.BSU对在EL1或EL0执行的屏障指令的影响
| DSB参数指定的维护作用域 | HCR_EL2.BSU | 最终维护作用域 |
|---|---|---|
| 全系统(Full system) | 任意值 | 全系统 |
| 外部共享域(Outer Shareable) | 00、01或10 | 外部共享域 |
| 外部共享域(Outer Shareable) | 11或全系统 | 全系统 |
| 内部共享域(Inner Shareable) | 00或01 | 内部共享域 |
| 内部共享域(Inner Shareable) | 10或外部共享域 | 外部共享域 |
| 内部共享域(Inner Shareable) | 11或全系统 | 全系统 |
| 非共享域(Non-shareable) | 00(无效果) | 非共享域 |
| 非共享域(Non-shareable) | 01或内部共享域 | 内部共享域 |
| 非共享域(Non-shareable) | 10或外部共享域 | 外部共享域 |
| 非共享域(Non-shareable) | 11或全系统 | 全系统 |
译者注: 此表说明了BSU字段如何与DSB指令自身的参数组合。当DSB指令参数指定的共享域小于BSU指定值时,实际作用域会升级到BSU指定的共享域级别;如果DSB已指定全系统范围,则BSU字段不起作用。这允许虚拟机监控器(EL2)强制提升运行在EL0/EL1的虚拟机代码所执行内存屏障的作用域,确保系统级内存 ordering 正确性。
M.b — 非保密(Non-Confidential)
D7.8 内存系统指令的伪代码描述( Pseudocode description of general memory System instructions)
This section lists the pseudocode describing general memory operations:
本节列出了描述通用内存操作的伪代码:
• Memory data type definitions. (内存数据类型定义。)
• Basic memory access. (基本内存访问。)
• Aligned memory access. (对齐内存访问。)
• Unaligned memory access. (非对齐内存访问。)
• Exclusives monitors operations. (排他性监视器操作。)
• Access permission checking. (访问权限检查。)
• Abort exceptions. (中止异常。)
• Memory barriers. (内存屏障。)
D7.8.1 Memory data type definitions
D7.8.1 内存数据类型定义
This section lists the memory data types.
本节列出内存数据类型。
The memory data types are:
内存数据类型包括:
• Address descriptor, defined by the AddressDescriptor type. (地址描述符,由 AddressDescriptor 类型定义。)
• Full address, defined by the FullAddress type. (完整地址,由 FullAddress 类型定义。)
• Memory attributes, defined by the MemoryAttributes type. (内存属性,由 MemoryAttributes 类型定义。)
• Memory type, defined by the MemType enumeration. (内存类型,由 MemType 枚举定义。)
• Device memory type, defined by the DeviceType enumeration. (设备内存类型,由 DeviceType 枚举定义。)
• Normal memory attributes, defined by the MemAttrHints type. (普通内存属性,由 MemAttrHints 类型定义。)
• Cacheability attributes, defined by the MemAttr_NC, MemAttr_WT, and MemAttr_WB constants. (缓存属性,由 MemAttr_NC、MemAttr_WT 和 MemAttr_WB 常量定义。)
• Allocation hints, defined by the MemHint_No, MemHint_WA, MemHint_RA, and MemHint_RWA constants. (分配提示,由 MemHint_No、MemHint_WA、MemHint_RA 和 MemHint_RWA 常量定义。)
• Access permissions, defined by the Permissions type. (访问权限,由 Permissions 类型定义。)
译者注: AddressDescriptor 和 FullAddress 是ARM伪代码中用于描述内存地址的核心数据类型。AddressDescriptor 包含地址及其属性信息,而 FullAddress 通常指物理地址。
These types are defined in A-profile Architecture Pseudocode.
这些类型在 A-profile Architecture Pseudocode 中定义。
D7.8.2 Basic memory access
D7.8.2 基本内存访问
The PhysMemRead() and PhysMemWrite() functions perform single-copy atomic, aligned, little-endian memory accesses of size bytes to or from the underlying physical memory array of bytes.
PhysMemRead() 和 PhysMemWrite() 函数执行单拷贝原子性的、对齐的、Little-Endian 字节序的内存访问,访问大小为 size 字节,对底层物理内存字节数组进行读或写操作。
The attributes in memaddrdesc.memattrs are used by the memory system to determine caching and ordering behaviors as described in Memory types and attributes, Ordering relations, and Atomicity in the Arm architecture.
memaddrdesc.memattrs 中的属性由内存系统用于确定缓存和排序行为,具体描述见 ARM 架构中的内存类型与属性、排序关系和原子性。
译者注: single-copy atomic 意味着该访问是原子的,不会被分割成多个独立的访问操作。little-endian 表示字节序,小端格式。
D7.8.3 Aligned memory access
D7.8.3 对齐内存访问
The AArch64_MemSingle{size}() accessor makes atomic, little-endian accesses.
AArch64_MemSingle{size}() 访问器执行原子性的 Little-Endian 访问。
译者注: {size} 是占位符,实际使用时会替换为具体的数据大小,如 8、16、32 或 64 位等。
D7.8.4 Unaligned memory access
D7.8.4 非对齐内存访问
The Mem{size}() accessor make accesses of the required type. If an access is not architecturally defined to be atomic, Mem() synthesizes accesses from multiple calls to AArch64_MemSingle{}(). It also reverses the byte order if the access is big-endian.
Mem{size}() 访问器执行所需类型的访问。如果某个访问在架构上未被定义为原子性的,则 Mem() 通过多次调用 AArch64_MemSingle{}() 来合成该访问。如果访问是 Big-Endian 字节序,它还会反转字节顺序。
译者注: big-endian(大端)字节序与 little-endian(小端)相反,数据的最高有效字节存储在最低地址。
D7.8.5 Exclusives monitors operations
D7.8.5 排他性监视器操作
The AArch64_SetExclusiveMonitors() function sets the Exclusives monitors for a block of bytes, the size of which is determined by size, at the virtual address defined by address.
AArch64_SetExclusiveMonitors() 函数为一块字节设置排他性监视器(Exclusives monitors),该字节块的大小由 size 参数决定,地址由 address 参数指定的虚拟地址确定。
The AArch64_ExclusiveMonitorsPass() function checks whether the Exclusives monitors are set to include the location of a number of bytes specified by size, at the virtual address defined by address. The atomic write that follows after the Exclusives monitors have been set must be to the same physical address. It is permitted, but not required, for this function to return FALSE if the virtual address is not the same as that used in the previous call to AArch64_SetExclusiveMonitors().
AArch64_ExclusiveMonitorsPass() 函数检查排他性监视器是否已设置为包含由 size 参数指定的字节数,位于由 address 参数定义的虚拟地址处。在排他性监视器设置之后的后续原子写操作必须发送到相同的物理地址。如果虚拟地址与上一次调用 AArch64_SetExclusiveMonitors() 时使用的地址不同,此函数允许(但不是必须)返回 FALSE。
译者注: 排他性监视器用于实现 Load-Exclusive 和 Store-Exclusive 指令(如 LDREX/STREX),确保在多处理器系统中对共享内存的原子操作。
The ExclusiveMonitorsStatus() function returns 0 if the previous atomic write was to the same physical memory locations selected by AArch64_ExclusiveMonitorsPass() and therefore succeeded. Otherwise the function returns 1, indicating that the address translation delivered a different physical address.
ExclusiveMonitorsStatus() 函数如果前一次原子写操作发送到了由 AArch64_ExclusiveMonitorsPass() 选择的相同物理内存位置(即操作成功),则返回 0。否则该函数返回 1,表示地址转换产生了不同的物理地址。
The MarkExclusiveGlobal() procedure takes as arguments a FullAddress paddress, the PE identifier processorid and the size of the transfer. The procedure records that the PE processorid has requested exclusive access covering at least size bytes from address paddress. The size of the location marked as exclusive is IMPLEMENTATION DEFINED, up to a limit of 2KB and no smaller than two words, and aligned in the address space to the size of the location. It is CONSTRAINED UNPREDICTABLE whether this causes any previous request for exclusive access to any other address by the same PE to be cleared.
MarkExclusiveGlobal() 过程接受 FullAddress 类型的 paddress(物理地址)、PE 标识符 processorid 和传输大小作为参数。该过程记录 PE processorid 已请求覆盖从地址 paddress 开始的至少 size 字节的排他访问。被标记为排他的位置大小是 IMPLEMENTATION DEFINED(实现定义)的,上限为 2KB,且不小于两个字(two words),并在地址空间中按位置大小对齐。是否因此清除同一 PE 对任何其他地址的先前排他访问请求是 CONSTRAINED UNPREDICTABLE(受约束的不可预测行为)。
译者注: CONSTRAINED UNPREDICTABLE 是 ARM 架构中的一种机制,允许某些实现行为在特定范围内变化,但必须符合架构约束。
The MarkExclusiveLocal() procedure takes as arguments a FullAddress paddress, the PE identifier processorid and the size of the transfer. The procedure records in a local record that PE processorid has requested exclusive access to an address covering at least size bytes from address paddress. The size of the location marked as exclusive is IMPLEMENTATION DEFINED, and can at its largest cover the whole of memory but is no smaller than two words, and is aligned in the address space to the size of the location. It is IMPLEMENTATION DEFINED whether this procedure also performs a MarkExclusiveGlobal() using the same parameters.
MarkExclusiveLocal() 过程接受 FullAddress 类型的 paddress(物理地址)、PE 标识符 processorid 和传输大小作为参数。该过程在本地记录中记录 PE processorid 已请求排他访问覆盖从地址 paddress 开始的至少 size 字节的地址。被标记为排他的位置大小是 IMPLEMENTATION DEFINED(实现定义)的,最大可以覆盖整个内存,但不小于两个字,并在地址空间中按位置大小对齐。此过程是否也使用相同参数执行 MarkExclusiveGlobal() 是 IMPLEMENTATION DEFINED(实现定义)的。
The IsExclusiveGlobal() function takes as arguments a FullAddress paddress, the PE identifier processorid and the size of the transfer. The function returns TRUE if the PE processorid has marked in a global record an address range as exclusive access requested that covers at least size bytes from address paddress. It is IMPLEMENTATION DEFINED whether it returns TRUE or FALSE if a global record has marked a different address as exclusive access requested. If no address is marked in a global record as exclusive access, IsExclusiveGlobal() returns FALSE.
IsExclusiveGlobal() 函数接受 FullAddress 类型的 paddress(物理地址)、PE 标识符 processorid 和传输大小作为参数。如果 PE processorid 已在全局记录中标记了一个地址范围作为排他访问请求,且该范围覆盖从地址 paddress 开始的至少 size 字节,则该函数返回 TRUE。如果全局记录已标记不同的地址作为排他访问请求,则返回 TRUE 还是 FALSE 是 IMPLEMENTATION DEFINED(实现定义)的。如果没有地址在全局记录中被标记为排他访问请求,则 IsExclusiveGlobal() 返回 FALSE。
The IsExclusiveLocal() function takes as arguments a FullAddress paddress, the PE identifier processorid and the size of the transfer. The function returns TRUE if the PE processorid has marked an address range as exclusive access requested that covers at least the size bytes from address paddress. It is IMPLEMENTATION DEFINED whether this function returns TRUE or FALSE if the address marked as exclusive access requested does not cover all of size bytes from address paddress. If no address is marked as exclusive access requested, then this function returns FALSE. It is IMPLEMENTATION DEFINED whether this result is ANDed with the result of IsExclusiveGlobal() with the same parameters.
IsExclusiveLocal() 函数接受 FullAddress 类型的 paddress(物理地址)、PE 标识符 processorid 和传输大小作为参数。如果 PE processorid 已标记了一个地址范围作为排他访问请求,且该范围覆盖从地址 paddress 开始的至少 size 字节,则该函数返回 TRUE。如果被标记为排他访问请求的地址未完全覆盖从地址 paddress 开始的 size 字节,则返回 TRUE 还是 FALSE 是 IMPLEMENTATION DEFINED(实现定义)的。如果没有地址被标记为排他访问请求,则该函数返回 FALSE。此结果是否与使用相同参数的 IsExclusiveGlobal() 的结果进行 AND 运算是 IMPLEMENTATION DEFINED(实现定义)的。
The ClearExclusiveByAddress() procedure takes as arguments a FullAddress paddress, the PE identifier processorid and the size of the transfer. The procedure clears the global records of all PEs, other than processorid, for which an address region including any of size bytes starting from paddress has had a request for an exclusive access. It is IMPLEMENTATION DEFINED whether the equivalent global record of the PE processorid is also cleared if any of size bytes starting from paddress has had a request for an exclusive access, or if any other address has had a request for an exclusive access.
ClearExclusiveByAddress() 过程接受 FullAddress 类型的 paddress(物理地址)、PE 标识符 processorid 和传输大小作为参数。该过程清除所有其他 PE(除 processorid 外)的全局记录,这些记录中任何包含从 paddress 开始的 size 字节的地址区域已有排他访问请求。从 paddress 开始的任何 size 字节已有排他访问请求,或者任何其他地址已有排他访问请求时,是否也清除 PE processorid 的等效全局记录是 IMPLEMENTATION DEFINED(实现定义)的。
The ClearExclusiveLocal() procedure takes as arguments the PE identifier processorid. The procedure clears the local record of PE processorid for which an address has had a request for an exclusive access. It is IMPLEMENTATION DEFINED whether this operation also clears the global record of PE processorid that an address has had a request for an exclusive access.
ClearExclusiveLocal() 过程接受 PE 标识符 processorid 作为参数。该过程清除 PE processorid 的本地记录中任何已有排他访问请求的地址。此操作是否也清除 PE processorid 中任何已有排他访问请求地址的全局记录是 IMPLEMENTATION DEFINED(实现定义)的。
D7.8.6 Access permission checking
D7.8.6 访问权限检查
The AArch64_S1CheckPermissions() and AArch64_S2CheckPermissions() functions are used by the architecture to perform access permission checking based on attributes derived from the Translation Table descriptors.
AArch64_S1CheckPermissions() 和 AArch64_S2CheckPermissions() 函数由架构使用,基于从页表描述符(Translation Table descriptors)派生的属性执行访问权限检查。
译者注: S1 指第一阶段地址转换(Stage 1 translation),通常用于 EL0/EL1 的虚拟地址到物理地址的转换;S2 指第二阶段地址转换(Stage 2 translation),通常用于 EL2/EL3 或虚拟机管理程序控制的地址转换。
The interpretation of access permission is shown in Memory access control.
访问权限的解释见内存访问控制(Memory access control)。
D7.8.7 Abort exceptions
D7.8.7 中止异常
The AArch64_Abort() function generates either a Data Abort or an Instruction Abort exception by calling AArch64_DataAbort() or AArch64_InstructionAbort(). It also can generate a debug exception for debug related faults, see AArch64 Self-hosted Debug.
AArch64_Abort() 函数通过调用 AArch64_DataAbort() 或 AArch64_InstructionAbort() 生成 Data Abort(数据中止)或 Instruction Abort(指令中止)异常。它还可以为调试相关故障生成调试异常,见 AArch64 Self-hosted Debug。
译者注: Self-hosted Debug 是 ARM 架构中的一种调试模型,其中调试功能由处理器自身实现。
The AArch64_DataAbort() function generates a Data Abort exception, routes the exception to EL2 or EL3, and records the information required for the Exception Syndrome registers, ESR_ELx. See ISS encoding for an exception from a Data Abort. A second stage abort might also record the intermediate physical address, IPA, but this depends on the type of the abort.
AArch64_DataAbort() 函数生成 Data Abort 异常,将异常路由到 EL2 或 EL3,并记录异常综合征寄存器 ESR_ELx 所需的信息。见 Data Abort 异常的 ISS 编码。第二阶段中止(second stage abort)也可能记录中间物理地址 IPA,但这取决于中止的类型。
For a synchronous abort, AArch64_DataAbort() also sets the FAR to the VA of the abort.
对于同步中止(synchronous abort),AArch64_DataAbort() 还会将 FAR(Fault Address Register,故障地址寄存器)设置为中止的虚拟地址 VA。
The AArch64_InstructionAbort() function generates an Instruction Abort exception, routes the exception to EL2 or EL3, and records the information required for the Exception Syndrome registers, ESR_ELx, see ISS encoding for an exception from an Instruction Abort. A second stage abort might also record the intermediate physical address, IPA, but this depends on the type of the abort.
AArch64_InstructionAbort() 函数生成 Instruction Abort 异常,将异常路由到 EL2 或 EL3,并记录异常综合征寄存器 ESR_ELx 所需的信息。见 Instruction Abort 异常的 ISS 编码。第二阶段中止也可能记录中间物理地址 IPA,但这取决于中止的类型。
For a synchronous abort, AArch64_InstructionAbort() also sets the FAR to the VA of the abort.
对于同步中止,AArch64_InstructionAbort() 还会将 FAR 设置为中止的虚拟地址 VA。
The FaultRecord type describes a fault. Functions that check for faults return a record of this type appropriate to the type of fault.
FaultRecord 类型描述故障。检查故障的函数返回此类型的记录,适用于该类型的故障。
The function NoFault() returns a null record that indicates no fault. The IsFault() function tests whether a FaultRecord contains a fault.
NoFault() 函数返回一个空记录,表示没有故障。IsFault() 函数测试 FaultRecord 是否包含故障。
D7.8.8 Memory barriers
D7.8.8 内存屏障
The definition for the memory barrier functions is given by the enumerations MBMaintenanceScope and MBReqTypes.
内存屏障函数的定义由枚举 MBMaintenanceScope 和 MBReqTypes 给出。
These enumerations define the required shareability domains and required access types used as arguments for DMB and DSB instructions.
这些枚举定义了所需的可共享性域(shareability domains)和所需访问类型,用作 DMB 和 DSB 指令的参数。
译者注: DMB(Data Memory Barrier,数据内存屏障)和 DSB(Data Synchronization Barrier,数据同步屏障)是 ARM 架构中的内存屏障指令。MBMaintenanceScope 定义屏障维护的范围(如内部共享域或外部共享域),MBReqTypes 定义需要屏障的访问类型(如读访问、写访问或两者)。
The procedures DataMemoryBarrier, DataSynchronizationBarrier, and InstructionSynchronizationBarrier perform the memory barriers.
DataMemoryBarrier、DataSynchronizationBarrier 和 InstructionSynchronizationBarrier 过程执行内存屏障操作。
译者注: DataMemoryBarrier 对应 DMB 指令,DataSynchronizationBarrier 对应 DSB 指令,InstructionSynchronizationBarrier 对应 ISB 指令。
术语表
| 英文 | 中文 |
|---|---|
| Memory Model | 内存模型 |
| Address space | 地址空间 |
| Cache | 缓存 |
| Memory barrier | 内存屏障 |
| External abort | 外部中止 |
| Mixed-endian | 混合端序 |
| Memory Encryption Context | 内存加密上下文 |
| PoC | 一致性点 |
| PoU | 统一点 |
| PoP | 持久点 |
| DMB | 数据存储屏障 |
| DSB | 数据同步屏障 |
| ISB | 指令同步屏障 |
本文档基于 ARM DDI 0487 文档翻译,版权所有 © 2013-2026 Arm Limited。