首页 > 解决方案 > 将内存块标记为易失性是否意味着始终绕过缓存?

问题描述

以下问题是围绕 Xilinx Zynq SoC 提出的,但我认为这个问题比这更笼统。这也有点不明确,所以请耐心等待,因为我学到了足够的知识来提出正确的问题。

我有一种情况,我有一个 FPGA 生成的数据,它是 DMAd 到系统内存中(使用分散收集到非连续块中)。DMA 完成后,软件会扩充数据(在块周围放置一些网络标头信息),然后将这些块写入网络套接字(通过内存副本,但如果我能解决问题,可能会使用 mmap司机适当)。

可以使用 ARM 的加速器一致性端口强制 DMA 实现高速缓存一致性,但这有可能与 CPU 资源竞争。在大多数情况下,我不需要缓存一致的数据,因此我可以使用非缓存一致的总线,但要使其工作,CPU 需要知道任何引用感兴趣的内存区域的缓存行都是无效的.

然后我的问题大致围绕我是否可以让编译器完成“艰苦”的工作:如果我将用作 DMA 目标的内存标记为易失性,这是否总是会导致后备内存被读取或写入绕过缓存的CPU?这通常如何在汇编程序级别实现?

对我来说,这种策略是否会与后续的内存副本完全交互并不明显。我认为问题在于我不完全理解将内存标记为易失性实际上在幕后做了什么,或者等效地,不完全理解如何正确管理来自用户空间程序的缓存。

我很欣赏绕过缓存可能无法达到我的预期,但我希望能够进行必要的调查以了解我可以在哪里进行有用的优化。

作为参考,架构是 ARMv7-A,实现将是 Rust,尽管我很高兴能就 C volatiles/semantics 的行为进行讨论。

标签: ccachingrustvolatilearmv7

解决方案


推荐阅读