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