套接字数据缓存(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指向数据缓冲区的尾部。
-
嵌入式
+关注
关注
5159文章
19738浏览量
318786 -
内核
+关注
关注
3文章
1419浏览量
41569 -
Linux
+关注
关注
87文章
11522浏览量
214425 -
内存
+关注
关注
8文章
3128浏览量
75376
发布评论请先 登录
Linux sk_buff四大指针与相关操作

Linux内存点滴 用户进程内存空间
DM8127使用SWOSD_TI_alloc()分配内存空间怎么加大?
ARM32 Linux的内存布局
RTThread的动态内存空间该如何去分配呢
Linux网络设备驱动程序
如何让你的手机省出内存空间
网卡的Ring Buffer详解
网卡的Ring Buffer详解
sk_buff内存空间布局情况与相关操作(二)

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

浅析新能源电动汽车充电桩空间布局优化研究

评论