缓冲区的克隆和拷贝

当同一个缓冲区需要由不同的消费者个被处理时,那些消费者可能修改sk_buff喵舒服的内容,但是内核不需要完全拷贝sk_buff结构和相关联的数据缓冲区。相反,为了提高效率,内核可以克隆原始值,也就是只拷贝sk_buff 结构,然后使用引用计数,以免过早释放共享的数据块,缓冲区的克隆由skb_clone 函数实现。

使用克隆的情况的一个例子就是,当一个输入封包需要传递给多个接收者时,如协议处理例程和一个或者多个网络分流器。

sk_buff 的克隆没有链接到任何表,而且也没有引用套接字的拥有者,skb->cloned 字段在科隆和原油的缓冲区内都置为1,而克隆的skb->users 也置为1.使得第一次尝试删除就能成功,但是,对包含数据的缓冲区的引用书目则会递增,图2-9所示是克隆缓冲区的是一个实例。

skb->

head 头空间

data 数据

tail 尾空间

end

struct sk_buff sk_shinfo

struct skb_shared_info

图2-9 skb_clone函数

skb_clone 函数可以用于检查一个skb缓冲区的克隆状态。

图2-9所示为片段缓冲区的一个实例--也就是说,这个缓冲区有一些数据是存储在一些frags 数组链接起来的数据片段,第二十一章会说明片段缓冲区的用法,目前我们先不理会这些细节。

当一个缓冲区被克隆时,数据区块的内容不能修改,意味着访问该数据的代码不需要上锁机制,然而,当函数不仅需要修改sk_buff结构的内容,而且也需要修改数据时,就必须连数据区块一起克隆,在这种情况下,程序员有两种选择,程序员有两种选择,当他知道只需要修改介于skb->start和skb->end的区域的数据内容时,可以使用pskb_copy只克隆该区域,当他认为可能必须连片段数据区块的内容也跟着修改时,就必须使用skb_copy, pskb_copy 和skb_copy的结果如图2-10所示,在第二十一章可以看到,skb_shared_info数据结构也可以包括一个sk_buff 结构列表,pskb_copy和skb_copy处理该列表的方式和frags数组的处理方式相同。

此时,可能还无法理解图2-9和图2-10所有细节,到了本书以后的章节,特别是读第五部分之后,一切都会更有意义。

讨论本书的各项主题时,有些时候我会强调给定的函数必须克隆或者拷贝一个缓冲区。决定做一个缓冲区的克隆或者拷贝时,每个子系统的程序员无法预测其他内核组建是否需要该缓冲区内的原有数据,内核是非常模块化的,而且以非常动态而无法预测的方式改变,所以,每个子系统对其他子系统会对一个缓冲区做些什么都是未知的,因此,每个子系统的程序员只需要记录其对该缓冲区所做的任何修改,而且在修改任何东西前先做个拷贝,以免内核其他部分需要原有的信息。

相关推荐
bush410 分钟前
正点原子imx6ull-uboot,奇怪的问题
linux·学习
dddwjzx23 分钟前
嵌入式Linux C应用编程——Framebuffer应用编程
linux·嵌入式
进阶的猪1 小时前
【无标题】vmware虚拟机无法勾选**将主机虚拟适配器连接到此网络** /没有网络(不显示网络图标)的解决方法
网络
今天也想躺ping2 小时前
linux系统移植pjsua库实现sip通话功能
linux·sip·交叉编译
CHANG_THE_WORLD2 小时前
6.多线程的TCP通信
java·网络·tcp/ip
hkj88083 小时前
Linux 总线-设备-驱动(Bus-Device-Driver)完整协作原理
linux·运维·microsoft
AA陈超3 小时前
004 T02 - 俯视角摄像机系统 设计文档
网络·c++·ue5·虚幻引擎
Haku Coder3 小时前
Netlify 部署静态网站——0~1保姆级操作教程
服务器·netlify·静态网页托管·免费部署
早点睡啊Y3 小时前
深入学 LangChain 官方文档(一):总览、安装与快速开始
linux·服务器·langchain
一直在努力学习的菜鸟3 小时前
Rocky8.5编译安装PHP8.4
linux·运维