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

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

  • 是否有任何方法可以防止内核将对高速缓存写入内存的写操作进行缓存?

  • 跟进:
  • 每次访问后都以“可接受的”方式调用msync()吗?
  • 最佳答案

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

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

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

    10-05 22:29
    查看更多