我正在研究网络驱动程序,并且对内存管理有些困惑。 在TX路径上,我收到一个skb,因为下层只需要获得物理地址,我想我需要调用* virt_to_phys *并将返回值发送到下层。 (这有意义吗?)
现在,我知道有函数* dma_map_single *和* dma_unmap_single *。我仍然不确定他们是如何在这里看到的。所以下层想要使用DMA ......这是否意味着我需要在将数据包发送到较低层之前运行上述命令(在适当的时间内)?
我也不确定我理解dma_map_single
描述的含义确保缓存中保存的任何数据被适当地丢弃或写回。
非常感谢您的帮助。
答案 0 :(得分:1)
物理地址不一定与I / O总线地址相同,因此您必须始终使用dma_map_
函数。
在许多系统上,DMA访问仅进入主内存,如果CPU缓存中存在该内存的内容副本,则会中断。
在这些系统上,dma_
函数采取适当的体系结构相关操作,以确保不会发生此类冲突。
答案 1 :(得分:1)
Linux源文档目录中的文件DMA-API.txt和DMA-API-HOWTO.txt记录了如何使用这些函数。
您不能使用virt_to_phys()
等来获取DMA地址。很久以前,这在很短的时间里起了作用。 Linux支持各种硬件体系结构和总线,对于其中许多硬件体系结构和总线,设备看到的地址空间不会将1:1映射到CPU的物理地址空间。然后还有IOMMU可以动态地改变该映射。所有这些都需要使用DMA API。