前言
在动态内存管理那篇文章中讲到了内存分配策略:内存堆分配和内存池分配。两者互有优缺点,如何合理利用两种分配策略,就需要介绍LWIP的数据包缓冲的实现。
数据包pbuf源码详解
从网卡上来的原始数据包:有长达上千字节的TCP数据包,也有仅几个字节的ICMP数据包;
从要发送的数据包:上层应用可能将各种数据包递交给LWIP协议栈发送,这些数据包有可能存在于应用程序管理的内存空间内,也可能存在于某个ROM上。
这么复杂的工作致使LWIP必须有个高效的数据包管理核心,数据包管理机构出现了。
数据包管理机构采用数据结构 pbuf 来描述数据包,其源码如下:
struct pbuf {
struct pbuf *next;
void *payload;
u16_t tot_len;
u16_t len;
u8_t type;
u8_t flags;
u16_t ref;
};
- next字段指针指向下一个pbuf结构,因为实际发送或接收的数据包可能很大,而每个pbuf能够管理的数据可能很少,所以往往需要多个pbuf结构才能完全描述一个数据包。
- payload是数据指针,指向该pbuf管理的数据的起始地址,数据的起始地址可以是紧跟在pbuf结构之后的RAM,也可能是在ROM上的某个地址,而决定这点的是当前pbuf的类型。
- len字段表示当前pbuf中的有效长度
- tot_len表示当前pbuf和其后所有pbuf的有效数据的长度;
- type字段表示pbuf的类型,主要是四种类型
- flags也表示pbuf的类型,但是在初始化一个pbuf时,将该字段的值设为0,而在其他地方没有用到该字段,可以直接忽略
- ref字段表示该pbuf被引用的次数,初始化一个pbuf时,ref字段值被设置为1,当有其他pbuf的next指针指向该pbuf时,该pbuf的ref字段值加一。
pbuf的类型:PBUF_RAM、PBUF_ROM、PBUF_REF和PBUF_POOL。

本文详细解析了LWIP协议栈中的数据包管理机制,介绍了数据包pbuf的结构及其四种类型:PBUF_RAM、PBUF_ROM、PBUF_REF和PBUF_POOL。深入探讨了不同类型pbuf的内存分配策略,包括内存堆分配和内存池分配,并阐述了pbuf的释放过程。
6890

被折叠的 条评论
为什么被折叠?



