【发布时间】: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 分配的缓冲区。
【问题讨论】: