linux内核源码分析 释放内存 “每日读书”

释放内存:kfree_skbdev_kfree_skb

两个函数会释放一个缓冲区使返回缓冲池kfree_skb直接dev_kfree_skb包裹函数调用启动随后设备驱动程序定义并使用名称dev_alloc_skb类似但是组成只有一个简单这个不做任何事情只是调用kfree_skb只有skb->users 计数器1(缓冲区已经无任何用户时)这个基本函数才会释放一个缓冲区否则只是递减计数器所以如果一个缓冲区三位用户只有三次调用dev_kfree_skbkfree_skb才会释放内存

2-6流程显示释放一个缓冲区所有步骤三十三会看到一个sk_buff结构可以持有一次dst_entry数据结构引用因此sk_buff结构被释放必须调用dst_release 递减相关dst_entry 数据结构引用计数

destructor函数指针已经初始化就会在这里调用

2-5 看起来是一个简单场景一个sk_buff数据结构另一个实际存储数据内存相关联然而如图2-5所示数据区块底端skb_shared_info数据结构可以持有一些指向其他内存片段指针参见二十一实例kfree_skb 也会释放这些片段持有内存最后sk_buff数据结构返回skbuff_head_cache缓存

数据预留对齐:skb_reserve, skb_put, skb_push以及skb_pull

skb_reserve缓冲区头部预留一些空间通常允许插入一个报头或者强迫数据对齐某个边界函数移动标记有效载荷开端指针data尾端指针tail2-4 显示调用skb_reserve 之后结果缓冲区分配之后通常马上就会调用函数此时datatail仍然相同

如果你看一下几种Ethernet驱动程序之一函数你会发现它们任何数据存储分配缓冲区之前都会使用下列命令

递减skb引用计数

skb->users

|

skb引用计数0 返回

skb列表中

打印警告信息(可能是bug)

skb->destructor 已经初始化了吗

是 执行解析函数 skb_releaese_data

skb克隆 释放主要缓冲区以及任何片段

dataref 引用计数0

skb返回缓存

2-6 kfree_skb 函数

skb_reserve(skb, 2) //IP对齐16字节地址边界

由于知道要把一个带有14字节头Ethernet 拷贝到缓冲区参数2使缓冲区移动2字节这样IP报头就可以缓冲区开始按照16字节边界对齐紧接Ethernet报头之后如图2-7所示

(a)

struct sk_buff

len = 0

head

data

tail

end

(b)

struct sk_buff

len = 0;

head

data

tail

end

...

(c)

struct sk_buff

len=L

head

data

tail

end

填充区域 2

Ethernet

报头 14

IP报头

IP 有效载荷

2-7 skb_reserve之前bskb_reserve 之后C拷贝缓冲区之后

2-8所示数据传输期间相反方向使用skb_reserve实力

(a)

struct sk_buff

len = 0

head

data

tail

end

(b)

struct sk_buff

len = 0;

head

data

tail

end

(c)

len = L1

head

data

tail

end IP有效载荷

2-8 缓冲区穿过协议栈TCP向下链路层

1 TCP请求传输一些数据会根据一些准则TCP MSS .支持分散-聚集IO分配一个缓冲区

2 TCP会在缓冲区头部预留足够空间容纳所有层TCP 报头参数MAX_TCP_HEADER所有报头总和计算要考虑最坏情况因为TCP不知道传输接口类型, 因此每个分层预留最大可能报头甚至考虑多个IP报头可能性IP-over-IP通道就可能多个报头

3 TCP有效载荷拷贝缓冲区注意2-8只是一个例子而已TCP有效载荷可能不同方式组织如果可以作为多个片段存储二十一我们看到片段缓冲形式

4 TCP添加报头

5 TCP缓冲区传给IPIP同样添加报头

6 IPIP风暴传给邻居层邻居层链路层报头添加进来

注意当缓冲区往下传播经过网络协议栈每个协议都会吧skb-》data传下并将其报头拷贝进来然后更新skb->len 这一都是我们2-4所看到函数完成

注意skb_reserve函数没有其他任何东西移入数据缓冲区只是更新2-4所示两个指针而已

static inline void skb_reserve(struct sk_buff *skb, unsigned int len)

{

skb->data += len;

skb->tail+=len;

}

skb_push 会把一个数据块添加到缓冲区开端skb->put会把一个数据块添加到缓冲区尾端skb_reserve一样这些函数并没有真的数据添加缓冲区只是简单移动指向头尾指针数据应该有其他函数明确拷贝进来skb_pull通过head指针向前移动一个数据块缓冲区头部删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++作业day4

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTextToSpeech> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中&#xff0c;获取完整的内存操作权限&#xff0c;达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库&#xff0c;当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。 Frida安装…

【现代C++】线程支持库

现代C&#xff08;C11及其之后的版本&#xff09;引入了标准的线程支持库&#xff0c;使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…

【刷题】备战蓝桥杯 — dfs 算法

