一尘不染

如何防止MMAP缓存值?

linux

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

当我尝试在属性顶部使用MMAP来直接访问该位内存(从Userland程序)时,问题就浮现了。读取可以很好地完成并返回期望值,尽管当我写入该内存时,它似乎被缓存在内核和内存之间的某个地方,而不是传递给GM​​CH根联合体(以及设备)。我想做的是每次访问后都有一个隐式的写存储屏障。

  • 有什么方法可以防止内核将写缓存缓存到内存的mmap-ed位?

跟进:

  • 每次访问后调用msync()是“接受”的方式吗?

阅读 400

收藏
2020-06-07

共1个答案

一尘不染

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

在我的sysfs mmap函数的内核驱动程序中,/include/asm/pgtable.h中有一个宏,用于为nocache’d
pfn重映射设置适当的标志。看起来像这样:

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标志参数中使用了MAP_SHARED标志。

两者的结合最终达到了目的。

2020-06-07