声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正。
LwIP的内核(core文件夹)文件中pbuf.c是包含协议栈内核使用的数据包管理函数,用于协议栈层次间的数据传递,避免数据拷贝。我们在分析pbuf.c文件之前,先来分析下它的头文件pbuf.h。

一、在定义pbuf之前,首先定义了pbuf的层次和几种类型。

在定义pbuf之前,首先定义了数据包运送最大值和数据包IP最大值

1 #define PBUF_TRANSPORT_HLEN 20; //定义数据包运送最大值
2 #define PBUF_IP_HLEN 20;    //定义数据包IP最大值

然后定义了pbuf数据包的几种层次。

1 typedef enum{
2     PBUF_TRANSPORT, //传输层
3     PBUF_IP, //网络层
4     PBUF_LINK, //链路层
5     PBUF_RAM //原始层,不预留任何空间
6 } pbuf_layer; 

然后定义了pbuf的四种类型

1 typedef enum {
2     PBUF_RAM,   //pbuf data is stored in RAM
3     PBUF_ROM,   //pbuf data is stored in ROM
4     PBUF_REF,   //pbuf comes from the pbuf pool
5     PBUF_POOL   //pbuf payload refers to RAM
6 } pbuf_type;

类别 分配方式 特点 使用场合
PBUF_RAM 由内存堆分配,包括pbuf和数据区 长度不定,分配耗时,用的最多 应用程序和协议栈(协议栈要发送的数据和应用程序要传递的数据一般都采用这个形式)
PBUF_POOL 由内存池分配,包括pbuf和数据区 长度固定,分配快 中断服务程序
PBUF_ROM 由内存池分配,仅包括pbuf 所指数据都位于ROM中 应用程序引用内存区
PBUF_REF 由内存池分配,仅包括pbuf 所指数据位于RAM中 应用程序引用内存区

1)PBUF_RAM内存申请(在pbuf.c文件中):

1 struct pbuf *p;
2 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内存申请:

1 q = memp_malloc(MEMP_PBUF_POOL);

其中memp_malloc()中参数为memp_t类型。
对于POOL类型:MEMP_PBUG_POOL属于POOL三大类型中的PBUF_MEMPOOL类型。
3)PBUF_ROM内存申请:

1 p = memp_alloc(MEMP_PBUF); //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间。

PBUF_ROM指向ROM空间内的某段数据

4)PBUF_REF内存申请:

1 p = memp_malloc(MEMP_PBUF); // 在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间

PBUF_REF指向RAM空间内的某段数据。
每一种pbuf分配内存的方式都不一样,图1所示

图1 四种数据包管理结构

只有选择合适的pbuf类型才能发挥LwIP的最大性能,一个数据包可能是多种pbuf的组合,用链表连接起来,如图2所示。

图2 pbuf链表

二 定义pbuf

 1 struct pbuf {
 2     /** nest pbuf in singly linked pbuf chain */
 3     struct pbuf *nest; //nest字段指针指向下一个pbuf结构
 4
 5     /** pointer to the actual data in the buffer */
 6     void *payload; //指向有效数据区
 7
 8     /**
 9     *total length of this buffer and all next buffers in chain
10     *belonging to hte same packet
11     *数据链的总长度
12     *For non-queue packet chains this is the invariant:
13     *p->tot_len == p->len + (p->next? p->next->tot_len: 0)
14     */
15     u16_t tot_len; //当前pbuf和其后所有pbuf的有效数据的长度
16
17     /**length of this buffer */
18     u16_t len; //当前缓冲区的长度
19
20     /** pbuf_type ad u8_t instead of enum to save space */
21     u8_t /* pbuf_type */ type; //表示pbuf类型
22
23     /** misc flags */
24     u8_t flags; /*也用来表示pbuf的类型,混合标志位,每一位代表一个标志,初始化一个pbuf的时候,将该字段的值设为0,而且在其他地方也没有用到该字段。*/
25
26     /**
27     * the reference count always equals the number of pointers
28     * that refer to this pbuf. This can be pointers from an application
29     * the stack itself, or pbuf->next pointers from a chain.
30     */
31     u16_t ref; /* 表示该pbuf被引用的次数,初始化一个pbuf的时候,ref字段值被设置为1*/
32     /*当有其他pbuf的next值针指向该pbuf时,该pbuf的字段值加1*/
33     /*所以要删除一个pbuf时,ref的值必须为1才能删除成功,否则删除失败。 */
34     /** 统计有多少个指针指向这个pbuf。这些指针可能是应用程序的指针,协议栈自己的指针或者数据链中的pbuf->next指针,ref为0时,才可以释放pbuf*/
35     };

