首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于skbuff的Linux内核连续内存分配

用于skbuff的Linux内核连续内存分配
EN

Stack Overflow用户
提问于 2013-11-03 14:16:30
回答 1查看 202关注 0票数 2

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

EN

回答 1

Stack Overflow用户

发布于 2020-10-30 20:50:21

简短回答:

是。内存范围skbuff->end - skbuff->head始终是连续的内存块。

长篇答案:

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

如果你想更深入地了解如何使用fragmented skbuff,那么我推荐阅读this (当SKB是非线性时,从这个标题开始阅读)。我认为那里的解释是清晰的,也是可视化的。

我怎么知道我的skbuff是碎片的?

如果您不是分配skbuff的那个人,并且您想了解您正在使用的skbuff的数据是否有碎片,您可以只检查skb->data_len的值

  • 如果它等于0,则skbuff是线性的(不是分段的-数据位于连续的内存块上),并且数据的大小是skb->len.
  • If它大于0,skbuff不是线性的(数据是分段的),were skb->len仍然是整个帧的长度,skb->data_len是不包括第一个片段的所有数据片段的总长度。

您也可以只调用skb_is_nonlinear(),如果它返回true,那么skbuff就是碎片的(位于物理上不连续的内存中)。

奖励:

如果你收到了一个分片的skbuff,并且你不能使用分片的skbuffer(因为你的硬件不支持它或者其他一些原因),那么你可以使用函数skb_copy()将这个分片的skbuff重塑成一个新的skbuff线性skbuff (不是分片的)。但请记住,此函数将创建原始skbuff的副本,因此此操作将耗费您...

嗯..。别忘了发布原始的skbuff。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19750361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档