我正在阅读以下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_create
和kmem_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);
我很高兴听到一些解释。
答案 0 :(得分:2)
对于GFP_ * for DMA
在x86上:
ISA - 由于以下原因,使用kmalloc()
时需要按位或GFP_DMA
与GFP_KERNEL
(或_ATOMIC
):
GFP_DMA
保证:
(1)当get_free_page
返回多页并且
(2)仅返回低于MAX_DMA_ADDRESS
的地址。由于ISA约束,MAX_DMA_ADDRESS
在PC上是16MB
PCI - 不需要使用GFP_DMA
,因为没有MAX_DMA_ADDRESS
限制
设备在致电dma_mask
或dma_map_*
时会检查dma_alloc_coherent
。
dma_alloc_coherent
确保dma_map_*
能够使用分配的内存,这也可以提供其他好处。 (实现可以选择忽略影响返回内存位置的标志,如GFP_DMA)
您可以参考http://coweb.cc.gatech.edu/sysHackfest/uploads/58/DMA_howto.1.txt