gpt4 book ai didi

Linux PCI 驱动程序,mmap 预取

转载 作者:太空狗 更新时间:2023-10-29 12:05:53 25 4
gpt4 key购买 nike

我有一个 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)

最佳答案

我找到了解决方案!

正如一位同事所建议的,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;

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

关于Linux PCI 驱动程序,mmap 预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com