如何使用物理地址作为网络以及DMA如何连接到它?

时间:2013-11-11 11:28:45

标签: linux linux-kernel kernel dma

我正在研究网络驱动程序,并且对内存管理有些困惑。 在TX路径上,我收到一个skb,因为下层只需要获得物理地址,我想我需要调用* virt_to_phys *并将返回值发送到下层。 (这有意义吗?)

现在,我知道有函数* dma_map_single *和* dma_unmap_single *。我仍然不确定他们是如何在这里看到的。所以下层想要使用DMA ......这是否意味着我需要在将数据包发送到较低层之前运行上述命令(在适当的时间内)?

我也不确定我理解dma_map_single

描述的含义

确保缓存中保存的任何数据被适当地丢弃或写回。

非常感谢您的帮助。

2 个答案:

答案 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。