设备驱动里一般调用dma_map_single()/dma_unmap_single()处理cache。调用dma_map_single函数时需要指定DMA的方向,DMA_TO_DEVICE或者DMA_FROM_DEVICE。Linux会根据direction的值invalidate或者clean cache。 drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,调用dma_map_single()刷新cache,macb_tx_...
通常在驱动init时进行map操作,而在deinit时进行unmap操作; 通常在使用consistent dma mapping时,首先需要通过dma_alloc_coherent接口来分配一段区域: dma_alloc_coherent用于分配coherent内存,并返回对应的虚拟地址; 进行内存分配时,存在三种方式:1)优先从设备专用的dma池开始分配;2)无专用dma池,如果是dma-direct访问,通...
dma_map_single/dma_unmap_single的使用 设备驱动里一般调用dma_map_single()/dma_unmap_single()处理cache。调用dma_map_single函数时需要指定DMA的方向,DMA_TO_DEVICE或者DMA_FROM_DEVICE。Linux会根据direction的值invalidate或者clean cache。 drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,...
(2)当只有一个缓冲区要传输的时候,使用dma_map_single函数映射它: dma_addr_t dma_map_single(struct device *dev, void *buffer, size_t size, enum dma_data_direction direction); (3)当传输完毕后,使用dma_unmap_single删除映射: dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_...
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。 3. 释放流式映射 当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
dma_map_single函数的作用是将一段内存映射到设备的DMA地址空间中。通过这个函数,可以将用户空间或内核空间的数据映射到设备的DMA地址空间中,从而实现数据在设备和系统内存间高效地传输。dma_map_single函数在不同硬件平台上有不同的实现,而在Linux内核中提供了统一的接口来使用这个函数。
DMA Streaming Mappingdma_addr_t dma_map_single(...);void dma_unmap_single (...); 有的强大DMA,不需要连续内存做DMA操作,scater/getter可以用 int dma_map_sg(...);void dma_unmap_sg (...); 有一些强大硬件,DMA能感知cache网络互联;这3套API,对任何硬件都成立;实现API后端,兼容不同硬件。
2)e1000_adv_tx_desc 数组:这个数组是网卡硬件使用的,硬件是可以通过 DMA 直接访问这块内存,通过 dma_alloc_coherent 分配。 这个时候它们之间还没有啥联系。将来在发送的时候,这两个环形数组中相同位置的指针将都将指向同一个 skb。这样,内核和硬件就能共同访问同样的数据了,内核往 skb 里写数据,网卡硬件负责发...
举一个典型的栗子,ARM64 IOMMU(SMMU)的map/unmap开销大,导致dma_map_single/sg, dma_unmap_single/sg这些APIs在开启IOMMU的情况下,吞吐率不高。这个时候,我们通过前面的火焰图、CPU利用率分布报告很可能已经抓到了热点在drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c【3】的arm_smmu_cmdq_issue_cmdlist这个...
dma_map_single/dma_unmap_single的使用 设备驱动里一般调用dma_map_single()/dma_unmap_single()处理cache。调用dma_map_single函数时需要指定DMA的方向,DMA_TO_DEVICE或者DMA_FROM_DEVICE。Linux会根据direction的值invalidate或者clean cache。 drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,...