一个DMA映射是要分配的DMA缓冲区与为该缓冲区生成的、设备可访问地址的组合。DMA映射建立了一个新的结构类型---dma_addr_t来表示总线地址。dma_addr_t类型的变量对驱动程序是不透明的,唯一允许的操作是将它们传递给DMA支持例程以及设备本身。
根据DMA缓冲区期望保留的时间长短,PCI代码有两种DMA映射:
1)一致性映射
2)流式DMA映射(推荐)
********************************************************************************************************
建立一致性DMA映射
********************************************************************************************************
void *dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *dma_handle,int flag);
该函数处理了缓冲区的分配和映射。
前两个参数是device结构和所需缓冲区的大小。
函数在两处返回结果:
1)函数的返回值是缓冲区的内核虚拟地址,可以被驱动程序使用。
2)相关的总线地址则保存在dma_handle中。
向系统返回缓冲区--解除一致性映射
void dma_free_coherent(struct device *dev,size_t size,void *vaddr,dma_addr_t dma_handle);
---------
DMA池
DMA池是一个生成小型、一致性DMA映射的机制。调用dma_alloc_coherent函数获得的映射,可能其最小大小为单个页。如果设备需要的DMA区域比这还小,就要用DMA池了。
<linux/dmapool.h>