【发布时间】: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