缓冲区的克隆和拷贝

当同一个缓冲区需要由不同的消费者个被处理时,那些消费者可能修改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所有细节,到了本书以后的章节,特别是读第五部分之后,一切都会更有意义。

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

相关推荐
GeW3 小时前
如何打造真正的数字化工厂?需从Red Hat到数据库底层打捞基石
linux
沫璃染墨3 小时前
从零入门计算机网络系列(一):计算机网络初识——从网络发展史到TCP/IP协议》
linux·网络·网络协议·tcp/ip·计算机网络
zyseo83 小时前
谷歌SEO 站内搜索优化实战:把站内搜索词变成关键词金矿
java·服务器·数据库
王大傻09283 小时前
堆叠注入(Stacked Queries Injection)详解:原理、利用与防御
服务器·网络·数据库·web安全·网络安全
艾芯微科技4 小时前
钰泰 ETA5055V330DD1E|SOT-223 3.3V LDO,低压差、大电流线性稳压选型分享
网络·单片机·嵌入式硬件·集成测试·51单片机
bigcarp4 小时前
安卓模拟器MUMU+tcpdump抓包Socket协议流量
服务器·网络·tcpdump
是个西兰花4 小时前
TCP套接字编程实战:从服务器搭建到多进程处理
服务器·网络协议·tcp/ip
zhangzeyuaaa4 小时前
Ruby `require` 完全指南:从 `$LOAD_PATH` 到 `require_relative`
服务器·前端·ruby
忆挽篱笙歌5 小时前
gdb/cgdb
linux·ubuntu
懂点Tech5 小时前
ctfshow MISC入门图片篇(信息附加):misc11解题思路
网络