1

我遇到了一些我认为与 DMA 和 CPU 之间的一致性有关的问题。这是简化的用例。

  1. Cortex A5 CPU 在非安全状态下写入非安全内存。MMU开启,内存属性正常,可共享,可缓存。因此,根据以下参考资料,数据可能在所谓的非安全缓存中:

    [1] DDI0434B_cortex_a5_mpcore_r0p1_trm中的“数据缓存标签数据格式”

    [2] 安全模式下来自 artless noise 的回答可以如何访问安全/非安全内存?

    [3] http://atmel.force.com/support/servlet/fileField?id=0BEG000000002Ur中的第 6 页

  2. DMA 向该内存区域发出安全一致的读取。DMA 连接到 ACP。

  3. SCU 只会尝试检查标记为安全的缓存。所以数据是根据 DDI0434B_cortex_a5_mpcore_r0p1_trm 中的“ACP requests”从主存返回的。

  4. DMA 可能会得到陈旧的数据。


如果我的描述是正确的,这是我的第二个问题。哪个动作可以解决这个问题?

1) 在 DMA 读取之前显式清理缓存

2)将内存的属性改为普通、可共享和不可缓存。

TRM 还表示,在“总线接口单元和 SCU 接口”中的 SCU 接口上写出之前,有一个写入缓冲区用于保存来自缓存驱逐或不可缓存写入突发的数据。但是,找不到有关写入缓冲区的更多信息。我可以假设写缓冲区有一些魔力来确保一致性吗?如果有人能解释魔法,我将不胜感激。


考虑到更多的组合,我自己得到了这张桌子。

 CPU state |   Memory   | DMA access | Result    
-----------+------------+------------+-----------+    
non-secure | non-secure | non-secure | OK            
non-secure | non-secure |   secure   | NG    
non-secure |   secure   |     -      | NA    
secure     | non-secure | non-secure | OK    
secure     | non-secure |   secure   | NG (Same reason as the second case)
secure     |   secure   | non-secure | NA    
secure     |   secure   |   secure   | OK

第一列显示 CPU 在哪个状态下写入内存。

第二列显示内存是否安全。这里的“安全”意味着如果 AxPROT[1] 为高电平,AXI 将拒绝访问。内存属性是正常的、可共享的和可缓存的。

第三列显示了访问 DMA 问题的种类。访问是连贯的。

第四列告诉我们会发生什么。

NG 意味着 DMA 可能会获得陈旧的数据。

NA 表示无法访问。

OK 表示 DMA 与 CPU 一致。

对吗?


我根据 Notlikethat 的回答添加了这部分。这在实践中可能是一场噩梦。但是我想知道理论上会发生什么。

  1. 假设物理地址 0x10 映射到两个虚拟地址 NS:0x110 和 S:0x210。
  2. 安全状态下的 CPU 将值 0x110 写入 NS:0x110,然后将值 0x210 写入 S:0x210。
    所以两者可能同时在 L1 缓存中,对吧?
  3. 然后 DMA1 对 PA 0x10 进行安全读取,可能会得到 0x210。DMA2 对 PA 0x10 进行非安全读取,可能会得到 0x110。
  4. 之后,无法预测最终哪个会在主存储器中。

请确认或更正我的理解。非常感谢。

4

1 回答 1

1

从架构上讲,您不能“对非安全内存进行安全访问”。安全和非安全物理地址空间是独立的(许多支持 TrustZone 的系统都有出现在不同地址的东西,以确保安全访问和非安全访问)。但在实践中,许多外围设备(包括内存控制器)不支持 TrustZone,因此在大多数系统上都位于 TZASC 之后,此时安全和非安全地址空间在很大程度上重叠。

在 CPU 上,安全软件通过设置 NS 位的页表条目或设置 SCR.NS 从监控模式访问非安全内存;在这两种情况下,产生的总线访问都设置了 AxPROT[1],即它是非安全访问。如果您希望外围设备正确访问非安全内存,您需要让它以类似的方式发出非安全访问。

否则,您所遇到的是更普遍的物理别名问题,除非绝对必要,否则通常不推荐使用这种情况 - 更传统的示例是具有相当高物理地址(例如 0x80000000,甚至 LPAE 上的 32 位以上)的 DRAM 系统-capable 系统),其中的一部分在 MMU 设置之前使用别名较低(例如,在 0x0 用于引导向量)。即使是物理标记的缓存也不知道 0x0 和 0x80000000 实际上最终在互连的另一端的同一位置,因此如果您同时使用两者,您确实会遇到超出范围的一致性噩梦架构,并且只能通过显式缓存维护来管理。

以同样的方式,包含安全状态作为物理地址标签一部分的 TrustZone 感知缓存不知道 S:0x80000000 和 NS:0x80000000 实际上可能最终在您的特定系统上的同一位置(通常,他们很可能不会),所以同样,除非手动管理,否则这两个地址是不连贯的 - 写入一个别名的数据必须在它可见之前从缓存清除到 TZASC 之外的点(即通常一直到 DRAM)从另一个。请注意,如果您的 Cortex-A5 系统具有像 PL310 这样的外部 L2 缓存,这意味着通过 VA 将 CPU 缓存清理到 PoC,然后由 PA 通过安全/非安全访问适当地清理 L2,这可能都必须是由安全世界单独完成,以避免同步问题。理论上,让所有内容都进行不可缓存的访问可以通过强制所有数据通过 DRAM 进行往返来解决一致性问题,尽管某些外部缓存配置仍然会阻碍这一点并非不可能。让 DMA 控制器在适当的地方直接发出非安全访问要好得多,因此您实际上可以从缓存中受益而不是与它们对抗。

于 2016-12-02T11:19:49.200 回答