送给大家一句话&#xff1a; 风度真美&#xff01; 即使流泪&#xff0c;也要鼓掌&#xff0c; 即使失望&#xff0c;也要满怀希望。 ——刘宝增 dfs 算法 1 前言2 洛谷 P1030 [NOIP2001 普及组] 求先序排列题目描述算法思路 3 洛谷 P1294 高手去散步题目描述算法思路 4 蓝桥…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

PHP自带的密码加密函数Password_verify 和password_hash

Password_verify 和password_hash 这两个函数都是PHP自带的密码加密函数&#xff0c;通过底层实现&#xff0c;无法查看源代码 password_hash函数用于对用户输入的密码进行加密 Password_verify验证用户输入的密码是否正确 Tips&#xff1a;看到密码验证用的Password_verify&a…

CODEFORCES --- 32B. Borze

32B. Borze 三元数字符号在伯兰非常流行。电传三元数时使用 Borze 字母表。数字 0 发送".“&#xff0c;1 发送”-.“&#xff0c;2 发送”–"。您需要对 Borze 编码进行解码&#xff0c;即根据其在 Borze 字母表中的表示找出三元数。 输入 第一行包含一个博尔兹编…

Redis部署之主从

使用两台云服务器&#xff0c;在 Docker 下部署。 Redis版本为&#xff1a;7.2.4 下载并配置redis 配置文件 下载 wget -c http://download.redis.io/redis-stable/redis.conf配置 master节点配置 bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑…

工具类代码

工具类代码 题外话前言Excel工具 题外话 如果各位客官有需要开发一些小小需求&#xff0c;可以私我哦&#xff0c;承接小需求开发&#xff0c;或问题定位&#xff08;仅限java&#xff09;&#xff0c;价格私聊哈 前言 在开发过程中可能偶尔会用到一些小工具类&#xff0c;故想…

C++ 标准库类型priority_queue

C/C总述&#xff1a;Study C/C-CSDN博客 堆&#xff08;数据结构&#xff09;&#xff1a;堆-CSDN博客 priority_queue(优先队列) 在优先队列中&#xff0c;元素被赋予优先级&#xff08;按约定的函数来赋予优先级&#xff0c;底层通过堆来实现&#xff09;。当访问元素时&am…

Linux 开发----在线英语字典

应用开发&#xff01; 这款应用程序是在Linux操作系统下完成的&#xff0c;整个项目包含了众多的知识点&#xff08;文件IO、进程、网络、数据库&#xff09;。动手操作之前可以先大致设计出流程图&#xff0c;然后根据流程图进行各个模块的实现&#xff08;注册模块、登录模块…

谈谈什么是 Redis

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

RISC-V GNU Toolchain 工具链安装问题解决(stdio.h 问题解决,pk fence.i 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

【嵌入式C 数据结构】二分查找,自定义通用数据结构用于不同类型数据的查找

实现功能描述如下: 自定义一个通用的数据结构,可定义 u8 u16 u32 float 等多种数据类型,参考C通用库的 qsort 函数若数组有序,直接调用接口实现二分查找可实现单个数据有序插入数组,并查找可实现数组中数据的删除C语言标准库函数qsort(快速排序函数) 目录 1. 二分查找算…

2024.04.10

# 前言 2024年4月10号也算是有纪念意义的一天吧&#xff0c;什么纪念意义呢&#xff1f;前面博客可能也说过&#xff0c;本人经历过两年前端&#xff0c;然后因为一些不可控的原因转为java后端一年&#xff0c;然后前段时间因为一些原因接触了解了嵌入式这个行业&#xff0c;所…

JavaScript中的BOM: history-Location-Navigator

BOM(浏览器对象模型) - BOM中为我们提供了一组对象&#xff0c;借助这组对象可以通过JS来操作浏览器 Window &#xff08;代表整个浏览器窗口&#xff0c;全局对象&#xff09; Navigator &#xff08;表示浏览器的信息&#xff09; Location &#xff08;表示浏览器地址栏…

IC卡和RFID卡的区别

简而言之&#xff0c;IC卡的原理即RFID&#xff0c;而RFID卡的范围更广&#xff0c;包括有ID卡、IC卡和NFC卡以及其它等电子卡/标签。他们主要的区别在于工作频段。 IC卡分为接触式和非接触式IC卡&#xff0c;都属于RFID范畴&#xff0c;接触式IC卡其芯片直接封装在卡基表面&am…

【数据结构】-- 单链表 vs 双向链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

动态规划刷题(2)之杨辉三角(详细解释)

最近在自学动态规划,网上到处找资料学习: 在这里记录我的刷题历史: 题目都是在力扣里面刷的!! 这里,我放一个刷动态规划的链接在这里:动态规划知识点题库 - 力扣(LeetCode) 力扣 在这里附加动态规划相关知识点:动态规划(DP)-CSDN博客文章浏览阅读197次。动态规划…

算法第四十一天-排除排序链表中的重复元素Ⅱ

排除排序链表中的重复元素Ⅱ 题目要求 解题思路 题意&#xff1a;在一个有序链表中&#xff0c;如果一个节点的值出现不止一次&#xff0c;那么把这个节点删除掉 重点&#xff1a;有序链表&#xff0c;所以&#xff0c;一个节点的值出现不止一次&#xff0c;那么他们必相邻。…