【发布时间】:2020-01-22 00:29:01
【问题描述】:
我使用dma_alloc_coherent 分配了多个内核可访问缓冲区,每个缓冲区大小为 4MiB。目标是将这些缓冲区映射到连续的用户空间虚拟内存中。问题是remap_pfn_range 似乎没有工作,因为用户空间内存有时工作,有时不工作,或者有时会复制缓冲区的页面映射。
// in probe() function
dma_alloc_coherent(&pcie->dev, BUF_SIZE, &bus_addr0, GFP_KERNEL);
dma_alloc_coherent(&pcie->dev, BUF_SIZE, &bus_addr1, GFP_KERNEL);
// ...
// in mmap() function
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
pfn = dma_to_phys(&pcie->dev, &bus_addr0) >> PAGE_SHIFT;
remap_pfn_range(pfn, vma->vm_start + 0, pfn, BUF_SIZE, vma->vm_page_prot);
pfn = dma_to_phys(&pcie->dev, &bus_addr1) >> PAGE_SHIFT;
remap_pfn_range(pfn, vma->vm_start + BUF_SIZE, pfn, BUF_SIZE, vma->vm_page_prot);
我不确定将多个内核缓冲区映射到连续的用户空间内存的最佳方法,但我感觉我做错了。提前致谢。
【问题讨论】:
-
你能显示你的驱动程序的完整 mmap() 文件操作吗? DMA 也可能很棘手,您是否先尝试过简单的 kmalloc() + virt_to_phys()?
标签: linux linux-kernel linux-device-driver