我遇到了一些我认为与 DMA 和 CPU 之间的一致性有关的问题。这是简化的用例。
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 页
DMA 向该内存区域发出安全一致的读取。DMA 连接到 ACP。
SCU 只会尝试检查标记为安全的缓存。所以数据是根据 DDI0434B_cortex_a5_mpcore_r0p1_trm 中的“ACP requests”从主存返回的。
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 的回答添加了这部分。这在实践中可能是一场噩梦。但是我想知道理论上会发生什么。
- 假设物理地址 0x10 映射到两个虚拟地址 NS:0x110 和 S:0x210。
- 安全状态下的 CPU 将值 0x110 写入 NS:0x110,然后将值 0x210 写入 S:0x210。
所以两者可能同时在 L1 缓存中,对吧? - 然后 DMA1 对 PA 0x10 进行安全读取,可能会得到 0x210。DMA2 对 PA 0x10 进行非安全读取,可能会得到 0x110。
- 之后,无法预测最终哪个会在主存储器中。
请确认或更正我的理解。非常感谢。