2012-07-09 103 views
16
  1. 这个调用返回的DMA地址是否与物理地址相同? LDD3表示DMA地址应该被驱动程序视为不透明。我想要映射这个DMA缓冲区,以便用户空间可以直接读取/写入它。问题是我应该为remap_pfn_range指定什么PFN(现在我的惊喜(内核3.4+)对传统内存和I/O内存相同)。我可以将DMA地址转换为无符号长整型并将其转换为PFN吗?这不违反LDD3关于不透明性的说法吗?关于dma_alloc_coherent的一些问题

  2. dma_alloc_coherent是否始终在内部使用__get_free_pages?这是否意味着该区域可能总是被过度分配(因为第一个函数需要字节,但第二个函数以页为单位分配)?

  3. 有没有一种方法可以为从__get_free_pages的调用获得的多个连续页面设置单个流式映射? dma_map_page仅适用于单页。

+0

您是否发现将dma内存附加到remap_pfn_range内存的正确方法? – Luca 2015-01-27 18:53:24

回答

11
  1. 没有,返回的地址是一个虚拟地址,否则你将无法从内核空间访问它。它是代表物理地址的dma_handle,但它是不透明的。您需要在返回的地址上使用virt_to_phys,然后将其传递给remap_pfn_range。

  2. 我不相信它(虽然它可能是平台依赖),但它确实分配页面。如果你想为DMA使用更少的内存,你应该使用dma_pool_create,然后从那里分配区域。

  3. 您可以使用dma_map_single而不是dma_map_page。

我建议咨询DMA-API.txt关于这些东西的更多细节。