lyranet:嵌入式操作系统系统的一种零拷贝TCP/IP协议栈李云陈,蒋美玲信息管理部国家池南大学埔里台湾中华民国s1213526@ncnu.edu.tw,joanna@ncnu.edu.tw摘要在嵌入式系统中处理能力,内存,以及功率消耗这些资源总是有限,因此,嵌入式TCP/IP应设计成充分利用有限的资源。申请零拷贝机制,可以减少内存的使用以及CPU传输数据的处理时间,功率消耗也可减少。在本文中,我们提出零拷贝机制的设计和实施方案的目标是嵌入式TCP/IP的组成部分lyranet(来自Linux的TCP/IP的代码并被改造成一个可重用的软件)从操作系统和硬件中独立出来。性能评价表明,TCP/IP协议的处理开资可明显降低23-56.22%。此外,这个网络组件的对象代码的大小只有原始的Linux的TCP/IP协议栈的78%。这项研究的经验,可以作为嵌入Linux的TCP/IP协议栈成为一个指标体系的参考,并且提高零拷贝LinuxTCP/IP协议传输效率。1.导言由于互联网的爆炸,嵌入式系统要求加入互联网。TCP/IP协议是这个连接的核心技术。在为了适应有限的资源的嵌入式设备,一些商业产品实施TCP/IP协议栈以减少代码大小和CPU处理开销为目标的嵌入式系统。他们的代码不是自由索取。自从Linux开放源代码,此外,它很普遍的还具有稳定性,可靠性,高性能,以及很好的文件,这些优势让利用现有的开放的源代码和整合的LinuxTCP/IP协议栈[6]变成一个目标作业系统成为一个符合成本效益的方法。不过,由于Linux是一块铁板内核,Linux的TCP/IP协议栈不是一个单独的组件它和其他Linux内核的功能,如档案系统,装置驱动程序和内核的核心有着密切的关系并且相互作用。这增加在指标体系中重用Linux的TCP/IP协议栈的困难。此外,对于嵌入式系统的特别需要,直接移植Linux的TCP/IP协议栈成为一个目标操作系统也不是最好的执行情况。特别是,在嵌入式系统中处理能力,内存,以及功率消耗这些资源总是有限。举例来说,LinuxTCP/IP协议代码的数据传输适合一般用途、共同资源丰富的台式电脑的操作系统。传输数据总是从用户缓冲区复制到内核缓冲区,然后从内核缓冲区发送到网络接口卡(NIC)。收到的数据从NIC带到内核网的缓冲区,然后从内核网络缓冲区复制到用户缓冲区。这些数据复制操作需要CPU的处理时间也增加了开销。因此,对于嵌入式系统TCP/IP协议的执行,应尽量减少数据量复制,以减少能量消耗和提供高回应的效率。零拷贝[2]是一个网卡中的数据直接接收到用户缓冲区而用户缓冲区的数据直接发送到网卡的机制。在用户缓冲器和内核缓冲区之间没有数据需要被复制。零拷贝的执行需要虚拟内存的操作,如页面重映和硬件设备支持,如DMA控制器。必须保证TCP/IP数据传输的一致性。此外,由于虚拟内存操作和DMA需要实施零拷贝,通过网络接收或发送数据的内存缓冲器须受到限制。因为设备不支持DMA操作,从网卡到用户的缓冲区或从用户的缓冲到网卡的数据复制仍是需要的。因为重用Linux的TCP/IP代码,我们已我们以前的的研究中提取TCP/IP协议栈。这是当时作为一个独立于作业系统和硬件的软件组件所实施的,叫做lyranet。在组件的设计原则的基础上,[1],可以得到模块化,可重构,构件更换和再利用的优势。作为一个自成一体的组成部分来实施的TCP/IP协议栈,需要修改Linux的TCP/IP的代码,将它们从其他核心职能和整合Linux的TCP/IP协议目标操作系统的执行内核支持模块分开。为了使lyranet适应嵌入式系统,要求减少协议处理开销,内存使用,功率消耗。在本文中,我们的重点提出零拷贝机制,当将数据发送到网络时通过传送用户数据缓冲区的地址,和从网络中接收数据时逐页重,来减少TCP/IP传输的数据复制操作。此外,NIC的操作者需要修改融入零拷贝机制。在用消除复制到lyraos(基于组件的嵌入式操作系统)整合lyranet后,性能评价表明TCP/IP协议处理开销可降低23-56.22%。表1实验平台2.lyraos和lyranetlyraos是一个基于组件的操作系统,它的目的是作为一个研究工具操作系统服务,并提供了一套为互联网的个人电脑,手提式电脑,嵌入式系统等精心设计的、明确界面的系统软件组件。它主要是在C++和少数集中代码中实施。它设计来概括电脑系统的硬件资源,如低层次机的依赖层明显是从高层次机系统的语义剪切的。因此,它可以很容易地移植到不同的硬件体系结构[3]。如图1所示lyraos系统的体系结构。每个系统组件是完全独立的,自我控制,和高度模块化的。它除了是一个重量轻的系统软件,还是一个时间共享多线程微内核。线程可以被动态地创建和删除,线程的优先次序可以被动态改变。它提供了一个有先买权的优先时间安排并支持信号,信号量,和信息之间的线程的各种机制。再加上提供微内核(有着Windows操作系统的外观和感觉微型窗口)。此外,lyrafile组件(一个重量轻,基于vfat文件系统)既支持基于RAM也支持基于磁盘的货仓。特别是,lyraos提供Linux设备驱动仿真环境来使用Linux的设备驱动程序。在这种环境下,Linux设备驱动代码可以未作修改的融入lyraos。该lyranet[4]组件是一个来自Linux的TCP/IP代码的[6]TCP/IP协议栈。我们充分的使用Linux开放的源代码,主要是为减少我们发展的难度。然后,我们把它作为一个可重用的,独立于操作系统和硬的件软件组件来改造它。我们的工作主要包括:重塑Linux的TCP/IP协议栈,把它从档案系统分裂出来,实施对内核和设备的包装独立开来,并提供兼容插座接口的包装。3.性能评价本节介绍安装了lyra操作系统的应用复制消去技术的lyranet的性能评价。表1给出了我们的实验平台,我们使用模拟的嵌入式系统,在其中的两台电脑连接在一个专用网络,以避免影响外部网络的通信。应用ttcp[7]基准,并且协议处理和网络驱动器运行的处理时间是有限制的。总的数据长度设置为PIO网卡26280k字节和DMA的NIC131400k字节。3.1。比较对象的代码大小从表2可以看出,应用复制消除技术的lyranet的基础代码的规模是Linux的TCP/IP协议栈的78%。加入复制消除机制之后,只增加lyranet1.1到1.7%的目标代码。3.2。发送数据性能我们发送数据的大小为1460字节的整数倍。图5给出了lyranet应用复制消除级之后,该协议的性能的改善51.34-56.22%。当应用DMA的网卡时,虽然加入复制消除机制的驱动程序的处理时间增加,但是总处理时间仍是下跌27.7-50%。由于快速的DMA控制器,驱动程序处理是高效的,不是总处理时间的主要部分时,DMA的网卡是适用的。此得出结论认为,当数据复制占总处理时间的主要部分时,复制消除是有利的。当使用PIO网卡时,由于PIO的特性,驱动处理时间成为总处理时间非常大的部份。因为协议的处理时间减少了,复制消除的总的处理时间仍是略有下降3.3。接收数据性能我们把处理时间分为三个部分:NIC的驱动程序的执行时间(例如ei_interrupt()或boomerang_interrupt()),接收数据主要协议的代码,(例如fromnet_bh()tcp_rcv()),和系统调用处理代码(例如fromsys_recv()tcp_recvmsg())。在Linux的源代码中,从网卡收到的传入的数据包在NIC在中断服务程序中进行(ISR),那么ISR给net_bh做标记来激活底部的一半处理,例如net_bh()。大部分接受协议的处理是在从net_bh()tcp_rcv()控制流中完成的。然后tcp_rcv()调用tcp_data()唤醒数据的线程等待。当线程先前调用sys_recv()来接收数据时,睡在tcp_recvmsg()的等待线程苏醒了来复制的数据。[1]图6(a)显示,当系统由DMA的网卡接收数据的处理时间。该ttcp是被设定来发送1460字节的数据102400次到lyranet。结果表明,在原始TCP/IP协议栈复制数据的时间是总处理时间最大的一部分。(即从sys_recv()tcp_recvmsg())。应用了复制消除,数据复制的处理时间是大大降低了。虽然boomerang_interrupt()在复制消除中不会修改,不过,网页重映会导致TLB的浪费,这反过来会改善DMA驱动程序的性能。在协议处理部分,在有无复制消除机制的lyranet从netbh()tcp_rcv()的处理时间的不同是微不足道的。图6(b)表明,系统由PIO的NIC接收数据的处理的时间。该ttcp是安装来发送1460字节的数据8192次到lyranet。结果表明,从NIC接收数据是主要瓶颈。没有快速设备的支持,如DMA控制器,网卡的PIO依赖于CPU通过主存接收数据。虽然我们应用复制消除大大降低了数据复制处理时间,但是,驱动处理占大部分总处理时间,从而导致性能的改善微不足道。4.结论我们已经重载和改造Linux的TCP/IP协议栈为一个软件组件,称为lyranet,这是独立于操作系统和硬件。为适应纳入资源有限的环境下,我们在lyranet中发展的复制消除,以减少协议处理时间的开销和减少内存的开销。性能评价表明,协议的处理时间在发送数据时可减少51.34-56.22%和在接收数据时23-46%。加入复制消除机制,仅仅增加了1.1-1.7%的目标代码的大小。总之,成功的经验和我们的工作可以作为嵌入式LinuxTCP/IP协议栈成为一个指标体系要求的网络连接的参考。此外,我们的零复制的执行情况还可以帮助工作,提高LinuxTCP/IP协议栈传输效率。5.参考文献J.Bruno,J.Brustoloni,E.Grabber,A.Silberschatz,andC.Small,“Pebble:AComponentBasedOperatingSystemforEmbeddedApplications”,InProceedingsof3rdSymposiumonOperatingSystemsDesignandImplementation,USENIX,February1999.[2]J.C.BrustoloniandP.Steenkiste,“EffectsofBufferingSemanticsonI/OPerformance”,Proceedingsof2ndSymposiumonOperatingSystemsDesignandImplementation,pages277–291,USENIX,Oct.1996.[3]Z.Y.Cheng,M.L.Chiang,andR.C.Chang,“Acomponentbasedoperatingsystemforresourcelimitedembeddeddevices”,IEEEInternationalSymposiumonConsumerElectronics,HongKong,Dec.5-7,2000.[4]J.W.Chuang,K.S.Sew,M.L.Chiang,andR.C.Chang,“IntegrationofLinuxCommunicationStacksintoEmbeddedOperatingSystems”,InternationalComputerSymposium,December6-8,2000.[5]T.Herbert,“EmbeddingTCP/IP”,[6]S.T.SatchellandH.B.J.Clifford,LinuxIPStacksCommentary,CoriolisGroupBooks,2000.[7]ttcp,