Linux PCI驱动程序,mmap预取

时间:2012-10-16 09:02:14

标签: linux driver mmap pci

我有一个PCI设备,它的Linux驱动程序和一个用户空间应用程序。应用程序mmap是通过驱动程序的PCI设备的第一个BAR。所有访问都是通过32位整数完成的,这很重要,因为读/写寄存器可能会产生副作用(开始操作等)。

在x86平台上,这非常有效。但是,我刚刚搬到ARM平台,我有一个奇怪的行为:

  • 来自驱动程序的读取/写入行为正确
  • 从用户空间读取触发64字节PCI读取请求,我的设备无法满足该请求,因为它只接受32位访问(+我不希望因为副作用)。

我认为问题在于mmap想要预取一些数据并发出这64字节的读取。 我错过了一个可以禁用某种mmap预取的标志或其他东西吗?

我在驱动程序端的当前mmap实现只是

vma->vm_flags |= VM_RESERVED;
remap_pfn_range(vma,vma->vm_start,  pfn, Size_UL, vma->vm_page_prot)

1 个答案:

答案 0 :(得分:3)

我找到了解决方案!

正如一位同事建议的那样,64字节是一个缓存行,这可能是一种忽略我的“不可预取”信息的缓存机制,因为它在mmap()期间丢失了(尽管在x86上保留了......) ,所以我不得不将这些标志添加到vma以防止缓存:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot) | L_PTE_PRESENT |
                         L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY;

实际上并不确定是否需要所有标志,但是,嘿,它有效!