确保具有DMA功能的内存

时间:2015-08-11 18:58:42

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

我正在阅读以下document部分'Part Id'我不知道这个文件与内核2.6.35有多相关;特别是它说:

..the DMA address of the memory must be within the dma_mask of the device..

他们建议将某些标记(例如GFP_DMA)传递给kmalloc,以确保内存将落在所提供的DMA掩码中。

但是,如果内存是从kmem_cache_createkmem_cache_alloc(.. GFP_ATOMIC)创建的缓存池中分配的,则这不符合DMA-API.txt中列出的要求?

另一方面,LDD谈论有关传统ISA设备的__GFP_DMA标志,因此我不确定这是否适用于PCI / PCIe设备。

如果重要的话,这是x86 64位平台:

pci_set_dma_mask(dev, 0xffffffffffffffffULL);
pci_set_consistent_dma_mask(dev, 0xffffffffffffffffULL);

我很高兴听到一些解释。

1 个答案:

答案 0 :(得分:2)

  1. 对于GFP_ * for DMA

    在x86上:

    • ISA - 由于以下原因,使用kmalloc()时需要按位或GFP_DMAGFP_KERNEL(或_ATOMIC):

      GFP_DMA保证:

      (1)当get_free_page返回多页并且

      时,物理地址是连续的

      (2)仅返回低于MAX_DMA_ADDRESS的地址。由于ISA约束,MAX_DMA_ADDRESS在PC上是16MB

    • PCI - 不需要使用GFP_DMA,因为没有MAX_DMA_ADDRESS限制

  2. 设备在致电dma_maskdma_map_*时会检查dma_alloc_coherent

    dma_alloc_coherent确保dma_map_*能够使用分配的内存,这也可以提供其他好处。 (实现可以选择忽略影响返回内存位置的标志,如GFP_DMA)

  3. 您可以参考http://coweb.cc.gatech.edu/sysHackfest/uploads/58/DMA_howto.1.txt