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

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

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

4

1 回答 1

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

  2. 我不相信它会这样做(虽然它可能取决于平台),但它确实分配了页面。如果您想要更少量的内存用于 DMA,您应该使用 dma_pool_create 然后从那里分配区域。

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

我建议您咨询DMA-API.txt以获取有关其中一些内容的更多详细信息。

于 2012-08-23T13:10:20.217 回答