如何防止MMAPcaching值?

我写了一个linux驱动程序,ioremaps将特定设备的PCI BAR0导出到一个sysfs二进制属性,允许用户空间直接控制它。

当我尝试在属性顶部的MMAP直接访问该内存位(来自用户态程序)时,问题就随之而来。 读取成功就好,并返回期望值,但是当我写入该内存时,它似乎被caching在内核和内存之间的某处,而不是传递到GMCH根联合体(因此也就是设备)。 我想要做的是每个访问后有一个隐式的写内存障碍。

  • 有什么办法可以防止内核caching写入内存的mmap-ed位?

跟进ups:

  • 每次访问后调用msync()是“接受”的方式来做到这一点?

Solutions Collecting From Web of "如何防止MMAPcaching值?"

打算继续,用我的解决方案自己回答这个问题。

在我的sysfs mmap函数的内核驱动程序中,/include/asm/pgtable.h中有一个宏,它为nocache'd pfn remap设置了正确的标志。 它看起来像这样:

 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; 

另外,在userland mmap中,我在mmap flags参数中使用了MAP_SHARED标志。

两者的结合最终取得了诀窍。

可能ioremap_nocache()帮助?