我在最新的linux内核中经历了数据包传输和数据包接收的过程。我可以看到,skb中有一个框架,它支持"线性"数据和"分页"数据。
它有一个名为skb_shared_info的单独结构来表示页面片段。
现在我的疑问是,设备将如何DMA数据包的全部内容?它不会分散在记忆中吗?
谢谢儿童
这取决于网络硬件的能力。大多数"现代"NIC可以进行收集/分散DMA,并处理将数据包传输到多个不连续的缓冲区,但如果设置了NETIF_F_SG
(表示设备可以处理分散/收集),Linux内核网络堆栈只会向驱动程序/netdev提供带有非线性数据的skb。如果设备驱动程序设置了NETIF_F_SG
,那么它告诉堆栈它可以处理每个数据包的多个物理缓冲区。