【问题标题】:Caching and volatile memory when mmap /dev/memmmap /dev/mem 时的缓存和易失性内存
【发布时间】:2017-05-26 12:45:33
【问题描述】:

我有一个在内核中分配的硬件缓冲区。该缓冲区接收来自 PCIe 总线的 DMA 数据。然后我从用户空间使用mmap /dev/mem 将硬件缓冲区映射到我的虚拟地址空间。我的问题如下:

1) mmap 如何处理缓存?

a) 从阅读mmap 中了解到,当从用户空间写入映射区域时,我可能需要调用 msync 将缓存版本的内存刷新到“文件”中。由于/dev/mem 的实现方式与mmaped 文件不同,我还需要msync 我的写入吗?

b) 由于我正在映射的内存是volatile 内存(DMA 硬件写入它),我如何保持从该内存读取的同步?如果物理内存中的硬件发生了变化,那么我已经从用户空间将更改写入了我的缓存,然后我msync 我的更改以刷新我的写入,物理内存更改是否由于我在刷新时过度写入而丢失?

c) 当mmaping /dev/mem 我应该将返回的指向虚拟内存的指针声明为volatile

我看到很多关于 mmap 缓存的文档,因为它与 mmaping 文件系统文件(不是易失性内存)有关,但是当涉及到 mmaping /dev/mem 时,我似乎无法获得相同的信息(它可以全部我猜是一样的)。

【问题讨论】:

    标签: linux caching memory linux-kernel mmap


    【解决方案1】:

    使用 O_SYNC 打开 /dev/mem 以进行非缓存访问。我很难找到权威来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多