当前位置: 首页 > web >正文

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),用于指示某个内存区域的数据在缓存中只需要保留较短时间。这种提示可以帮助系统优化缓存使用,减少缓存污染。


📌 关键点总结:

  1. 用途

    • 用于标记那些只会被短期使用的数据。
    • 适用于读写访问,提示缓存系统不要长期保留这些数据。
  2. 实现方式

    • 在支持该功能的实现中,Transient hint 是通过设置 MAIR(Memory Attribute Indirection Register)中的特定位来实现的。
    • 可以分别为 Inner CacheableOuter Cacheable 区域设置 Transient 属性。
  3. 影响

    • 系统可能会限制这些瞬时条目的缓存分配,以避免驱逐其他更重要的缓存条目。
    • 减少缓存污染:避免短期数据挤占长期有用数据的缓存空间。Implementations can use the cache allocation hints to limit cache pollution to a part of a cache, such as to a subset of ways.
    • 有助于提升缓存效率,尤其在处理大量临时数据时。
  4. 与其他缓存提示的关系

    • Transient hint 是对 Read-AllocateWrite-Allocate 的进一步限定。
    • 例如:可以设置为 Transient Read-AllocateTransient Write-Allocate
  5. 架构支持情况

    • 是否支持 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 Allocate
  • RW = 01 表示 Transient Allocate
  • RW = 1011 表示 Non-transient Allocate

例如:

  • 01RW → Inner Write-Back Transient
  • 11RW → 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/MTCFGSMMU_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 优先级顺序(从高到低)

  1. SMMU_S2CRn.TRANSIENTCFG
    • 如果流(Stream)被 S2CRn 匹配并配置了 transient 属性,则以此为准。
  2. SMMU_CBn_SCTLR.TRANSIENTCFG
    • 如果 context bank 的 MMU 关闭(M=0),则以 SCTLR.TRANSIENTCFG 为准。
  3. 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.TRANSIENTCFGMAIR 寄存器中的 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(流表)或更前面的属性决定。
http://www.xdnf.cn/news/18299.html

相关文章:

  • EasyExcel篇
  • OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?
  • 【CV 目标检测】Fast RCNN模型③——模型训练/预测
  • c++最长上升子序列长度
  • 8.18网络编程——基于UDP的TFTP文件传输客户端
  • 力扣32:最长有效括号
  • 如何解决机器翻译的“幻觉“问题(Hallucination)?
  • 博客项目 Spring + Redis + Mysql
  • 深度研究系统、方法与应用的综述
  • android 实现表格效果
  • 接口文档——前后端分离开发模式下的“契约书“
  • Java原子类详解
  • MySQL的多版本并发控制(MVCC):
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (4)
  • LeetCode 每日一题 2025/8/11-2025/8/17
  • Windows 安装使用 MySQL
  • C++架构设计原则
  • 监督学习(Supervised Learning)和 无监督学习(Unsupervised Learning)详解
  • MySQL新手教学
  • 之前说的要写的TCP高性能服务器,今天来了
  • Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成
  • 用 Python 实现一个“小型 ReAct 智能体”:思维链 + 工具调用 + 环境交互
  • 如何使用 React 101 的 Highcharts 包装器
  • Pomian语言处理器 研发笔记(一):使用C++的正则表达式构建词法分析器
  • 视频讲解:CatBoost、梯度提升 (XGBoost、LightGBM)对心理健康数据、交通流量及股票价格预测研究
  • 从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
  • 8.18 表达式树|浮点数绝对值
  • 基于Flink CDC实现联系人与标签数据实时同步至ES的实践
  • Ps 2025 图像编辑 Photoshop(Mac中文)
  • 【避坑指南】初始化与更新共享数据赋值的一致性问题