三 定义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( );

转载于:https://www.cnblogs.com/-Angel/p/5024430.html

内存管理pbuf.h头文件源码解析——LwIP学习相关推荐

  1. 《C++ Primer》第一章的 Sales_item.h头文件源码

    Sales_item.h不是C++自带的,需要自己安装,这个库作者已经写好了, Sales_item.h 头文件代码如下: #ifndef SALESITEM_H #define SALESITEM_ ...

  2. FILE结构体在stdio.h头文件源码里的详细代码

    找了很久终于找到了! 我的stdio.h位置如下: C:\msys64\mingw64\x86_64-w64-mingw32\include 我终于在源码里面找到了FILE结构体的定义!!! 这里就涉 ...

  3. [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略

    [源码解析] 深度学习流水线并行 PipeDream(6)- 1F1B策略 文章目录 [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 0x00 摘要 0x01 流水线比 ...

  4. [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark

    [源码解析] 深度学习分布式训练框架 horovod (10) - run on spark 文章目录 [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark ...

  5. [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现

    [源码解析] 深度学习流水线并行Gpipe(1)-流水线基本实现 文章目录 [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 0x00 摘要 0x01 概述 1.1 什么是GPip ...

  6. [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型

    [源码解析] 深度学习流水线并行 PipeDream(3)- 转换模型 文章目录 [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 0x00 摘要 0x01 前言 1.1 改 ...

  7. [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积

    [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 文章目录 [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 0x00 摘要 0x01 概述 1.1 前 ...

  8. [源码解析] 深度学习分布式训练框架 horovod (11) --- on spark --- GLOO 方案

    [源码解析] 深度学习分布式训练框架 horovod (11) - on spark - GLOO 方案 文章目录 [源码解析] 深度学习分布式训练框架 horovod (11) --- on spa ...

  9. Android—内存泄漏、GC及LeakCanary源码解析

    内存抖动:内存频繁的分配和回收,频繁的GC会导致UI卡顿,严重的时候导致OOM. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放.结果导致一直占据该内存单元,我们和程序都无法再 ...

最新文章

  1. Codeforces Round #514 (Div. 2)题解
  2. CSS实现鼠标移入图片边框有小三角
  3. 跨链Cosmos(10) IBC接口
  4. 游戏扫码登录器程序PHP源码版
  5. 苹果本周四将发布 OS X Yosemite 公开测试版
  6. keepalived详解(三)——keepalived与Nginx配合实战
  7. Windows Server 2008官方(MSDN)简体中文正式版试用心得
  8. ibm服务器刷主板系统,ibm bios 升级图解 ibm服务器进入bios/升级程序
  9. spss入门基本用法
  10. MathType|强大的数学公式编辑器
  11. 第六届全国大学生GIS应用技能大赛开发题答案(非官方)
  12. intptr java_intptr_t 其实不是指针类型 (转载)
  13. u2000网管服务器系统安装,U2000网管预安装后无法登陆
  14. hcfax2e伺服驱动器说明书_交流伺服电机驱动器使用说明书.-共14页
  15. MongoDB应用场景及选型(海量数据存储选型)
  16. 云控系统都支持哪些安卓手机装机步骤
  17. 最终分化的SH-SY5Y细胞为研究多巴胺激动剂的神经保护作用提供了一个模型系统
  18. 除了X站,程序员还喜欢上这些网站...
  19. 查找二叉树(BST)
  20. Proteus 8 Professional 仿真软件安装包和汉化

热门文章

  1. 阿里云 OSS 之图片处理
  2. 谈谈大数据架构下的存储系统
  3. java eden_java eden 大小
  4. find grep联合搜索
  5. 弄它!!!理论加实验,小小ISIS分分钟拿下!!
  6. 营销思维篇:透漏22个我赚钱的小秘密
  7. WEB前端实现在线预览、编辑Office文档
  8. 做人做事,必须要搞清楚的9个顺序
  9. 从装大象中我们学会了什么设计模式
  10. Vivado DDS IP核使用、仿真、多相处理和相关计算验证