APP下载

嵌入式TCP/IP协议LwIP的内存管理机制研究

2012-11-26蔡雄飞王新华郭淑琴

关键词:网络接口发送数据管理机制

蔡雄飞,王新华,郭淑琴

(1浙江工业大学信息工程学院,浙江杭州310023;2浙江科技学院信息与电子工程学院,浙江杭州310023)

0 引言

嵌入式系统中广泛采用的网络协议栈一般是作为嵌入式操作系统内核的一部分,应用中只需要在系统内核配置标中标记使用即可,但这些商用操作系统高昂的版权费不利于初期的开发。LwIP(Lightweight Internet Protocol)是瑞士计算机科学院的Adam Dunkels等开发出来的一套用于嵌入式系统的开源TCP/IP协议栈,可以方便地移植于各种开源的嵌入式操作系统。LwIP的主要特点是在保证了TCP/IP协议基本功能模块的基础上,减少了对RAM的占用,一般只需要几十KB的RAM就可以运行[1]。目前,最新的LwIP已经发展到了1.4.0版。本文主要分析和研究了LwIP协议栈的内存管理机制,并设计出了网络接口层的主收发程序。

1 LwIP的数据缓存方式

LwIP采用pbuf(packet buffer)结构和pbuf链来管理数据包。pbuf结构既能在动态内存分配下保存信息包的数据,也能够让信息包数据驻留在静态存储区,通过结构中的*prev和*next指针将存储数据包信息的各个pbuf结构“连接”起来,在逻辑上构成一个pbuf链。pbuf链实现了使物理上呈分散存储的数据能够在逻辑上连续读写,这样就减少了频繁的数据拷贝和内存分配操作。LwIP管理内存的pbuf结构为[2,3]:

pbuf具有PBUF_POOL、PBUF_ROM和PBUF_RAM 3种类型,结构中的flags成员变量即用来标识它的类型。由于分配一个pbuf的操作可以快速完成,PBUF_POOL主要用于网络设备驱动层,适合用于中断处理。当应用程序要发送的数据位于应用程序管理的存储区时,则会分配PBUF_ROM类型的pbuf。而PBUF_RAM类型的pbuf主要用于应用程序发送的数据由动态生成的情况下。此时,pbuf系统不仅可以为应用数据分配内存,还会为待发送数据预分配包头内存空间。

2 LwIP的内存管理机制

LwIP的内存管理能够适应大小变化的接收或发送缓冲区,其范围从包含几百字节数据的TCP段缓冲区到仅仅包含几个字节的ICMP回报。

2.1 数据包的发送

当应用层要发送的数据位于外部存储区时,将会分配到PBUF_ROM。外部存储区是指不由TCP/IP协议管理和操作的存储区,它可以是应用程序管理的存储器为用户数据分配的缓存,也可以是ROM区域,如静态网页中的字符串常量等。由于应用程序交付给协议栈的数据不能被改动,因此就需要动态地分配一个PBUF_RAM类型的pbuf来装载各层协议的首部,然后将PBUF_RAM(存储首部)添加到PBUF_ROM(存储数据)的前面,这样就构成了一个完整的数据分组。由此可见,承载数据包的pbuf链可以包含不同类型的pbuf结构[4]。如图1(a)所示,PBUF_ROM的数据指针payload指向外部存储区。

图1 发送数据时的pbuf

如图1(b)所示,当应用程序待发送的数据是动态生成时,系统分配若干个PBUF_RAM类型的pubf,组成一条pbuf链。PBUF_RAM类型的pbuf在事先划分好的内存堆中分配。每个被分配的存储块附带了一个小结构,该结构的两个指针(*prev和*next)分别指向相邻的内存块。根据要添加的各层报头大小,在分配PBUF_RAM时会预留相应大小的空间用于包头填充。used标识位用来指示该内存块的分配情况,阴影部分表示已经被分配了,此时used为1。当需要一块N字节的存储块时,就对整个存储堆进行搜索。如果找到一块未用的(used=0)并且容量不小于N字节的区域就表示分配成功,并且置used为1。根据LwIP内存分配与回收利用的原则,设计了实现网络接口层数据发送的主函数low_level_output()。

