2

我想做多个帧的 dma 来发送一个大帧(巨型)。我能够发送正常帧(大小为 1500)。我需要对 dma 有一些疑问。

  1. dma_map_single() 相对于其他 api 的真正优势是什么。我们可以用 dma_map_page 做所有事情,对吧?

  2. 假设我们需要在驱动程序中传输一个大帧(jumbo),并且我已经将该帧存储在多个缓冲区中。这些缓冲区在物理内存或虚拟内存中不连续。但是这些缓冲区位于内核空间中。我们如何将它作为一帧发送。我们应该使用 scatter-gather dma 吗?这可能与其他 dma_api 吗?

4

1 回答 1

0
  1. dma_map_single 和 dma_map_page 最终会调用 dam_ops->map_page - 最终的功能由架构和内核配置决定。通常它将是带有 IOMMU 的 x86 机器上的 intel_map_page。
  2. 首先,从内核的角度来看,巨型帧在 TX 时间是无关紧要的,因为网络堆栈将传输的缓冲区合并为最多 64K 数据包(LSO/TSO),并且 NIC 最终会将单个 64K 数据包分解为几个 MTU(ETH 上的 9K/1500) ) 大小的数据包,每个数据包都有自己的 L3 标头。

对于您的问题,SKB 可以有一个分散收集列表 - 然后每个缓冲区进行 dma 映射。然后将 dma 地址和缓冲区长度的列表写入发送描述符到 NIC,该 NIC 知道如何将它们组合在一起以进行发送。

顺便说一句,内核中有一个用于分散列表的 dma_map_sg API,它将返回一个带有 dma 地址列表的分散列表。这通常与 NIC 驱动程序无关。

于 2014-03-08T20:12:16.797 回答