0

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

现在,我知道有函数 *dma_map_single* 和 *dma_unmap_single*。我仍然不确定他们是如何来到这里的。所以下层想和DMA一起工作……这是否意味着我需要在将数据包分派到下层之前(在适当的时间)运行上述命令?

我也不确定我是否理解 dma_map_single 描述的含义

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

感谢您的帮助。

4

2 回答 2

1

物理地址不一定与 I/O 总线地址相同,因此您必须始终使用这些dma_map_函数。

在许多系统上,DMA 访问只访问主内存,如果 CPU 缓存中有该内存内容的副本,主内存就会中断。在这些系统上,dma_功能采取适当的依赖于体系结构的操作,以确保不会发生此类冲突。

于 2013-11-11T16:09:35.213 回答
1

Linux 源的 Documentation 目录中的文件 DMA-API.txt 和 DMA-API-HOWTO.txt 记录了如何使用这些函数。

您不能使用virt_to_phys()等来获取 DMA 地址。很久以前,这在更简单的时代就奏效了。Linux 支持广泛的硬件架构和总线,对于其中的许多,设备看到的地址空间不会 1:1 映射到 CPU 的物理地址空间。然后还有可以动态更改映射的 IOMMU。所有这些都需要使用 DMA API。

于 2013-11-11T16:11:03.053 回答