TCP/IP是一种根据OSI参阅模型的分层网络体系结构,它由运用层、运送层、网络层、数据链路层、物理层组成。各层之间音讯的传递通过数据报的方式进行。因为各层之间报头长度不一样,当数据在不同协议层之间传递时,对数据进行封装和去封装、添加和删去操作将非常频频。
在嵌入式体系开发中也常常遇到类似问题。用户数据从本地嵌入式设备传输到长途主机的过程中,要通过各层协议,对音讯的封装、去封装和复制操作几乎是不行避免的。而一般所选用的用一段接连的内存区来存储、传递数据的做法会有以下的缺点:
(1)当从上层向基层传递数据时,基层协议需求对数据进行封装,而上层在请求内存时没有(也不应该)考虑基层的需求。这样会导致基层协议处理时需求从头请求内存并进行内存复制,然后影响程序的功率。
(2)当从基层向上层传递数据时,基层协议专有的数据结构应当对上层协议不行见。因而也需求从头请求内存并进行内存复制。
(3)跟着数据的逐层处理,其内容或许有所增减,而接连内存很难处理这种动态的数据增删。
因而,有必要有一种能习惯数据动态增删、但在逻辑上又出现接连性的数据结构,以满意在各协议层之间传递数据而不需求进行内存复制。嵌入式TCP/IP协议栈要求简略高效,并削减对内存的需求。这些都需求相应的内存办理机制完成。
1 LwIP协议栈中pbuf介绍
LwIP(Light weight IP)是瑞士计算机科学院Adam Dunkels等开发的一套用于嵌入式体系的开放源代码TCP/IP协议栈。LwIP可以移植到操作体系上,也可以在无操作体系的情况下独立运转。LwIP TCP/IP完成的重点是:在坚持TCP协议首要功能的基础上,削减对RAM的占用。这使LwIP协议栈适合在低端嵌入式体系中运用。
LwIP运用pbuf结构完成数据传递,它与BSD中的Mbuf很类似。pbuf的首要用途是保存在运用程序和网络接口间相互传递的用户数据。
pbuf的内部结构为:
struct pbuf{
struct pbuf *next; /*指向下一个pbuf*/
void *payload; /*指向pbuf数据中的开始方位*/
u16_t tot_len; /*该pbuf和后续pbuf中数据长度的总和*/
u16_t len; /*该pbuf中数据的长度*/
u16_t flags; /*pbuf的类型*/
u16_t ref; /*该pbuf被引证的次数*/
}2 LwIP内存办理的完成
在运转TCP/IP协议栈的嵌入式体系中,可以把整个体系的存储区域分为协议栈办理的存储器和运用程序办理的存储器两部分。
2.1 协议栈办理的存储器
协议栈办理的存储器是指TCP/IP内核可以操作的内存区域,首要用于装载待接纳和发送的网络数据分组。当接纳到分组或许有分组要发送时,TCP/IP协议栈为这些分组分配缓存;接纳到的分组交付给运用程序或许分组现已发送结束后,对分配的缓存收回重用。协议栈分配的缓存有必要能包容各种巨细的报文,例如从只是几个字节的ICMP答复报文到几百个字节的TCP分段报文。
LwIP中的pbuf有四种类型:PBUF_POOL、PBUF_RAM、PBUF_ROM、PBUF_REF。这四种类型的pbuf都是从TCP/IP协议栈办理的存储器中分配的,其间PBUF_ROM和PBUF_REF与运用程序办理的存储区域密切相关。
PBUF_POOL是具有固定容量的pbuf,首要供网络设备驱动运用,为收到的数据分组分配缓存。在协议栈办理的内存中初始化了一个pbuf池(PBUF_POOL),具有相同尺度的pbuf都是从这个pbuf池中分配得到。一般运用多个PBUF_POOL链接成一个链表,用于存储数据分组。如图1所示。
LwIP用一个宏界说一个PBUF_POOL的巨细。一个分组需求分配几个PBUF_POOL,而在数据较少时分配一个PBUF_POOL即可。因为分配一个PBUF_POOL类型的pbuf很快,适合在中止处理中运用,所以PBUF_POOL首要供网络设备驱动运用,为收到的数据分组分配缓存。