【问题标题】:Mapping of dmam_alloc_coherent allocated memory to the user space via remap_pfn_range gives pointer to wrong area of memory通过 remap_pfn_range 将 dmam_alloc_coherent 分配的内存映射到用户空间提供指向错误内存区域的指针
【发布时间】:2019-05-28 10:34:38
【问题描述】:

我准备了一个在 ARM Intel Cyclone V SoC 上运行的应用程序。 我需要将 DMA 相干内存缓冲区映射到用户空间。 缓冲区在设备驱动程序中分配:

buf_addr = dmam_alloc_coherent(&pdev->dev, size, &dma_addr, GFP_KERNEL);

映射已正确完成,并且我已经验证,硬件通过 dma_addr 硬件地址访问的缓冲区通过 buf_addr 指针对内核可见。

然后在我做的设备驱动的mmap函数中:

unsigned long physical = virt_to_phys(buf_addr);
unsigned long vsize = vma->vm_end - vma->vm_start;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
remap_pfn_range(vma,vma->vm_start, physical >> PAGE_SHIFT , vsize, vma->vm_page_prot);

应用程序映射缓冲区:

buf = mmap(NULL,buf_size,PROT_READ | PROT_WRITE, dev_file, MAP_SHARED);

我没有从 remap_pfn_range 函数中得到任何错误。应用程序也可以访问 mmapped 内存,但 它不是使用 dmam_alloc_coherent 分配的缓冲区

【问题讨论】:

    标签: linux arm mapping dma


    【解决方案1】:

    我找到了似乎专门用于此目的的宏dma_mmap_coherent。 我已验证 mmap 函数中的以下修改可确保正常运行:

    unsigned long vsize = vma->vm_end - vma->vm_start;
    vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
    remap=dma_mmap_coherent(&my_pdev->dev,vma,fdata, dma_addr, vsize);
    

    因为 pdev 指针不直接传递给 mmap 函数,所以它是通过全局变量 my_pdev 从探测函数传递的。如果驱动程序支持多个设备,则应将其存储在设备上下文中。

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 1970-01-01
      • 2012-02-05
      • 2015-02-27
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多