vxworks网络协议栈

上传人:xzh****18 文档编号:34699260 上传时间:2018-02-27 格式:DOC 页数:12 大小:145KB
返回 下载 相关 举报
vxworks网络协议栈_第1页
第1页 / 共12页
vxworks网络协议栈_第2页
第2页 / 共12页
vxworks网络协议栈_第3页
第3页 / 共12页
vxworks网络协议栈_第4页
第4页 / 共12页
vxworks网络协议栈_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《vxworks网络协议栈》由会员分享,可在线阅读,更多相关《vxworks网络协议栈(12页珍藏版)》请在金锄头文库上搜索。

1、嵌入式操作系统VxWorks 中网络协议存储池原理及实现周卫东 蔺妍 刘利强 (哈尔滨工程大学自动化学院,黑龙江 哈尔滨,150001)摘 要 本文讨论了网络协议存储池的基本原理和在嵌入式操作系统中的 实现方法。为在嵌入式系统中实现TCPIP协议栈,提供了一种有效、简洁、 可靠的缓冲区管理。关键词 VxWorks; mBlk; clBlk; 网络协议存储池VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入 式实时操作系统(RTOS)。它以良好的持续发展能力、高性能的内核 以及卓越的 实时性被广泛的应用在通信、军事、航空、航天等高精尖技术及实时性要求极 高的领域中。

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

3、些要求包括能方便地操作可变长缓存,能在缓存头部和 尾部添加数据(如低层封 装来自高层的数据),能从缓存中移去数据(如当数据 包向上经过协议栈时要去掉首部),并能尽量减少这些操作所作的数据复制。 1 使用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),所 有的结点链在一起

5、构成一个包队列,如图1所示。 图1 包含两个数据包的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 */int clRefCnt;/*countof the c

6、luster */struct 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

7、 */ UCHAR mType;/* 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池和

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

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

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

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

13、须放在mBlk链表的第一个mBlk中。在移动分组首部的同时,在第一个mBlk设置M_PKTHDR标志。在第二 个 mBlk中分组首部占用的空间现在未用。最后,改变在此分组首部中的长度 成员mBlkPktHdr.len,成员mBlkPktHdr.len的值是这个 分组的mBlk链表中 所有数据的总长度:即所有通过mBlkHdr.mNext指针链接的mbuf的 mBlkHdr.mLen值的和。本例中由于增加了 28个字节变成了1488。如图4所示。 图4 添加完IP和UDP首部的mBlk这样,当报文在协议栈中流动时,不会拷贝报文链,而只需把指向mBlk的 指针通过参数传递。当报文需要进人缓冲区时,

14、也是通过链表的指针操作将报 文插入或添加到队列中。 3 结论网络协议存储池的职责有两个:为协议栈提供合适的缓冲区,如果太大会 浪费系统资源,太小会影响协议栈的吞吐量;提供合适的数据结构装载网络报 文,既可以使 协议栈方便地处理报文,又可以减少缓冲区拷贝的次数。减少拷 贝次数不仅降低了CPU的负荷,还可以降低存储器的消耗。本文剖析了嵌入式 操作系统 VxWorks中网络协议存储池的原理,实现了数据能够动态增删、但在 逻辑上又呈现连续性的数据结构。能够满足在各协议层之间传递数据而不需要 进行内存拷 贝。 参考文献1 翟东海,李力.mbuf的实现原理剖析及其在网络编程中的应用J.计算机工 程与应,2

15、004(8):104-106. 2 美DouglasEComer著张娟等译用TCPIP进行网际互联第二卷: 设计、实现与内核(第三版)M北京:电子工业出版社,200105. 3 美GaryRWright WRichardStevens著陆雪莹,蒋慧等译TCPIP 详解卷2:实现M北京:机械工业出版社200007:1050 4 Wind River System Inc.VxWorks Network 收稿日期:8月25日 修改日期:9月2日VxWorks 任务追踪实例分析 VxWorks中如果稍有不慎,就可能导致task suspend,如果运气好,shell没 有被挂起,则可以通过系统的一些命令追踪一下挂起的原因。其中用到的主要 命令是i、tt、ti、d等。 首先从出错信息开始: 0xfc8125b8 (t_Lcd): memPartFree: invalid block 0xfdfc6f38 in partition 0xfe508894. 由于memPartFree了一个非法的内存块,导致了任务挂起,我们需要确定到底 是哪条语句导致了这个异常的产生,可能是什么原因引起的。 首先,需要通过“i”命令察看任务状态: - i NAME ENTRY TID PRI STATUS PC SP ERRNO

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

当前位置:首页 > 商业/管理/HR > 商业合同/协议

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