我的代码有一个用户模式映射(通过 mmap() 设置),我需要在从 CPU 写入之后但在通过 DMA 处理底层物理内存发送数据之前刷新它。此外,我还需要在数据通过 DMA 到达底层物理内存之后但在我尝试使用 CPU 从中读取数据之前使缓存无效。
在我看来,“缓存刷新”和“缓存失效”意味着两件不同的事情。粗略地说,“缓存刷新”意味着将缓存中的内容写入内存(或简单地将缓存数据写入内存),而“缓存失效”意味着随后假设所有缓存内容都已过时,因此任何从该范围读取的尝试都会引发新的读取从内存(或简单的内存数据进入缓存)。
但是在内核中我没有找到两个调用,而是只有一个:flush_cache_range()。
这是我用于这两个任务的 API,它“似乎可以工作”……至少在我尝试调试当前问题之前是这样。
这可能是因为 flush_cache_range() 的行为可能是: 1)首先将任何脏缓存条目写入内存 - 然后 2) 使所有缓存项失效
如果这就是这个 API 真正做的事情,那么我在这个角色中使用它是合理的。毕竟这就是我自己可能实现的方式。我寻求自信答案的确切问题是:
flush_cache_range() 实际上是这样工作的吗?
最佳答案
缓存是否需要失效或刷新取决于架构。
您应该始终使用 Linux DMA 功能来正确处理这些问题。 阅读DMA-API-HOWTO.txt和 DMA-API.txt .
关于Linux flush_cache_range() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28246138/