如何防止MMAP缓存值?

Sea*_*den 15 c linux operating-system mmap linux-device-driver

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

当我尝试在属性之上进行MMAP以直接访问该位内存(来自userland程序)时,问题就出现了.读取成功并返回预期值,但是当我写入该内存时,它似乎缓存在内核和内存之间的某处,而不是传递给GM​​CH根复合体(因此也就是设备).我想做的是每次访问后都有一个隐含的写内存屏障.

  • 有没有办法阻止内核缓存写入mmap-ed位的内存?

跟进:

  • 每次访问"接受"的方式后调用msync()来执行此操作?

Sea*_*den 25

继续用我的解决方案回答这个问题.

在我的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;
Run Code Online (Sandbox Code Playgroud)

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

两者的结合最终成功了.

  • +1 也为我工作。感谢您在找到解决方案后花时间在此处发布解决方案。:-) (2认同)