嵌入式操作系统VxWorks中网络协议存储池原理及实现

上传人:l****6 文档编号:38060501 上传时间:2018-04-26 格式:DOC 页数:4 大小:29KB
返回 下载 相关 举报
嵌入式操作系统VxWorks中网络协议存储池原理及实现_第1页
第1页 / 共4页
嵌入式操作系统VxWorks中网络协议存储池原理及实现_第2页
第2页 / 共4页
嵌入式操作系统VxWorks中网络协议存储池原理及实现_第3页
第3页 / 共4页
嵌入式操作系统VxWorks中网络协议存储池原理及实现_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《嵌入式操作系统VxWorks中网络协议存储池原理及实现》由会员分享,可在线阅读,更多相关《嵌入式操作系统VxWorks中网络协议存储池原理及实现(4页珍藏版)》请在金锄头文库上搜索。

1、1嵌入式操作系统 VxWorks 中网络协议存 储池原理及实现摘 要 本文讨论了网络协议存储池的基本原理和在嵌入式操作系统中的实现方法。为在嵌入式系统中实现 TCPIP 协议栈,提供了一种有效、简洁、可靠的缓冲区管理。关键词 VxWorks; mBlk; clBlk; 网络协议存储池VxWorks 操作系统是美国 WindRiver 公司于 1983 年设计开发的一种嵌入式实时操作系统(RTOS)。它以良好的持续发展能力、高性能的内核以及卓越的实时性被广泛的应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。VxWorks 操作系统有着优越的网络性能,而缓冲区的数据拷贝是影响网络

2、性能的主要因素。众所周知,缓冲区在网络协议栈中有两个作用:第一,提供载体,使分组或报文可以在各协议层中流动;第二,为各级缓冲区提供空间。缓冲区的设立使得 TCPIP协议栈支持异步 IO 操作,异步操作对于协议栈的 I0 性能是非常重要的。在网络输出的过程中每一层需要在数据的首部或者尾部添加数据头和数据尾来对数据进行封装使得接收端对应的层能够进行正确的接收,在输入的过程中每层都需要将本层的数据头和数据尾去掉而最终还原成发送端发送的数据。上述的封装去封装和拷贝操作使得网络协议对内核的存储器管理能力提出了很多要求。这些要求包括能方便地操作可变长缓存,能在缓存头部和尾部添加数据(如低层封装来自高层的数

3、据),能从缓存中移去数据(如当数据包向上经过协议栈时要去掉首部),并能尽量减少这些操作所作的数据复制。21 使用 netBufLib 管理存储池的基本原理网络协议存储池使用 mBlk 结构、clBlk 结构、簇缓冲区和 netBufLib 提供的函数进行组织和管理。mBlk 和 clBlk 结构为簇缓冲区(cluster)中数据的缓冲共享和缓冲链接提供必要的信息。netBufLib 例程使用 mBlk 和 clBlk 来管理 cluster 和引用cluster 中的数据,这些结构体中的信息用于管理 cluster 中的数据并且允许他们通过引用的形式来实现数据共享,从而达到数据“零拷贝”的目的

4、。1.1 结构体 mBlk 和 clBlk 及其数据结构mBlk 是访问存储在内存池中数据的最基本对象,由于 mBlk 仅仅只是通过 clBlk来引用数据,这使得网络层在交换数据时就可以避免数据复制。只需把一个 mBlk连到相应 mBlk 链上就可以存储和交换任意多的数据。一个 mBlk 结构体包括两个成员变量 mNext 和 mNextPkt,由它们来组成纵横两个链表:mNext 来组成横的链表,这个链表中的所有结点构成一个包(packet);mNextPkt 来组成纵的链表,这个链表中的每个结点就是一个包(packet),所有的结点链在一起构成一个包队列,如图 1 所示。图 1 包含两个数

5、据包的 mBlk 链结构体 mBlk 和 clBlk 的数据结构如下所示:struct mBlk M_BLK_HDR mBlkHdr; /* header */ M_PKT_HDR mBlkPktHdr; /* pkthdr */ CL_BLK * pClBlk; /* pointer to cluster blk */ M_BLK; struct clBlk CL_BLK_LIST clNode;/* union of next clBlk */ UINT clSize;/* cluster size */3int clRefCnt;/*countof the cluster */ stru

6、ct netPool * pNetPool; /* pointer to the netPool */ CL_BLK; /* header at beginning of each mBlk */ struct mHdr struct mBlk * mNext;/* next buffer in chain */struct mBlk * mNextPkt;/* next chain in queue/record */ char *mData; /* location of data */ int mLen;/* amount of data in this mBlk */ UCHAR mT

7、ype;/* type of data in this mBlk */ UCHAR mFlags; /* flags; see below */ M_BLK_HDR; /* record/packet header in first mBlk of chain; valid if M_PKTHDR set */ struct pktHdr struct ifnet * rcvif;/* rcv interface */ int len; /* total packet length */ M_PKT_HDR;1.2 网络协议存储池的初始化VxWorks 在网络初始化时给网络协议分配存储池并调用

