内存管理pbuf.h头文件源码解析——LwIP学习
2015-11-30 13:32
459 查看
声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正。
LwIP的内核(core文件夹)文件中pbuf.c是包含协议栈内核使用的数据包管理函数,用于协议栈层次间的数据传递,避免数据拷贝。我们在分析pbuf.c文件之前,先来分析下它的头文件pbuf.h。
然后定义了pbuf数据包的几种层次。
然后定义了pbuf的四种类型
1)PBUF_RAM内存申请(在pbuf.c文件中):
分配空间:
SIZEOF_STRUCT_PBUF:pbuf结构头大小。
offset:数据的包头(TCP包头,IP包头等)。
length:数据存储空间大小。
2)PBUF_POOL内存申请:
其中memp_malloc()中参数为memp_t类型。
对于POOL类型:MEMP_PBUG_POOL属于POOL三大类型中的PBUF_MEMPOOL类型。
3)PBUF_ROM内存申请:
PBUF_ROM指向ROM空间内的某段数据
4)PBUF_REF内存申请:
PBUF_REF指向RAM空间内的某段数据。
每一种pbuf分配内存的方式都不一样,图1所示
图1 四种数据包管理结构
只有选择合适的pbuf类型才能发挥LwIP的最大性能,一个数据包可能是多种pbuf的组合,用链表连接起来,如图2所示。
图2 pbuf链表
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( );
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中 | 应用程序引用内存区 |
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( );
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- 浅析Ruby的源代码布局及其编程风格
- asp.net 抓取网页源码三种实现方法
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- jQuery源码分析之jQuery中的循环技巧详解
- 本人自用的global.js库源码分享
- java中原码、反码与补码的问题分析
- PHP网页游戏学习之Xnova(ogame)源码解读(六)
- C#获取网页HTML源码实例
- PHP网页游戏学习之Xnova(ogame)源码解读(八)
- PHP网页游戏学习之Xnova(ogame)源码解读(四)
- JS小游戏之极速快跑源码详解
- JS小游戏之象棋暗棋源码详解
- android源码探索之定制android关机界面的方法
- 基于Android设计模式之--SDK源码之策略模式的详解
- Android游戏源码分享之2048
- C语言借助EasyX实现的生命游戏源码
- C实现的非阻塞方式命令行端口扫描器源码
- PHP网页游戏学习之Xnova(ogame)源码解读(七)