当像skbuff这样的结构由Linux内核分配时,分配的数据区域(skbuff-> tail - skbuff-> head)是否总是连续的内存块,或者这可能是非连续的?
答案 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
的值:>
skb->len
。skb->len
仍然是
全帧,skb->data_len
是所有数据片段的总长度
计算第一个片段。您还可以只调用skb_is_nonlinear()
,如果返回true
,则skbuff会碎片化(取决于物理上不连续的内存)。
奖金:
如果收到了碎片化的skbuff,并且您不能使用碎片化的skbuffer(因为您的硬件不支持它或出于某些其他原因),那么您可以使用功能{ {3}}。但是请记住,此功能将创建原始skbuff的副本,因此此操作将花费您...
嗯..别忘了释放原始的skbuff。