8、 netPoolInit()函数对其初始化,由于一个网络协议通常需要不同大小的簇,因此它的存储池也必须包含很多簇池(每一个簇池对应一个大小的簇)。如图 2 所示。另外,每个簇的大小必须为 2 的方幂,最大可为 64KB(65536),存储池的常用簇的大小为64,128,256,512,1024 比特,簇的大小是否有效取决于 CL_DESC 表中的相关内容,CL_DESC 表是由 netPoolInit()函数调用设定的。图 2 网络协议存储池初始化后的结构1.3 存储池的链接及释放存储池在初始化后,由 netPool 结构组织几个下一级子池:一个 mBlk 池、一个clBlk 池和一个 clu

9、ster 池。mBlk 池就是由很多 mBlk 组成的一条 mBlk 链;clBlk池就是由很多 clBlk 组成的一条 clBlk 链。cluster 池由很多的更下一级 cluster 子4池构成,每一个 cluster 子池就是一个 cluster 链。每一个 cluster 链中的所有 cluster的大小相同,不同链中的 cluster 大小不同。但要实现不同进程访问同一簇而不需要作数据的拷贝,还需要把 mBlk 结构,clBlk 结构和簇结构链接在一起。创建这三级结构一般要遵循这样五步:a.调用系统函数 netClusterGet()预定一块簇缓冲区;b.调用系统函数 netClB

10、lkGet()预定一个 clBlk 结构;c.调用系统函数 netMblkGet()预定一个 mBlk 结构;d.调用系统函数 netClBlkJoin()把簇添加到 clBlk 结构中;e.调用系统函数 netMblkClJoin()把 clBlk 结构添加到 mBlk 结构中。这样,就构成了最后的缓冲区。在缓冲区中的数据使用完毕后要及时的释放内存,这一过程只需要调用系统函数 netMblkC1ChainFree()释放存有数据的 mBlk 链表。例如当数据向上层传送时,在本层中可以释放已经不再使用的 mBlk 链表,由于在 clBlk 中记录着指向本模块的 mBlk 的个数,虽然释放了 m

11、Blk 链表,但是这并不表示将 cluster 中的数据释放掉了,上层复制的链表仍然控制着这些数据,直到 clBlk 中的 mBlk 计数为 0 时才真正的将数据占用的簇释放掉,将数据占用的内存空间释放、归还给系统将来使用。2 网络协议存储池与数据的封装处理VxWorks 操作系统之所以采用 mBlkclBlkcluster 这样的网络数据存储结构,目的就是减少数据拷贝的次数,提高网络数据的传输速率。图 3 存储带有 1460 个字节数据的 mBlk在网络输出的过程中当从上层向下层传递数据时,下层协议需要对数据进行封5装使得接收端对应的层能够进行正确的接收。下面通过实例分析网络数据的封装过程。

12、例如要在如图 3 所示的 mBlk 链中添加 IP 和 UDP 的首部。在 mBlk 链表中封装数据的方法是分配另外一个 mBlk,把它放在链首,并将分组首部复制到这个 mBlk。IP 首部和 UDP 首部被放置在新 mBlk 的最后,这个新mBlk 就成了整个链表的首部。如果需要,它允许任何其它低层协议(例如添加以太网首部)在 IP 首部前添加自己的首部,不需要再复制 IP 和 UDP 首部。在第一个 mBlk 中的 mBlkHdr.mData 指针指向首部的起始位置,mBlkHdr.mLen 的值是28。在分组首部和 IP 首部之间有 72 字节的未用空间留给以后的首部,通过适当地修改 m

13、BlkHdr.mData 指针和 mBlkHdr.mLen 添加在 IP 首部的前面。注意,分组首部已经移到新 mBlk 中了,分组首部必须放在 mBlk 链表的第一个 mBlk 中。在移动分组首部的同时,在第一个 mBlk 设置 M_PKTHDR 标志。在第二个 mBlk 中分组首部占用的空间现在未用。最后,改变在此分组首部中的长度成员mBlkPktHdr.len,成员 mBlkPktHdr.len 的值是这个分组的 mBlk 链表中所有数据的总长度:即所有通过 mBlkHdr.mNext 指针链接的 mbuf 的 mBlkHdr.mLen 值的和。本例中由于增加了 28 个字节变成了 14

14、88。如图 4 所示。图 4 添加完 IP 和 UDP 首部的 mBlk这样,当报文在协议栈中流动时,不会拷贝报文链,而只需把指向 mBlk 的指针通过参数传递。当报文需要进人缓冲区时,也是通过链表的指针操作将报文插入或添加到队列中。3 结论网络协议存储池的职责有两个:为协议栈提供合适的缓冲区,如果太大会浪费系6统资源,太小会影响协议栈的吞吐量;提供合适的数据结构装载网络报文,既可以使协议栈方便地处理报文,又可以减少缓冲区拷贝的次数。减少拷贝次数不仅降低了 CPU 的负荷,还可以降低存储器的消耗。本文剖析了嵌入式操作系统VxWorks 中网络协议存储池的原理,实现了数据能够动态增删、但在逻辑上又呈现连续性的数据结构。能够满足在各协议层之间传递数据而不需要进行内存拷贝。参考文献1 翟东海,李力.mbuf 的实现原理剖析及其在网络编程中的应用J.计算机工程与应,2004(8):104-106.2 美DouglasEComer 著张娟等译用 TCPIP 进行网际互联第二卷:设计、实现与内核(第三版)M北京:电子工业出版社,200105.3 美GaryRWright WRichardStevens 著陆雪莹,蒋慧等译TCPIP 详解卷2:实现M北京:机械工业出版社200007:10504 Wind River System Inc.VxWorks Network

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号