我有一个我在内核中分配的硬件缓冲区。该缓冲区从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
我似乎无法看到得到相同的信息(我猜可能都是一样的。)
答案 0 :(得分:0)
使用O_SYNC打开/ dev / mem以进行未缓存的访问。我很难为此找到权威来源。