我写了一个linux驱动程序,ioremaps将特定设备的PCI BAR0导出到一个sysfs二进制属性,允许用户空间直接控制它。
当我尝试在属性顶部的MMAP直接访问该内存位(来自用户态程序)时,问题就随之而来。 读取成功就好,并返回期望值,但是当我写入该内存时,它似乎被caching在内核和内存之间的某处,而不是传递到GMCH根联合体(因此也就是设备)。 我想要做的是每个访问后有一个隐式的写内存障碍。
跟进ups:
打算继续,用我的解决方案自己回答这个问题。
在我的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()
帮助?