LwIP协议中动态内存管理方式主要有两种:
1.动态内存堆分配策略:在内存中找到一个大的空闲块(比预分配的大),分配出合适的内存块后,把剩余的归还回去。优点:内存浪费少。缺点:频繁分配释放容易造成内存碎片。
mem_init:内存堆初始化函数。
mem_calloc:
void *mem_calloc(mem_size_t count, mem_size_t size)
{
void *p;
/* allocate 'count' objects of size 'size' */
p = mem_malloc(count * size);
if (p) {
/* zero the memory */
memset(p, 0, count * size);
}
return p;
}
传入要分配的内存堆的大小,并且memset为0。
2.动态内存池分配策略:某种内存池的大小是固定的,分配该类只需要提供分配的pool个数,多种类型的pool连续放置,分配释放效率高,内存碎片少,但是会造成内存浪费。
LwIP中最重要的,就是数据包的传输,数据包的存储用pbuf,pbuf结构体:
LwIP由pbuf组成的链表来存储数据,每个pbuf结构体包括:指向下一个pbuf结构体的next指针,payload指针指向数据。len为当前pbuf结构体数据的长度,tot_len为该pbuf节点后,剩余的数据长度。type就是pbuf的类型。
pbuf的类型有四种:PBUF_RAM,PBUF_ROM,PBUF_REF,PBUF_POOL
1.PBUF_RAM:
使用mem_malloc分配,大小包括头部,offset(存放tcp头和ip头),以及数据长度。
分配的结构:
2.PBUF_POOL:
2.PBUF_ROM和PBUF_REF:
都是调用mem_molloc分配一个pbuf指针: