ARM架构下的cache transient allocation hint以及SMMUv2的TRANSIENTCFG配置详解
在 ARMv8 架构文档中,“transient allocation(瞬时分配)”是一个与缓存行为相关的术语,主要用于描述某些内存访问的缓存策略。以下是它的含义和作用的简要解释:
ARM架构下的transient概念以及什么是transient allocation
- 一,什么是 Transient Allocation?
- 📌 关键点总结:
- 1.1 使用方式
- 1. **设置 MAIR 寄存器**
- 2. **选择合适的 Cache Allocation Hint**
- 1.2 注意事项
- 1.3 应用场景举例
- 二,Transient Allocation Hint 与Cache Allocation policy有什么关系?
- 2.1 关系说明:
- 2.2 举个例子:
- 2.3 总结
- 三,Transient 和 Non-transient的区别
- 3.1 核心区别:Transient vs Non-transient
- 3.2 存储位置说明
- 3.3 MAIR 配置示例
- 3.4 实际影响
- 3.5 总结
- 四,SMMUv2 Transient Hint 的定义与本质
- 1. **SMMUv2 中 Transient Hint 的配置与传递**
- **a) 属性来源与传递路径**
- **b) 相关寄存器字段**
- **c) TRANSIENTCFG 配置值说明**
- 2. **与 Allocation Policy 的关系**
- 3. **总结**
- 五, **TRANSIENTCFG =0b00 Use the default transient allocation attributes. 到底是 transient 还是 non-transient?**
- 六, **SMMU_S2CR、SMMU_CBn_SCTLR和SMMU_SCR0三个寄存器TRANSIENTCFG的作用范围**
- 6.1 **SMMU_S2CRn.TRANSIENTCFG**
- 6.2 **SMMU_CBn_SCTLR.TRANSIENTCFG**
- 6.3 **SMMU_SCR0.TRANSIENTCFG**
- 6.4 **优先级顺序(从高到低)**
- 6.5 **实际生效流程**
- 七 **SMMU_S2CRn.TRANSIENTCFG、SMMU_CBn_SCTLR.TRANSIENTCFG、SMMU_SCR0.TRANSIENTCFG** 和 **MAIR 寄存器中的 transient 配置** 之间的关系
- **A. SMMU 各级寄存器的 TRANSIENTCFG**
- **B. MAIR(Memory Attribute Indirection Register)中的 transient 配置**
- **两者的关系与优先级**
- **关系梳理**
- **优先级与覆盖关系**
- 3. **实际工程举例**
- 5. **总结建议**
- 八, **TRANSIENTCFG、WACFG、RACFG**之间的关系和区别:
- 1. **字段含义与作用**
- **TRANSIENTCFG**
- **WACFG(Write-Allocate Configuration)**
- **RACFG(Read-Allocate Configuration)**
- 2. **三者的关系**
- 3. **实际工程配置举例**
- 4. **与 MAIR 的关系**
- 如果上游设备发起的 transaction 的 Allocation 属性为 NONE(即不分配缓存),SMMU 的 TRANSIENTCFG 还会起作用吗?
- **1. Allocation 为 NONE 时,TRANSIENTCFG 不起作用**
- **2. 典型场景举例**
- **3. 总结表格**
- **SMMUv2 内存属性覆盖决策流程**
- 情况1. **Client port bypass(CLIENTPD)**
- 情况2. **StreamID 匹配**
- 情况3. **S2CR.TYPE 决策**
- 情况4. **上下文有效性检查**
- 情况5. **属性合成(Combine)**
- 情况6. **特殊归一化处理**
- **工程实践建议**
- 九,在 stage2 bypass(即“stage 1 with stage 2 bypass”)场景下的属性融合:
- 1. **stage2 bypass 场景下的属性融合路径**
- 2. **Combine_allocate 的实际行为**
- 3. **工程实践总结**
一,什么是 Transient Allocation?
Transient allocation 是一种缓存分配提示(cache allocation hint),用于指示某个内存区域的数据在缓存中只需要保留较短时间。这种提示可以帮助系统优化缓存使用,减少缓存污染。
📌 关键点总结:
-
用途:
- 用于标记那些只会被短期使用的数据。
- 适用于读写访问,提示缓存系统不要长期保留这些数据。
-
实现方式:
- 在支持该功能的实现中,Transient hint 是通过设置 MAIR(Memory Attribute Indirection Register)中的特定位来实现的。
- 可以分别为 Inner Cacheable 和 Outer Cacheable 区域设置 Transient 属性。
-
影响:
- 系统可能会限制这些瞬时条目的缓存分配,以避免驱逐其他更重要的缓存条目。
- 减少缓存污染:避免短期数据挤占长期有用数据的缓存空间。Implementations can use the cache allocation hints to limit cache pollution to a part of a cache, such as to a subset of ways.
- 有助于提升缓存效率,尤其在处理大量临时数据时。
-
与其他缓存提示的关系:
- Transient hint 是对 Read-Allocate 和 Write-Allocate 的进一步限定。
- 例如:可以设置为
Transient Read-Allocate
或Transient Write-Allocate
。
-
架构支持情况:
- 是否支持 Transient hint 是 IMPLEMENTATION DEFINED,即由具体的处理器实现决定。
1.1 使用方式
在 ARMv8 架构中,Transient Allocation 通过设置 MAIR(Memory Attribute Indirection Register) 中的相关字段来启用。具体方式如下:
1. 设置 MAIR 寄存器
- 在 AArch64 中使用
MAIR_EL1
,MAIR_EL2
,MAIR_EL3
- 在 AArch32 中使用
MAIR0
,MAIR1
,HMAIR0
,HMAIR1
这些寄存器中的某些字段可以设置为支持 Transient Hint。
2. 选择合适的 Cache Allocation Hint
当实现支持 Transient Hint 时,可以使用以下提示:
-
读访问(Read Access)
Read-Allocate
Transient Read-Allocate
No Read-Allocate
-
写访问(Write Access)
Write-Allocate
Transient Write-Allocate
No Write-Allocate
⚠️ 注意:这些提示是 实现定义(IMPLEMENTATION DEFINED) 的,意味着不同的处理器可能支持不同的行为。
1.2 注意事项
- Transient Hint 是对 Cache Allocation Hint 的修饰符,表示该内存区域的数据是“短期有用”的。
- Transient Hint 适用于 Inner Cacheable 和 Outer Cacheable 区域。
- 并非所有实现都支持 Transient Hint,使用前需查阅具体处理器的技术参考手册。
- Transient Hint 不等同于 Non-cacheable。即使设置为 No Allocate,也可能仍然是 Cacheable 的,只是不会主动分配缓存。
- 架构未定义“短期”具体时间长度,由实现自行决定。
1.3 应用场景举例
场景 | 描述 |
---|---|
DMA 缓冲区 | 数据传输后即被丢弃,不再使用 |
图像处理 | 中间计算结果只在当前帧有效 |
网络包处理 | 包处理完即释放 |
临时日志或调试信息 | 仅用于短期分析 |
二,Transient Allocation Hint 与Cache Allocation policy有什么关系?
Cache Allocation Policy 指 缓存替换策略,常用的缓存替换策略有:
- LRU(Least Recently Used)
- Round-Robin
- FIFO(First-In First-Out)
- Random Replacement
- PLRU(Pseudo-LRU)
这些策略决定了当缓存满了之后,哪个缓存行会被替换,被选中的cache line如果是dirty的,将会被驱逐到下一级内存中。
2.1 关系说明:
Transient Hint 并不直接指定使用哪种替换策略,但它会影响这些策略的行为:
- 当数据被标记为 Transient,处理器可能会将其放入 更容易被替换的位置。
- 在使用 LRU 的系统中,Transient 数据可能会被放在最近最少使用的列表末端,从而更快被淘汰。
- 在 Round-Robin 或 FIFO 中,Transient 数据可能被优先加入替换队列。
换句话说,Transient Hint 是一种“优先淘汰”提示,而具体如何淘汰,是由 Allocation Policy(替换策略)决定的。
2.2 举个例子:
假设一个处理器使用 LRU 策略:
- 正常数据:被频繁访问,排在 LRU 列表前面,不容易被替换。
- Transient 数据:即使刚刚访问,也可能被放在列表后面,更容易被替换。
2.3 总结
概念 | 作用 |
---|---|
Transient Hint | 提示数据是短期有用,应优先淘汰 |
Cache Allocation Policy(替换策略) | 决定具体如何淘汰缓存行(如 LRU、FIFO) |
关系 | Transient Hint 影响替换策略的优先级,但不改变策略本身 |
三,Transient 和 Non-transient的区别
在 ARMv8 架构中,短期缓存(Transient)与长期缓存(Non-transient)的主要区别并不在于它们在缓存中的物理存储位置,而在于缓存分配策略和优先级。下面是详细的对比分析:
3.1 核心区别:Transient vs Non-transient
特性 | Transient(短期缓存) | Non-transient(长期缓存) |
---|---|---|
定义 | 缓存中只需保留短时间的数据 | 缓存中保留时间较长的数据 |
用途 | 临时数据,如 DMA 缓冲、网络包等 | 频繁访问或长期使用的数据 |
缓存分配策略 | 限制分配,避免驱逐长期数据 | 正常分配,优先保留 |
是否影响物理位置 | ❌ 不影响缓存层级或物理位置 | ❌ 同样不影响位置 |
是否影响行为 | ✅ 可能影响缓存替换策略 | ✅ 正常缓存行为 |
配置方式 | 通过 MAIR 寄存器设置 Transient Hint | 通过 MAIR 设置为 Non-transient |
支持情况 | IMPLEMENTATION DEFINED(实现定义) | 架构标准支持 |
3.2 存储位置说明
ARMv8 架构支持多级缓存(如 L1、L2、L3),Transient 和 Non-transient 数据都可以存储在这些缓存层级中。区别在于:
- Transient 数据可能被分配到缓存中较不稳定的位置,更容易被替换。
- Non-transient 数据则可能享有更高的保留优先级,在缓存替换算法中更不容易被驱逐。
✅ 重要提示:ARM 架构并不规定 Transient 数据必须存储在某个特定的缓存层级或区域,具体行为由处理器实现决定。
3.3 MAIR 配置示例
在 MAIR 寄存器中,使用 Attr<n>[7:4]
和 Attr<n>[3:0]
字段来定义缓存属性:
Attr<n>[7:4] = 0000 // Device memory
Attr<n>[3:0] = 00RW // RW 表示 Read/Write Allocate
其中:
RW = 00
表示 No AllocateRW = 01
表示 Transient AllocateRW = 10
或11
表示 Non-transient Allocate
例如:
01RW
→ Inner Write-Back Transient11RW
→ Inner Write-Back Non-transient
3.4 实际影响
- 在支持 Transient Hint 的实现中,缓存替换算法可能优先淘汰 Transient 数据。
- 在不支持的实现中,Transient 和 Non-transient 可能被视为等效,不影响行为。
3.5 总结
- Transient 与 Non-transient 的区别在于缓存策略,而非物理位置。
- 使用 Transient Hint 可以优化缓存使用,减少污染,但需处理器支持。
- 配置通过 MAIR 寄存器完成,适用于读写访问。
四,SMMUv2 Transient Hint 的定义与本质
在 SMMUv2 规范中,**Transient Hint(瞬时分配提示)**是一种缓存分配属性,属于“Cache Allocation Hint”的一部分。它用于指示某个内存访问的数据在缓存中只需保留较短时间,属于“短期有用”数据。
- 作用:告诉 SMMU 及下游缓存系统,这类数据可以被缓存,但应优先被替换,避免驱逐长期有用的数据。
- 本质:Transient Hint 不是一种独立的缓存类型,而是对“Read-Allocate”“Write-Allocate”等分配策略的修饰。
1. SMMUv2 中 Transient Hint 的配置与传递
a) 属性来源与传递路径
- Transient Hint 可以由上游设备(如 DMA、外设)发起,作为事务属性传递给 SMMU。
- SMMU 可以通过 SMMU_S2CRn(Stream-to-Context Register)、SMMU_CBn_SCTLR(Context Bank System Control Register)、**SMMU_CBn_MAIRm(Memory Attribute Indirection Register)**等寄存器配置和传递该属性。
- 在 SMMU 进行地址转换和属性变换时,Transient Hint 作为内存属性的一部分被组合、传递到下游总线和缓存系统。
b) 相关寄存器字段
- SMMU_S2CRn.TRANSIENTCFG:直接控制流到上下文映射时的 Transient Hint。
- SMMU_CBn_SCTLR.TRANSIENTCFG:当 context bank MMU 行为关闭(M=0)时,控制该 context bank 的 Transient Hint。
- SMMU_S2CRn/MTCFG、SMMU_CBn_SCTLR/MTCFG:决定是否使用 MemAttr 字段覆盖默认属性。
- MAIR 寄存器:在内存页表描述符中,MAIR 字段的高低位分别控制 Outer/Inner cache 的 Transient/Non-transient 属性。
c) TRANSIENTCFG 配置值说明
0b00
:默认 transient 分配属性0b10
:Non-transient(长期缓存)0b11
:Transient(短期缓存)
2. 与 Allocation Policy 的关系
- Transient Hint 是对缓存分配策略(如 Read-Allocate、Write-Allocate)的修饰,影响缓存替换优先级。
- Allocation Policy 决定数据是否分配到缓存,Transient 决定分配后是否优先淘汰。
- SMMU 通过寄存器配置,将 Transient Hint 传递到下游缓存系统,具体行为由硬件实现决定。
3. 总结
- Transient Hint 在 SMMUv2 中用于优化短期数据的缓存行为,减少缓存污染,提升系统整体性能。
- 其配置和作用路径贯穿 Stream-to-Context Register、Context Bank System Control Register、MAIR 等寄存器。
- 是否支持、如何实现完全由芯片厂商决定,需查阅具体实现文档。
五, TRANSIENTCFG =0b00 Use the default transient allocation attributes. 到底是 transient 还是 non-transient?
在 SMMU 的相关寄存器(如 SMMU_S2CRn.TRANSIENTCFG、SMMU_CBn_SCTLR.TRANSIENTCFG)中,字段说明如下:
0b00
—— Use the default transient allocation attributes.0b10
—— Non-transient.0b11
—— Transient.
0b00 表示不强制指定 transient 或 non-transient,而是使用默认的 transient allocation 属性。 这个“默认”属性来源于上游设备发起的事务属性,或者是SMMU 的实现默认行为。 如果上游没有指定,或者 SMMU 没有特殊实现,通常会被当作 non-transient 处理(即长期缓存),但这不是架构强制要求,而是实现相关(IMPLEMENTATION DEFINED)。
- 0b00 并不等价于“transient”或“non-transient”,而是“跟随默认”。
- 如果你需要明确指定为 transient 或 non-transient,应该用 0b11 或 0b10。
- 如果你用 0b00,实际效果取决于 SMMU 实现和上游设备的属性,通常会被当作 non-transient,但不能绝对保证。
六, SMMU_S2CR、SMMU_CBn_SCTLR和SMMU_SCR0三个寄存器TRANSIENTCFG的作用范围
6.1 SMMU_S2CRn.TRANSIENTCFG
- 作用范围:对每个 Stream的初始属性进行配置。
- 生效时机:当一个外设/主机发起的事务通过 StreamID 匹配到 SMMU_S2CRn 时,S2CRn.TRANSIENTCFG 决定该流的 transient 属性。
- 典型场景:针对不同外设/主机流,做差异化的 transient 策略。
6.2 SMMU_CBn_SCTLR.TRANSIENTCFG
- 作用范围:对某个 context bank的属性进行配置。
- 生效时机:当 context bank 的 MMU 功能关闭(M=0)时,SCTLR.TRANSIENTCFG 决定该 context bank 的 transient 属性。
- 典型场景:全局性地控制某个 context bank 的所有事务的 transient 行为。
6.3 SMMU_SCR0.TRANSIENTCFG
- 作用范围:对所有 bypass SMMU 的事务生效。
- 生效时机:当事务没有匹配到 Stream mapping table 或被配置为 bypass 时,SCR0.TRANSIENTCFG 决定这些事务的 transient 属性。
- 典型场景:系统级默认属性,适用于未被细粒度配置的流。
6.4 优先级顺序(从高到低)
- SMMU_S2CRn.TRANSIENTCFG
- 如果流(Stream)被 S2CRn 匹配并配置了 transient 属性,则以此为准。
- SMMU_CBn_SCTLR.TRANSIENTCFG
- 如果 context bank 的 MMU 关闭(M=0),则以 SCTLR.TRANSIENTCFG 为准。
- SMMU_SCR0.TRANSIENTCFG
- 仅对 bypass SMMU 的事务生效(即没有经过 Stream mapping 或被配置为 bypass)。
6.5 实际生效流程
- 大多数情况下,S2CRn 是最常用、最细粒度的配置入口。
- 只有在 bypass 或 context bank MMU 关闭时,才会用到 SCTLR 或 SCR0 的配置。
- 如果都没有配置或不支持该字段,则由实现决定(IMPLEMENTATION DEFINED),通常为 non-transient。
七 SMMU_S2CRn.TRANSIENTCFG、SMMU_CBn_SCTLR.TRANSIENTCFG、SMMU_SCR0.TRANSIENTCFG 和 MAIR 寄存器中的 transient 配置 之间的关系
A. SMMU 各级寄存器的 TRANSIENTCFG
- 这些字段(S2CRn、CBn_SCTLR、SCR0)属于SMMU 的“流属性/上下文属性”配置,用于决定SMMU 处理该事务时的 transient hint。
- 作用范围:
- S2CRn.TRANSIENTCFG:针对每个 Stream(流/外设/主机)配置。
- CBn_SCTLR.TRANSIENTCFG:针对 context bank,通常在 MMU 关闭时生效。
- SCR0.TRANSIENTCFG:针对 bypass SMMU 的事务(全局默认)。
B. MAIR(Memory Attribute Indirection Register)中的 transient 配置
- MAIR 是 ARM 架构下页表描述符/内存类型属性的配置,决定了内存页的 cache policy,包括是否为 transient。
- 作用范围:
- 通过页表描述符的 AttrIndex 字段索引 MAIR,MAIR 的高低位分别控制 Outer/Inner cache 的 transient/non-transient、write-back、write-through 等属性。
- 影响的是最终内存页的缓存行为,而不仅仅是 SMMU 的流属性。
两者的关系与优先级
关系梳理
- SMMU 的 TRANSIENTCFG 字段决定了SMMU 处理该事务时,向下游(如内存系统、cache、总线)传递的 transient hint。
- MAIR 的 transient 配置决定了最终物理内存页的缓存属性,即使 SMMU 传递了 transient hint,最终是否生效还要看 MAIR 的配置。
优先级与覆盖关系
- 最终生效的 transient 属性 = SMMU 配置(流/上下文/全局) × 页表/MAIR 配置
- SMMU 只负责传递 hint,MAIR 决定物理内存页的实际缓存策略。
- 如果 SMMU 配置为 transient,但 MAIR/页表描述符对应的内存类型不支持 transient,最终不会以 transient 方式缓存。
- 反之,MAIR 配置为 transient,但 SMMU 没有传递 transient hint,可能也不会被 cache controller 识别为 transient。
3. 实际工程举例
-
DMA 外设流配置:
- S2CRn.TRANSIENTCFG = 0b11(transient)
- 页表描述符 AttrIndex 指向 MAIR 的某一项,该项配置为 Write-Back Transient
- 这样,SMMU 传递 transient hint,cache controller 结合 MAIR,最终以 transient 策略缓存该页。
-
普通内存流配置:
- S2CRn.TRANSIENTCFG = 0b10(non-transient)
- MAIR 配置为 Write-Back Non-transient
- 这样,数据会以长期缓存策略处理。
5. 总结建议
- SMMU 的 TRANSIENTCFG 是“流级/上下文级/全局级”的 hint,MAIR 是“页级/物理内存级”的属性。
- 两者需配合使用,才能实现端到端的 transient 缓存优化。
- 实际工程建议:DMA/短期数据流建议 S2CRn 配 transient,页表/MAIR 也配 transient,才能确保效果。
八, TRANSIENTCFG、WACFG、RACFG之间的关系和区别:
1. 字段含义与作用
TRANSIENTCFG
- 作用:指定该流/上下文/旁路事务的数据在缓存中是“短期有用”(transient)还是“长期有用”(non-transient)。
- 典型值:
0b00
:使用默认 transient 属性0b10
:non-transient(长期缓存)0b11
:transient(短期缓存)
WACFG(Write-Allocate Configuration)
- 作用:指定写操作是否会触发缓存分配(write-allocate)。
- 典型值:
0b00
:默认0b10
:Write-Allocate(写时分配缓存)0b11
:No Write-Allocate(写时不分配缓存)
RACFG(Read-Allocate Configuration)
- 作用:指定读操作是否会触发缓存分配(read-allocate)。
- 典型值:
0b00
:默认0b10
:Read-Allocate(读时分配缓存)0b11
:No Read-Allocate(读时不分配缓存)
2. 三者的关系
- WACFG/RACFG 决定了是否分配缓存(即数据是否会被带入cache),分别针对写和读操作。
- TRANSIENTCFG 决定了如果分配缓存,属于短期还是长期缓存(即分配后在cache中的优先级/淘汰策略)。
- 三者共同决定了数据的缓存分配和生命周期:
- 只有 WACFG/RACFG 允许分配缓存时,TRANSIENTCFG 才有实际意义。
- 如果 WACFG/RACFG 配置为 No Allocate,则无论 TRANSIENTCFG 配置如何,数据都不会被缓存。
- 如果允许分配缓存(WACFG/RACFG=Allocate),TRANSIENTCFG 决定分配到 cache 后是 transient 还是 non-transient。
3. 实际工程配置举例
-
DMA 临时数据流:
- RACFG = 0b10(Read-Allocate),WACFG = 0b10(Write-Allocate),TRANSIENTCFG = 0b11(transient)
- 结果:读写都分配缓存,且缓存为短期缓存,易被替换。
-
普通内存流:
- RACFG = 0b10,WACFG = 0b10,TRANSIENTCFG = 0b10(non-transient)
- 结果:读写都分配缓存,且缓存为长期缓存,优先保留。
-
只读不缓存:
- RACFG = 0b11(No Read-Allocate),TRANSIENTCFG 任意
- 结果:读操作不会分配缓存,TRANSIENTCFG 配置无实际意义。
4. 与 MAIR 的关系
- 上述三个字段属于 SMMU 的“流/上下文/旁路”属性配置,决定 SMMU 传递给下游 cache controller 的 hint。
- MAIR(Memory Attribute Indirection Register)属于页表/内存属性配置,决定物理内存页的 cache policy。
- 最终缓存行为 = SMMU 配置 × MAIR 配置,两者需配合使用。
如果上游设备发起的 transaction 的 Allocation 属性为 NONE(即不分配缓存),SMMU 的 TRANSIENTCFG 还会起作用吗?
1. Allocation 为 NONE 时,TRANSIENTCFG 不起作用
- 原理:
- Allocation 属性(由上游设备、SMMU_S2CRn.RACFG/WACFG、页表/MAIR 等共同决定)控制是否允许该事务分配缓存。
- 如果 Allocation=NONE(即 Read-Allocate/Write-Allocate 都为 No Allocate),数据不会被带入 cache,也就没有“transient”还是“non-transient”之分。
- TRANSIENTCFG 只有在允许分配缓存(Allocate)时才有意义,它决定分配到 cache 后是短期还是长期缓存。
2. 典型场景举例
-
DMA 传输,要求数据不缓存:
- 上游设备发起 transaction,属性为 Non-cacheable 或 No Allocate。
- SMMU 无论 TRANSIENTCFG 配置为何,数据都不会进 cache。
-
普通内存流,允许缓存:
- 上游设备发起 transaction,属性为 Cacheable 且允许 Allocate。
- SMMU 的 TRANSIENTCFG 决定数据进 cache 后是 transient 还是 non-transient。
3. 总结表格
Allocation 配置 | TRANSIENTCFG 是否生效 | 结果 |
---|---|---|
No Allocate | 无论如何都不生效 | 数据不会进 cache |
Allocate | 生效 | 决定是短期还是长期缓存 |
SMMUv2 内存属性覆盖决策流程
情况1. Client port bypass(CLIENTPD)
- 如果 CLIENTPD=1(全局旁路),直接用 SMMU_sCR0 的配置覆盖 incoming 属性,返回。
情况2. StreamID 匹配
- 如果唯一匹配(unique),继续后续流程。
- 如果多重匹配(multi_match):
- 若 SMMU_sCR0.SMCFCFG=1,返回 FAULT(流冲突错误)。
- 否则用 SMMU_sCR0 覆盖属性,返回。
- 如果无匹配(no_match):
- 若 SMMU_sCR0.USFCFG=1,返回 FAULT(未识别流错误)。
- 否则用 SMMU_sCR0 覆盖属性,返回。
情况3. S2CR.TYPE 决策
- 如果 S2CR.TYPE 为 reserved 或 fault,返回 FAULT。
- 如果 S2CR.TYPE 为 bypass,用 S2CR 配置覆盖属性,返回。
- 如果 S2CR.TYPE 为 translation,进入属性合成流程。
情况4. 上下文有效性检查
- 如果 context bank 配置无效,返回 FAULT。
情况5. 属性合成(Combine)
- 先用 S2CR、Stage1Attributes 依次覆盖 incoming 属性(Override)。
- 然后与 Stage2 Attributes 合成(Combine):
- 对于 shareability、memory type 等字段,选择“更强”的那个。
- 对于 allocate/transient 字段,优先用 stage2 的配置(如果不是“no-transform”)。
情况6. 特殊归一化处理
- 如果最终属性为 device 或 inner/outer non-cacheable,则所有 allocate/transient 都强制为 no_allocate,shareability 强制为 outer_shared。
- 如果 inner/outer 不是 cacheable,也强制 allocate/transient 为 no_allocate。
工程实践建议
- 流表(S2CR)是最常用的属性控制入口,建议所有外设/主机流都明确配置。
- Stage1/Stage2Attributes 主要由 context bank 的 SCTLR、MAIR、页表等决定,适合做全局/分区级别的属性控制。
- 最终属性是多级融合和优先级覆盖的结果,建议在关键流和页表都做明确配置,避免依赖默认值。
九,在 stage2 bypass(即“stage 1 with stage 2 bypass”)场景下的属性融合:
1. stage2 bypass 场景下的属性融合路径
- stage2 bypass 意味着:
- 事务只经过 stage 1 context bank,stage 2 不做地址转换,但可以通过 CBAR(Context Bank Attribute Register)增强属性(如 WACFG、RACFG、MemAttr 等)。
- CBAR 没有 TRANSIENTCFG 字段,只能增强 allocate、shareability 等属性,不能增强 transient hint。
2. Combine_allocate 的实际行为
-
WACFG/RACFG 字段:
- 如果 CBAR 配置了明确的 WACFG/RACFG(即不是 0b00),则直接采用 CBAR 的配置,忽略前面(如 S2CR/页表)的设置。
- 如果 CBAR 配置为 0b00(no-transform),则采用前面(如 S2CR/页表)的配置。
-
TRANSIENTCFG 字段:
- 由于 CBAR 没有 TRANSIENTCFG 字段,stage2 bypass 下 transient hint 只能由 S2CR(流表)或更前面的属性决定,CBAR 不会覆盖 transient。
- 也就是说,Combine_allocate 对 transient 字段在 stage2 bypass 下没有实际作用,只对 allocate 字段有作用。
3. 工程实践总结
- stage2 bypass 下,CBAR 只能增强/覆盖 allocate(WACFG/RACFG)、shareability、MemAttr 等属性,不能增强 transient。
- Combine_allocate 只对 WACFG/RACFG 字段生效,优先采用 CBAR 的配置。
- transient hint 仍然由 S2CR(流表)或更前面的属性决定。