关于dma_alloc_coherent的一些问题

时间:2012-07-09 01:10:08

标签: linux-kernel linux-device-driver dma

  1. 此次调用返回的DMA地址是否与物理地址相同? LDD3表示驱动程序应将DMA地址视为不透明。我想mmap这个DMA缓冲区,以便用户空间可以直接读/写它。问题是我应该为remap_pfn_range指定PFN(现在令我惊喜的是(内核3.4+)适用于传统内存,与I / O内存相同)。我可以将DMA地址转换为无符号长并将其转换为PFN吗?这不违反LDD3关于不透明的说法吗?

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

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

1 个答案:

答案 0 :(得分:12)

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

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

  3. 您可以使用dma_map_single代替dma_map_page。

  4. 我建议您咨询DMA-API.txt以获取有关此类内容的详细信息。