lwip中pbuf_alloc()内存申请PBUF_POOL﹑PBUF_ROM和PBUF_RAM分析
- UID
- 1029342
- 性别
- 男
|
lwip中pbuf_alloc()内存申请PBUF_POOL﹑PBUF_ROM和PBUF_RAM分析
p = pbuf_alloc(PBUF_LINK, len, PBUF_POOL); 在网卡硬件中断里面为len长度的包申请一个PBUF_POOL类型的pbuf,p是一个链表,链表上p->next每一个元素所能存储的数据长度为len,数据存储起始位置为payload
三种类型有不同的使用。 PBUF_POOL主要被网络设备驱动程序使用,因为对操作系统来说分
配单一的pbuf速度较快并且适合用于中断管理(suitable foruse in an interrupt handler)。 当应用
程序发送位于被应用程序管理的存储区的数据时, PBUF_ROM被使用。 在pbuf被移交到TCP/IP
栈后,数据不能修改,因此这一pbuf类型,这类型主要用于数据位于ROM时(因此名称为
PBUF_ROM )。 PBUF_ROM pbuf中的数据可能会用到的头存储在PBUF_RAM pbuf中,它链接在
PBUF_ROM pbuf的前面,如图2所示。
当应用程序发送动态地产生的数据时,PBUF_RAM类型的Pbufs也被使用。 在这种情况下,
pbuf系统不光为应用数据分配存储空间,也为将要发送的数据的报头准备空间。如图1所示。
pbuf系统不能预先知道为将要发送的数据准备什么样的报头,并且假定最坏的情况。报头大小
在编译时可动态配置。
实质上,进入pbufs的是PBUF_POOL类型,离开pbufs的是PBUF_ROM或PBUF_RAM类型。
pbuf的内部的结构如图1~3。 pbuf结构包括两个指针,两长度域,一个flags域,和一参考
计数。pbuf链中next域是一个指向下一个pbuf的指针。Payload指针指向pbuf中的数据的起始位
置。len域包含pbuf的数据内容的长度。Tot_len域包含当前的pbuf的长度和在pbuf链中接下来
的pbufs的所有len领域的总数。换句话说,tot_len域是len域和pbuf链中的随后的pbuf中的
tot_len域的值的总和。flags域表明pbuf的类型,而ref领域包含一参考计数。 Next和payload
域是内部指针和依赖于处理器体系结构的数据大小。 两个长度域为16位无符号整形, flags和ref
域均为4bit宽。pbuf结构整个的大小取决于所使用的处理器体系结构中一个指针的大小及可能
的最小alignment的大小。 在带有32位指针和4个字节alignment的体系结构,整个的大小为16
字节,16位指针和1个字节alignment的体系结构上,大小是9个字节。 |
|
|
|
|
|