内存管理pbuf.h头文件源码解析——LwIP学习
声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正。
LwIP的内核(core文件夹)文件中pbuf.c是包含协议栈内核使用的数据包管理函数,用于协议栈层次间的数据传递,避免数据拷贝。我们在分析pbuf.c文件之前,先来分析下它的头文件pbuf.h。
一、在定义pbuf之前,首先定义了pbuf的层次和几种类型。
在定义pbuf之前,首先定义了数据包运送最大值和数据包IP最大值
#define PBUF_TRANSPORT_HLEN 20; //定义数据包运送最大值
#define PBUF_IP_HLEN 20; //定义数据包IP最大值
然后定义了pbuf数据包的几种层次。
typedef enum{
PBUF_TRANSPORT, //传输层
PBUF_IP, //网络层
PBUF_LINK, //链路层
PBUF_RAM //原始层,不预留任何空间
} pbuf_layer;
然后定义了pbuf的四种类型
typedef enum {
PBUF_RAM, //pbuf data is stored in RAM
PBUF_ROM, //pbuf data is stored in ROM
PBUF_REF, //pbuf comes from the pbuf pool
PBUF_POOL //pbuf payload refers to RAM
} pbuf_type;
| 类别 | 分配方式 | 特点 | 使用场合 |
|---|---|---|---|
| PBUF_RAM | 由内存堆分配,包括pbuf和数据区 | 长度不定,分配耗时,用的最多 | 应用程序和协议栈(协议栈要发送的数据和应用程序要传递的数据一般都采用这个形式) |
| PBUF_POOL | 由内存池分配,包括pbuf和数据区 | 长度固定,分配快 | 中断服务程序 |
| PBUF_ROM | 由内存池分配,仅包括pbuf | 所指数据都位于ROM中 | 应用程序引用内存区 |
| PBUF_REF | 由内存池分配,仅包括pbuf | 所指数据位于RAM中 | 应用程序引用内存区 |
1)PBUF_RAM内存申请(在pbuf.c文件中):
struct pbuf *p;
p = (struct pbuf*)mem_malloc(LWIP_MEMALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
分配空间:
SIZEOF_STRUCT_PBUF:pbuf结构头大小。
offset:数据的包头(TCP包头,IP包头等)。
length:数据存储空间大小。
2)PBUF_POOL内存申请:
q = memp_malloc(MEMP_PBUF_POOL);
其中memp_malloc()中参数为memp_t类型。
对于POOL类型:MEMP_PBUG_POOL属于POOL三大类型中的PBUF_MEMPOOL类型。
3)PBUF_ROM内存申请:
p = memp_alloc(MEMP_PBUF); //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间。
PBUF_ROM指向ROM空间内的某段数据
4)PBUF_REF内存申请:
p = memp_malloc(MEMP_PBUF); // 在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间
PBUF_REF指向RAM空间内的某段数据。
每一种pbuf分配内存的方式都不一样,图1所示
图1 四种数据包管理结构
只有选择合适的pbuf类型才能发挥LwIP的最大性能,一个数据包可能是多种pbuf的组合,用链表连接起来,如图2所示。
图2 pbuf链表
二 定义pbuf
struct pbuf {
/** nest pbuf in singly linked pbuf chain */
struct pbuf *nest; //nest字段指针指向下一个pbuf结构
/** pointer to the actual data in the buffer */
void *payload; //指向有效数据区
/**
*total length of this buffer and all next buffers in chain
*belonging to hte same packet
*数据链的总长度
*For non-queue packet chains this is the invariant:
*p->tot_len == p->len + (p->next? p->next->tot_len: 0)
*/
u16_t tot_len; //当前pbuf和其后所有pbuf的有效数据的长度
/**length of this buffer */
u16_t len; //当前缓冲区的长度
/** pbuf_type ad u8_t instead of enum to save space */
u8_t /* pbuf_type */ type; //表示pbuf类型
/** misc flags */
u8_t flags; /*也用来表示pbuf的类型,混合标志位,每一位代表一个标志,初始化一个pbuf的时候,将该字段的值设为0,而且在其他地方也没有用到该字段。*/
/**
* the reference count always equals the number of pointers
* that refer to this pbuf. This can be pointers from an application
* the stack itself, or pbuf->next pointers from a chain.
*/
u16_t ref; /* 表示该pbuf被引用的次数,初始化一个pbuf的时候,ref字段值被设置为1*/
/*当有其他pbuf的next值针指向该pbuf时,该pbuf的字段值加1*/
/*所以要删除一个pbuf时,ref的值必须为1才能删除成功,否则删除失败。 */
/** 统计有多少个指针指向这个pbuf。这些指针可能是应用程序的指针,协议栈自己的指针或者数据链中的pbuf->next指针,ref为0时,才可以释放pbuf*/
};
三 定义pbuf的处理函数
pbuf.h中定义,pbuf.c中实现
struct pbuf *pbuf_alloc( );
void pbuf_realloc( );
u8_t pbuf_header( );
void pbuf_ref( );
void pbuf_ref_chain( );
u8_t pbuf_free( );
u8_t pbuf_clen( );
void pbuf_cat( );
void pbuf_chain( );
struct pbuf *pbuf_dechain( );
err_t pbuf_copy( );
u16_t pbuf_copy_partial( );
内存管理pbuf.h头文件源码解析——LwIP学习的更多相关文章
- 内存管理pbuf.c源码解析——LwIP学习
声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正. 本文自己尚有认为写的不完整的地方,源代码没有完全理清, ...
- [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构
[源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...
- [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入
[源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 目录 [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 0x00 摘要 0 ...
- [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么
[源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么 目录 [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun ...
- [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架
[源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...
- [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark
[源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark 目录 [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark ...
- [源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator
[源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator 目录 [源码解析] 深度学习分布式训练框架 horovod (19) --- kub ...
- [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现
[源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 目录 [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 0x00 摘要 0x01 概述 1.1 什么是GPip ...
- [源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段
[源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段 目录 [源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段 0x00 摘要 0x0 ...
随机推荐
- Reverse digits of an integer.
class Solution { public: int reverse(int x) { ;//long 是怕中间过程溢出 <<,max=-min-){ ans=ans*+x%; x=x ...
- C#数组的指定位置复制函数
1. // 源数组 - 起始位置 -目的数组 - 起始位置 - 长度 System.Array.Copy(mcu_data, 2, read_mcu_data_whole, 0, mcu_data.L ...
- git的安装已经连github
https://help.github.com/articles/generating-ssh-keys 1.安装git [plain] view plain copy sudo apt-get ...
- POJ2239 二分图最大匹配
问题:POJ2239 分析: 本题给出每门课程的上课时间,求最大选课数,可以转化为二分图最大匹配问题求解. 设集合A为课程集,集合B为上课时间集,根据输入建立二分图.最大选课书就是该二分图的最大匹配数 ...
- Hdu1092
#include <stdio.h> int main() { ; while(scanf("%d",&n)){ ) {;} else{ int i,a; ;i ...
- 【转】简析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
转载地址:http://blog.csdn.net/mn11201117/article/details/8671497 SynchronousQueue SynchronousQueue是无界的,是 ...
- Android 开发中关于layoutinflater
Inflater英文意思是膨胀,在Android中应该是扩展的意思吧. LayoutInflater的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout ...
- hdu 3461 Code Lock
http://acm.hdu.edu.cn/showproblem.php?pid=3461 并差集和幂取模 这道题主要是求不可操作区间. #include <cstdio> #inclu ...
- 猎豹上市(猎豹的广告收入中有70%来自BAT三家公司,总收入中有58%来自BAT)
发表日期: 2014 年 5 月 9 日 From 网易专题 文/赵楠 村里那点儿事 猎豹移动上市之夜,我挺激动. 激动除了因为有好朋友在这家公司外,也因为猎豹移动在历史上的几次起承转合非常不易,在巨 ...
- VS2010使用静态编译的qt库(Qt 5)
Qt 5引入了一种新的编写方式. Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便. 虽然以前为了方便,直接安装的q ...