linux中socket缓冲区(skb)中的数据DMA

时间:2014-01-17 16:27:58

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

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

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

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

由于 CHID

1 个答案:

答案 0 :(得分:2)

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