lwip源码分析3----嵌入式LwIP协议栈的内存管理
2010年12月30日
摘要:在内存需求分析的基础上,阐述了LwIP TCP/IP协议栈中pbuf结构的基本原理和内存管理机制的实现。这对在嵌入式系统中实现TCP/IP协议栈,进行网络连接有重要意义。
关键词:TCP/IP协议LwIP协议栈内存管理pbuf结构
目前,在嵌入式系统中引入TCP/IP协议栈及将嵌入式设备接入网络,已经成为嵌入式领域重要的发展方向。
TCP/IP是一种基于OSI参考模型的分层网络体系结构,它由应用层、运输层、网络层、数据链路层、物理层组成。各层之间消息的传递通过数据报的形式进行。由于各层之间报头长度不一样。当数据在不同协议层之间传递时.对数据进行封装和去封装、增加和删除操作将十分频繁。
在嵌入式系统开发中也经常遇到类似问题。用户数据从本地嵌入式设备传输到远程主机的过程中,要经过各层协议,对消息的封装、去封装和拷贝操作几乎是不可避免的。而通常所采用的用一段连续的内存区来存储、传递数据的做法会有以下的缺陷: (1)当从上层向下层传递数据时,下层协议需要对数据进行封装,而上层在申请内存时没有(也不应该)考虑下层的需要。这样会导致下层协议处理时需要重新申请内存并进行内存拷贝,从而影响程序的效率。
(2)当从下层向上层传递数据时,下层协议专有的数据结构应当对上层协议不可见。因此也需要重新申请内存并进行内存拷贝。
(3)随着数据的逐层处理,其内容可能有所增减,而连续内存很难处理这种动态的数据增删。
0
因此,必须有一种能适应数据动态增删、但在逻辑上又呈现连续性的数据结构,以满足在各协议层之间传递数据而不需要进行内存拷贝。嵌入式TCP/IP协议栈要求简单高效,并减少对内存的需求。这些都需要相应的内存管理机制实现。
1 LwIP协议栈中pbuf介绍
LwIP(Light weight IP)是瑞士计算机科学院Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwlP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是:在保持TCP协议主要功能的基础上,减少对RAM的占用。这使LwIP协议栈适合在低端嵌入式系统中使用。
LwIP利用pbuf结构实现数据传递,它与BSD中的Mbuf很相似。pbuf的主要用途是保存在应用程序和同络接口间互相传递的用户数据。
2 LwIP内存管理的实现
在运行TCT/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_P00L),具有相同尺寸的pbuf都是从这个pbuf池中分配得到。一般使用多个PBUF_POOL链接成一个链表,用于存储数据分组。如图1所示。
LwIP用一个宏定义一个PBUF_P00L的大小。一个分组需要分配几个PBUF_POOL,而在数据较少时分配一个PBUF_POOL即可。由于分配一个PBUF_P00L类型的pbuf很快,适合在中断处理中使用,所以PBUF_POOL主要供网络设备驱动使用,为收到的数据分组分配缓存。
应用程序发送动态产生的数据时.可以用PBUF_RAM类型的pbuf。PBUF_RAM在事先划分好的内存堆中分配。对该内存堆的操作类似于C语言中的malloc/free。内存堆分配的结构如图2所示。图2中每个被分配的存储块附带了一个小结构,该结构的两个指针指向相邻的内存块。used标识位用来指示该内存块的分配情况,阴影部分表示已经被分配了,此时used为1。当需要一块N字节的存储块时,就对整个存储堆进行搜索。如果找到一块未用的(used=O)并且容量不小于N字节的区域就表示分配成功,并且置used为1。而分配的内存块使用完后需要释放,为了不产生碎片,相邻且未用的内存块需要进行合并。
PBUF_P00L和PBUF_RAM都可以根据需要从存储器中动态分配,这种分配机制又称为动态存储器分配机制。该分配机制不仅能为应用程序的数据分配存储空间,而且能为协议首部分配存储空间。在层与层之间传递数据时,真正需要修改的只是数据的格式,使之符合各层的规范,而数据本身不需要变动。实际上数据格式反应的是各层的首部,当数据在各层之间传送时,需要动态地添加和移去相应的首部,用动态分配机制可以很好地实现。
2.2 应用程序管理的存储器
应用程序管理的存储器是指应用程序管理、操作的存储区域.一般从该区域为应用程序发送数据分配缓存。虽然该存储区域不由TCP/IP协议栈管理,但在不严格分层的协议栈中,该存储区域必须与TCP/IP管理的存储器协同工作。为节省内存,LwIP不采取分级访问模式,而是通过指针访问数据。这样就不需要为数据的传递分配存储空间。应用程序发送的数据在交付LwIP后,LwIP就认为这些数据是不能被改动的,因此应用程序的数据被认为是永远存在并且不能被改变的。这一点与ROM很相似.类型名PBUF_ROM也由此而来。
如图3所示,PBUF_ROM的数据指针payload指向External memory(外部存储区)。Extemal memory指不由TCP/IP协议栈管理的存储区,它可以是应用程序管理的存储器为用户数据分配的缓存,也可以是ROM区域,如静态网页中的字符串常量等。由于由应用程序交付的数据不能被改动,因此就需要动态地分配一个PBUF_RAM来装载协议的首部,然后将PBUF_RAM(首部)添加到PBUF_ROM(数据)的前面。这样就构成了一个完整的数据分组。
图3中的PBUF_ROM还可以是PBUF_REF。PBUF_REF和PBUF_ROM的特性非常相似,都可以实现数据的零拷贝。但是当发送的数据需要排队时就表现出PBUF_REF的特性了。例如在发送分组时,待发送的分组需要在ARP队列中排队,假如这些分组中有PBUF_ROM类型的pbuf,则说明该类型pbuf中的数据位于应用程序的存储区域,是通过指针被PBUF_ROM引用的。这样直到分组被处理之前,被引用的应用程序的这块存储区域都不能另作它用。在此情况下要用到PBUF_REF类型的pbuf。在排队时,LwIP会为PBUF_REF类型的pbuf分配缓存(PBUF_POOL或PBUF_RAM),并将引用的应用程序的数据拷贝到分配的缓存中。这样应用程序中被引用数据的存储区域就能被释放。
pbuf结构实现了层与层之间的数据传递,但其非常消耗内存,并且需要TCP/IP协议栈为之分配存储空间,例如协议控制udp_pcb、tep_pcb等。通常,嵌入式TCP/IP协议栈都不是严格分层的,尽量减少对内存的需求是实现嵌入式TCP/IP的重点,内核的内存管理机制直接关系到嵌入式TCP/IP协议栈的性能。
转http://blog.chinaunix.net/u3/99423/showart_2144022.html
发表评论
-
多线程渲染(Multithreaded- rendering)3D引擎实例分析 : FlagshipEngine
2012-01-20 08:48 625多线程渲染(Multithreaded- rendering) ... -
Android最佳实践
2012-01-20 08:47 557Android最佳实践 2010年08 ... -
Windows Socket IO 模型【转帖】
2012-01-20 08:47 684Windows Socket IO 模型【转帖】 2011年 ... -
基于管道化和事件驱动模型的Web请求处理(二)
2012-01-20 08:47 331基于管道化和事件驱动模型的Web请求处理(二) 2010年1 ... -
LINUX设备驱动(十七)---中断(二)
2012-01-20 08:47 641LINUX设备驱动(十七)---中断(二) 2010年10月 ... -
2010-11-15
2012-01-19 13:53 4942010-11-15 2010年11月15日 ... -
2011-1-20
2012-01-19 13:53 7052011-1-20 2011年01月20日 ... -
电脑蓝屏自动关机故障的检修方法
2012-01-19 13:53 702电脑蓝屏自动关机故障的检修方法 2011年09月23日 ... -
VB fso组件
2012-01-19 13:52 535VB fso组件 2011年03月11日 fso 是系统 ... -
vb读取txt文件到textbox (一)
2012-01-19 13:52 1397vb读取txt文件到textbox (一) 2011年05月 ... -
虚拟内存用硬盘空间做内存来弥补计算机RAM空间的缺乏
2012-01-17 03:42 798虚拟内存用硬盘空间做内存来弥补计算机RAM空间的缺乏 201 ... -
怎样提高电脑的运行速度
2012-01-17 03:42 640怎样提高电脑的运行速 ... -
电脑为什么老是出现虚拟内存不足
2012-01-17 03:42 728电脑为什么老是出现虚拟内存不足 2011年03月05日 ... -
系统内存蓝屏的错误代码 - 解决方案
2012-01-17 03:42 724系统内存蓝屏的错误代 ... -
作文评语大全
2012-01-16 02:17 585作文评语大全 2009年11 ... -
作文批改评语
2012-01-16 02:17 477作文批改评语 2010年05 ... -
作文个性化评语浅析
2012-01-16 02:17 602作文个性化评语浅析 2010年04月30日 [/b] ... -
作文批改评语范例
2012-01-16 02:16 494作文批改评语范例 2011 ... -
写作文评语
2012-01-16 02:16 584写作文评语 2011年04月27 ...
相关推荐
lwip源码分析1------综述及设备驱动层 lwip源码分析2----ARP lwip源码分析3----嵌入式LwIP协议栈的内存管理 。。。
经典的LWIP嵌入式开发书籍,适合对TCP/IP的入门学习,并进行嵌入式TCP/IP协议栈的移植及开发。
老衲五木的LwIP协议栈源码详解 -TCP/IP 协议的实现
LwIP协议栈源码详解.pdf
Lwip协议栈是嵌入式中最常用的协议栈,本资源可以包括LwIP协议栈的设计与实现_中文 与 LwIP协议栈源码详解资料。
lwip源码 lwip-1.4.1 公司已经实战过,望大家下载学习。
lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。
压缩包文件: 1.嵌入式网络的那些事:LwIP协议深度剖析与实战演练 一书对应的两个版本的电子书,一个是可以复制的清晰版(推荐),网上下载不到,一个是扫描版电子书,网上普遍是这个。...3.LwIP协议栈源码详解
lwip协议栈源码详解.pdf 里面详细的解绍了LwIP协议栈的工作原理,内存分配方式,接口管理,常见的网络协议
lwip-2.0.3协议栈源码,适合有一定基础的开发人员使用。
Lwip协议栈在嵌入式Linux下的移植与实现.pdf
lwip1.4.1协议栈源码,对于TCP/IP开发有用
lwIP-1.4.1 TCP/IP协议栈中关于内存管理的一点记录与总结,可作为移植开发中的一个参考手册。
嵌入式网络中常用的TCP/IP协议实现Lwip协议栈分析,适合刚刚学完计算机网络,想要深入了解TCP/IP协议的相关人员
LWIP实现的重点是减少内存的使用和代码的大小,这使LWIP协议栈适合在低端的嵌入式系统中使用。 为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。LwIP是Light Weight (轻型)IP协议,...
lwip协议栈源码分析,网上找到,非原创,请尊重原始作者