Linux内核为skbuff分配内存

时间:2013-11-03 06:16:30

标签: linux networking memory memory-management kernel

当像skbuff这样的结构由Linux内核分配时,分配的数据区域(skbuff-> tail - skbuff-> head)是否总是连续的内存块,或者这可能是非连续的?

1 个答案:

答案 0 :(得分:0)

简短回答:
是。内存范围[{skbuff->end - skbuff->head]始终是连续的内存块。

长答案:
仍然可以,但是如果您的skbuff是碎片化的(稍后我将解释如何检查其是否碎片化),那么您的数据将不会位于一个连续的内存块上。请注意,[skbuff->end - skbuff->head]范围内的数据仍位于一个连续的存储块中,但不是所有分段的kbuff数据都位于[skbuff->end - skbuff->head]范围内。

如果您想更深入地了解如何使用fragmented skbuff,那么我建议您阅读this(并从该标题开始阅读当SKB为非线性时 >)。我认为那里的解释很清楚而且很形象。

如何知道我的skbuff碎片?
如果您不是分配skbuff的人,并且想了解正在使用的skbuff的数据是否零散,则可以只检查skb->data_len的值:

  • 如果它等于0,则skbuff是线性的(不分段-数据位于连续的内存块上),数据的大小为skb->len
  • 如果它大于0,则skbuff呈非线性(数据已分段),如果skb->len仍然是 全帧,skb->data_len是所有数据片段的总长度 计算第一个片段。

您还可以只调用skb_is_nonlinear(),如果返回true,则skbuff会碎片化(取决于物理上不连续的内存)。

奖金:
如果收到了碎片化的skbuff,并且您不能使用碎片化的skbuffer(因为您的硬件不支持它或出于某些其他原因),那么您可以使用功能{ {3}}。但是请记住,此功能将创建原始skbuff的副本,因此此操作将花费您...
嗯..别忘了释放原始的skbuff。