Linux flush_cache_range() 行为

标签 linux caching linux-kernel flush

我的代码有一个用户模式映射(通过 mmap() 设置),我需要在从 CPU 写入之后但在通过 DMA 处理底层物理内存发送数据之前刷新它。此外,我还需要在数据通过 DMA 到达底层物理内存之后但在我尝试使用 CPU 从中读取数据之前使缓存无效。

在我看来,“缓存刷新”和“缓存失效”意味着两件不同的事情。粗略地说,“缓存刷新”意味着将缓存中的内容写入内存(或简单地将缓存数据写入内存),而“缓存失效”意味着随后假设所有缓存内容都已过时,因此任何从该范围读取的尝试都会引发新的读取从内存(或简单的内存数据进入缓存)。

但是在内核中我没有找到两个调用,而是只有一个:flush_cache_range()。

这是我用于这两个任务的 API,它“似乎可以工作”……至少在我尝试调试当前问题之前是这样。

这可能是因为 flush_cache_range() 的行为可能是: 1)首先将任何脏缓存条目写入内存 - 然后 2) 使所有缓存项失效

如果这就是这个 API 真正做的事情,那么我在这个角色中使用它是合理的。毕竟这就是我自己可能实现的方式。我寻求自信答案的确切问题是:

flush_cache_range() 实际上是这样工作的吗?

最佳答案

缓存是否需要失效或刷新取决于架构。

您应该始终使用 Linux DMA 功能来正确处理这些问题。 阅读DMA-API-HOWTO.txtDMA-API.txt .

关于Linux flush_cache_range() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28246138/

相关文章:

c++ - 为所有 Linux 发行版编译 C++

Linux NASM OUTSB 段错误

使用 DiskBasedCache 时 Android Volley ListView 图像未加载

linux - 为什么 linux 内核中的全局变量是静态的?

sockets - 如何在 Linux 内核中增加套接字内存分配

linux - 从哪里获取 iostream.h

linux - Django : Gunicorn, Nginx 和静态文件的文件权限

ruby-on-rails - 适当的Rails低级缓存并发

javascript - Node.js 如何使用 require() 处理多次包含的大数组和对象?

c++ - 如何在 Boost.Asio 中使用零拷贝 sendmsg/Receive