如何防止MMAP缓存值?

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

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

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

跟进:

>每次访问“接受”方式后调用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标志.

两者的结合最终成功了.

上一篇:使用cudaHostRegister映射的Linux字符设备内存注册结果无效


下一篇:mmap 映射的内存访问出错