全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

sk_buff内存空间布局情况与相关操作(一)

时间:2023-07-30 16:43

人气:

作者:admin

标签: 内核  内存 

导读:套接字数据缓存(socket buffer)在Linux内核中表示为:struct sk_buff,是Linux内核中数据包管理的基本单元,主要包含两个部分,其一:管理数据,即数据包的管理信息;其二:报文数据,保存...

套接字数据缓存(socket buffer)在Linux内核中表示为:struct sk_buff,是Linux内核中数据包管理的基本单元,主要包含两个部分,其一:管理数据,即数据包的管理信息;其二:报文数据,保存了实际网络中传输的数据,在内核协议栈起承上启下的作用,也有很多值得关注的sk_buff操作。

1、sk_buff四大指针与相关操作
**分配初始化:**struct sk_buff中四个指针都指向数据区,分别是head、data、tail、end,刚刚分配出来的sk_buff会立马进行四大指针的初始操作。

分配sk_buff如下所示:

struct sk_buff *buff;
 buff = sk_stream_alloc_skb(sk, 0, sk- >sk_allocation, true);

sk_stream_alloc_skb最终调用__alloc_skb函数进行内存分配,分配skb后,进行四大指针的初始化操作:

struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
       int flags, int node)
{
 struct sk_buff *skb;
 skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node)
 skb- >head = data;
 skb- >data = data;
 skb_reset_tail_pointer(skb);
 skb- >end = skb- >tail + size;
}

其中skb_reset_tail_pointer(skb):

static inline void skb_reset_tail_pointer(struct sk_buff *skb)
{
 skb- >tail = skb- >data;
}

最终四大指针初始化为以下图所示:

图片

此时head、data、tail三个指针指向一起,end指向数据缓冲区的尾部。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信