linux中套接字缓冲区(skb)中数据的DMA



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

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

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

谢谢儿童

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

最新更新