我有一个PCI设备,它的Linux驱动程序和一个用户空间应用程序。应用程序mmap是通过驱动程序的PCI设备的第一个BAR。所有访问都是通过32位整数完成的,这很重要,因为读/写寄存器可能会产生副作用(开始操作等)。
在x86平台上,这非常有效。但是,我刚刚搬到ARM平台,我有一个奇怪的行为:
我认为问题在于mmap想要预取一些数据并发出这64字节的读取。 我错过了一个可以禁用某种mmap预取的标志或其他东西吗?
我在驱动程序端的当前mmap实现只是
vma->vm_flags |= VM_RESERVED;
remap_pfn_range(vma,vma->vm_start, pfn, Size_UL, vma->vm_page_prot)
答案 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;
实际上并不确定是否需要所有标志,但是,嘿,它有效!