我正在阅读以下文档的“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);我很想听听关于它的一些解释。
发布于 2015-08-12 08:13:00
- ISA - when using `kmalloc()` need to bitwise-or `GFP_DMA` with `GFP_KERNEL` (or `_ATOMIC`) because of the following:GFP_DMA保证:
(1)当get_free_page返回多个页面时,物理地址是连续的
(2)只返回低于MAX_DMA_ADDRESS的地址。由于ISA的限制,MAX_DMA_ADDRESS在PC上是16 of。
- PCI -不需要使用GFP_DMA,因为没有MAX_DMA_ADDRESS限制
dma_mask在调用dma_map_*或dma_alloc_coherent时由设备进行检查。
dma_alloc_coherent确保所分配的内存能够被dma_map_*使用,这也给其他方面带来了好处。(实现可以选择忽略影响返回内存位置的标志,如GFP_DMA)您可以参考howto.1.txt
https://stackoverflow.com/questions/31949861
复制相似问题