该函数包含两个参数,分别是管理待发送数据的pbuf以及用于发送数据的逻辑网络接口netif。mem_malloc()根据pbuf结构中tot_len成员变量的值,为待发送数据分配相应大小的发送缓冲区。

2.2 数据包的接收

如图2所示,当网络接口层读取到网络控制器接收缓冲区有数据到来时,遍立即获得数据包的包头并调用GetInputPacketLen()函数获得帧长,然后根据帧长分配若干大小适中的PBUF_POOL类型的pbuf组成一个pbuf链,将接收缓冲区的数据拷贝到链中。

图2 接收数据时的pbuf

PBUF_POOL是具有固定容量的pbuf,为网络接口层收到的数据包分配缓存。在协议栈管理的内存中初始化了一个pbuf池(PBUF_POOL),具有相同尺寸的pbuf都是从这个pbuf池中分配得到的。在网络接口层,真正实现数据接收的函数是low_level_inpu()。

在检测到硬件网络接口ethernetif有数据待接收时,pbuf_alloc()分配len大小的内存空间,以pbuf逻辑链的形式将数据保存到内存中再进行校验、去包头、提取源地址信息等操作。

3 实验结果

实验采用了Keil公司基于Cortex-M3内核的MCBTMPM360开发板来验证上述基于该内存管理机制的底层网络接口收发模块的有效性。该开发板配有一颗东芝TMPM364F10FG芯片,具有64KB大小的RAM和1M的Flash存储空间,各项硬件资源满足实验要求。实验前在LwIP的相关文件中对目标板的IP 地址进行静态配置(如设为192.168.1.3),使用C 类私用地址192.168.1.0网段,使其与PC 的IP地址192.168.1.6在同一网段。然后把协议栈和修改后的与硬件相关的配置文件、SimpleSvr(一种用于测试的简单Web服务器程序)下载到目标板的Flash上。将PC机与开发板通过RJ45接口用超五类非屏蔽双绞线连接起来。实验第一步首先使用Ping命令,验证目标板与PC之间的网络链路能否连通。为进一步验证该协议栈工作的有效性,在PC机的Web浏览器地址栏中键入目标板的IP地址,申请访问目标板Web服务器上一个简单的Htm l页面。实验结果如图3所示。

图3 实验结果

实验结果表明,该协议栈工作稳定,文中提出的基于该内存管理机制的网络收发模块能够完成基本的网络应用,实现了预期的结果,为后续的嵌入式网络应用开发打下了基础。

4 结束语

本文研究了轻量级嵌入式TCP/IP协议栈LwIP的内存管理机制,给出了适用于存储资源有限的嵌入式系统网络接口层的主收发程序模型,并对其有效性进行了实验测试,测试结果满意。为LwIP协议栈在μC/OS-II嵌入式实时操作系统上的移植以及最终设计出Cortex-M3平台上基于μC/OS-II&LwIP的嵌入式Web服务器具有重要意义[5]。

[1] 孙乐明,江来,代鑫.嵌入式TCP/IP协议栈LWIP的内部结构探索与研究[J].电子元器件应用,2008,3(10):26-28.

[2] Savannah Inc.Design and Implementation of the LwIP TCP/IP Stack[EB/OL].http://savannah.nongnu.org,2007-06-12.

[3] 马争鸣,张成言.TCP/IP原理与应用[M].北京:冶金工业出版社,2006:121-124.

[4] 付晓军,夏应清,何轩.嵌入式LwIP协议栈的内存管理[J].电子技术应用,2006,8(3):56-57.

[5] Jeremy Bentham.陈向群译.嵌入式Web服务器TCP/IP Lean[M].北京:机械工业出版,2003:78-82.

猜你喜欢

网络接口发送数据管理机制
试论工程造价管理机制的完善与创新
建立有效的管理机制奠定坚实的人力资源基础
关于软科学质量管理机制的问题探讨
工电道岔结合部联合管理机制的探讨
一种车载自组织网络的媒体接入控制协议
基于马尔科夫链的LoRaWAN网络节点性能分析
带标记方式的CRDSA++协议性能分析*
双冗余网络接口自动切换测试模块的设计与实现
使用IPSec安全传输数据
浅析CTC与GSM-R系统网络接口及路由配置改进措施