此调用返回的DMA地址是否与物理地址相同? LDD3表示,驱动程序应将DMA地址视为不透明。我想映射该DMA缓冲区,以便用户空间可以直接对其进行读写。问题是我应该为remap_pfn_range指定什么PFN(令我惊讶的是,现在(内核3.4+)适用于常规内存与I / O内存相同)。我可以仅将DMA地址转换为无符号长整数并将其转换为PFN吗?这是否违反了LDD3关于不透明度的说法?dma_alloc_coherent
是否始终在内部使用__get_free_pages
?这是否意味着该区域可能总是被过度分配(因为第一个函数占用字节,但是第二个函数以页为单位进行分配)?
是否有办法为从调用__get_free_pages
获得的多个连续页面设置单个流映射? dma_map_page
仅适用于单个页面。
最佳答案
不,返回的地址是虚拟地址,否则您将无法从内核空间访问它。代表物理地址的是dma_handle,但它是不透明的。您需要在返回的地址上使用virt_to_phys,然后将其传递给remap_pfn_range。
我不相信(尽管它可能取决于平台),但它确实分配了页面。如果要为DMA分配较小的内存,则应使用dma_pool_create,然后从那里分配区域。
您可以使用dma_map_single代替dma_map_page。
我建议您咨询DMA-API.txt以获得有关这些内容的更多详细信息。