【问题标题】:DMA of data in socket buffer (skb) in linuxlinux中套接字缓冲区(skb)中数据的DMA
【发布时间】:2014-01-17 16:27:58
【问题描述】:

我正在经历最新的linux内核中的数据包传输和数据包接收过程。我可以看到,skb 中有一个框架,它支持“线性”数据以及“分页”数据。

它有一个名为 skb_shared_info 的单独结构来表示页面片段。

现在我的疑问是,设备将如何 DMA 数据包的全部内容?不会分散在内存中吗?

谢谢 孩子

【问题讨论】:

  • 这就是IOMMU 发挥作用的地方。
  • @0x90 感谢您的提示。如果你能提供它作为答案,我会接受它。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

这取决于网络硬件的能力。大多数“现代”网卡可以收集/分散 DMA 并处理将数据包传输到多个非连续缓冲区,但如果设置了NETIF_F_SG,Linux 内核网络堆栈只会将具有非线性数据的 skb 提供给驱动程序/netdev(表示设备可以处理分散/聚集)。如果设备驱动程序设置了NETIF_F_SG,那么它告诉堆栈它可以处理每个数据包的多个物理缓冲区。

【讨论】:

  • 谢谢!所以如果设备不支持分散聚集,堆栈会创建单独的 SKB,直到它满足数据包的长度是吗?
  • 它将为每个数据包创建一个 skb,所有数据都在线性部分中。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2018-02-10
  • 2014-10-13
  • 1970-01-01
相关资源
最近更新 更多