一、是什么?
使用DMA的设备驱动程序将与链接到总线接口上的硬件通信,硬件使用的物理地址,而程序代码使用的虚拟地址.实际情况上,基于DMA的硬件使用的总线地址,而不是物理地址.DMA映射建立了一个新的结构类型 dma_addr_t来标识总线地址.dma_addr_t类型的变量对驱动程序是不透明的;
唯一允许的操作是将他们传递给DMA支持例程以及设备本身.作为一个总线地址,如果cpu直接使用了dma_addr_t,将会导致发生不可预期的问题.
流DMA映射:
write 系统调用:将数据被发送到设备. DMA_TO_DEVICE
只有一个缓冲区被传输时,使用dma_map_single函数映射它:
dma_addr_t dma_map_single(struct devicedev,voidbuffer,size_t size,
enum dma_data_direction direction);
返回值是总线地址,可以把它传递给设备;
传输完成时,使用dma_unmap_single函数删除映射.
void dma_unmap_single(struct device*dev,dma_ddr_t dma_addr,
size_t size,enum dma_data_direction direction);
size和direction参数必须与映射缓冲区参数相匹配.
驱动程序不经过撤销映射就访问流DMA缓冲区的内容:
void dma_sync_single_for_cpu(struct device*dev,dma_handle_t bus_addr,
size_t size,enum dma_data_direction direction);
void dma_sync_single_for_device(struct device*dev,dma_handle_t bus_addr,
size_t size,enum dma_data_direc