套接字数据缓存(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指向数据缓冲区的尾部。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5082文章
19126浏览量
305176 -
内核
+关注
关注
3文章
1372浏览量
40289 -
Linux
+关注
关注
87文章
11304浏览量
209493 -
内存
+关注
关注
8文章
3025浏览量
74046
发布评论请先 登录
相关推荐
Linux sk_buff四大指针与相关操作
在以上文章中,没有分析过Linux内核网络关键的数据结构-套接字数据缓存struct sk_buff,本文将第一次分享到sk_buff,但鉴于其在内核网络中一些复杂
发表于 10-13 17:23
•4648次阅读
Linux内存点滴 用户进程内存空间
文件VM分配与释放“内存总是被进程占用”,这句话换过来可以这么理解:进程总是需要内存。当fork()或者exec()一个进程的时候,系统内核就会分配一定量的VM给进程,作为进程的
发表于 08-14 16:23
DM8127使用SWOSD_TI_alloc()分配内存空间怎么加大?
DM8127使用SWOSD_TI_alloc()分配内存空间不够,请问在什么文件里怎样修改加大内存空间???
发表于 04-16 10:56
ARM32 Linux的内存布局
看我们实际上内存布局是怎么样的?Linux内核在启动时,会打印出内核内存空间的布局图,下面是ARM IMX6平台打印出来的内存空间布局图这部
发表于 04-24 14:20
RTThread的动态内存空间该如何去分配呢
关于rtt的动态内存空间分配,想问一下以下我的几点理解是对的吗1、我看RTT NANO和MASTER版本的动态内存分配好像不太一样,我的理解是MASTER版本的动态
发表于 08-31 14:34
Linux网络设备驱动程序
当要发送数据包的时候,内核必须建立一个包含传输数据的sk_buff,然后将sk_buff交给下层,各层在sk_buff递交给下一层,各层在
发表于 05-10 11:15
•1828次阅读
如何让你的手机省出内存空间
大家都知道,手机使用久了就会变得很卡顿,除了手机本身“老化”之外,还有一个重要的原因就是内存堆积的太多了。事实上占用手机内存的无非就是照片、视频、微信等等,如果好好处理一下这几个方面的
网卡的Ring Buffer详解
DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO(先入先出)原则。
网卡的Ring Buffer详解
DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO(先入先出)原则。
sk_buff内存空间布局情况与相关操作(二)
操作tailroom中用户数据块区域:skb_put用于修改指向数据区末尾的指针tail: void *skb_put( struct sk_buff *skb, unsigned int len
sk_buff内存空间布局情况与相关操作(三)
2、非线性区域 在1、中,可以看到每张sk_buff的图: 在end指针紧挨着一个非线性区域 ; 在struct sk_buff中没有指向skb_shared_info结构的指针,利用end指针
浅析新能源电动汽车充电桩空间布局优化研究
新能源汽车充电桩空间布局优化研究是一个复杂而重要的问题,要以用户实际需求为出发点,需要综合考虑充电桩的数量和分布、供电能力和供电网络的可靠性以及充电桩的建设和运营管理等因素.通过优化充电桩的空间布局,可以提高新能源汽车的充电便利
评论