我已经编写了一个Linux驱动程序,该驱动程序ioremaps将特定设备的PCI BAR0导出为sysfs二进制属性,允许用户空间直接控制它。
当我尝试在属性顶部使用MMAP来直接访问该位内存(从Userland程序)时,问题就浮现了。读取可以很好地完成并返回期望值,尽管当我写入该内存时,它似乎被缓存在内核和内存之间的某个地方,而不是传递给GMCH根联合体(以及设备)。我想做的是每次访问后都有一个隐式的写存储屏障。
跟进:
继续并用我的解决方案自己回答这个问题。
在我的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标志。
两者的结合最终达到了目的。