我编写了一个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 flags参数中使用了MAP_SHARED标志.
两者的结合最终成功了.