这是 DMA 的部分原因API:驱动程序可以将虚拟地址X 提供给 dma_map_single() 之类的接口,该接口设置任何所需的 IOMMU 映射并返回 DMA 地址 Z。然后驱动程序告诉设备对 Z 进行 DMA,IOMMU 将其映射到系统 RAM 中地址 Y 处的缓冲区。 为了让 Linux 能够使用动态 DMA 映射,它需要一些驱动程序的帮助,即它必须考...
10 sg_dma_address(struct scatterlist *sg) 11 sg_dma_len(struct scatterlist *sg) sync操作 1 void dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, 2 size_t size, 3 enum dma_data_direction dir) 4 5 void dma_sync_single_for_device(struct device *dev, 6 dma_addr_t add...
一致性api接口:sync_single_for_cpu 3.分散/聚集映射(scatter/gather map) Dma_map_sgs 有时候我们还需要 1. 回弹缓冲区 bounce buffer:当cpu侧物理地址不适合设备的dma操作的时候 2. DmA内存池:一般dma映射都是单个page的整数倍,如果驱动程序需要更小的一致性映射的dma缓冲区,可以使用。类似于slab机制, Dma_...
dma_sync_single_for_cpu(dev, dma_handle, size, direction); dma_sync_sg_for_cpu(dev, sglist, nents, direction); CPU访问结束后,将buffer还给设备DMA使用时,需要相应调用如下函数。 dma_sync_single_for_device(dev, dma_handle, size, direction); dma_sync_sg_for_device(dev, sglist, nents, ...
int request_dma(unsigned int chan, const char *device_id);//映射流式 DMAdma_addr_tdma_map_single(structdevice *dev,void*buf,size_tsize,enumdma_datadirection direction);//驱动获得DMA拥有权,通常驱动不该这么做 void dma_sync_single_for_cpu(struct device *dev,dma_addr_t dma_handle_t bus_...
drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,调用dma_map_single()刷新cache,macb_tx_interrupt()的macb_tx_unmap()再调用dma_unmap_single()。 代码简化后如下: macb_tx_map( ) { ... mapping = dma_map_single(&bp->pdev->dev, skb->...
* @handle: bus-specific DMA address * * Allocate some memory for a device for performing DMA. This function * allocates pages, and will return the CPU-viewed address, and sets @handle * to be the device-viewed address. */ void * dma_alloc_coherent(struct device *dev, size_t size, ...
void dma_sync_single_for_cpu(struct device *dev, dma_handle_t bus_addr, size_t size, enum dma_data_direction direction); (6)在设备访问缓冲区前,应该调用下面的函数将所有权交还给设备: void dma_sync_single_fir_device(struct device *dev, dma_handle_t bus_addr, size_t size, enum dma_da...
DMA用来在设备内存和内存之间直接数据交互。而无需cpu干预 内核为了方便驱动的开发,已经提供了几个dma 函数接口。 dma跟硬件架构相关,所以linux关于硬件部分已经给屏蔽了,有兴趣的可以深入跟踪学习. 按照linux内核对dma层的架构设计,各平台dma缓冲区映射之间的差异由内核定义的一个dma操作集 ...
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。 (3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_page...