LWIP中零拷贝技术的研究与应用
- 格式:pdf
- 大小:1.01 MB
- 文档页数:5
Linux 中的零拷贝技术概述黄晓晨, 软件工程师, IBM黄晓晨,IBM system Z 自动化技术支持软件工程师。
冯瑞, 软件工程师, IBM简介:本系列由两篇文章组成,介绍了当前用于Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景。
本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关背景知识,简要概述了Linux 为什么需要零拷贝技术以及Linux 中都有哪几种零拷贝技术。
引言传统的Linux 操作系统的标准I/O 接口是基于数据拷贝操作的,即I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。
这样做最大的好处是可以减少磁盘I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘I/O 操作。
但是数据传输过程中的数据拷贝操作却导致了极大的CPU 开销,限制了操作系统有效进行数据传输操作的能力。
零拷贝(zero-copy )这种技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要CPU 数据拷贝操作。
现代的CPU 和存储体系结构提供了很多特征可以有效地实现零拷贝技术,但是因为存储体系结构非常复杂,而且网络协议栈有时需要对数据进行必要的处理,所以零拷贝技术有可能会产生很多负面的影响,甚至会导致零拷贝技术自身的优点完全丧失。
为什么需要零拷贝技术如今,很多网络服务器都是基于客户端- 服务器这一模型的。
在这种模型中,客户端向服务器端请求数据或者服务;服务器端则需要响应客户端发出的请求,并为客户端提供它所需要的数据。
随着网络服务的逐渐普及,video 这类应用程序发展迅速。
当今的计算机系统已经具备足够的能力去处理video 这类应用程序对客户端所造成的重负荷,但是对于服务器端来说,它应付由video 这类应用程序引起的网络通信量就显得捉襟见肘了。
0引言嵌入式Internet是近几年随着嵌入式系统的广泛应用和计算机网络技术的发展而发展起来一项新兴概念和技术。
随着Internet的发展,各种设备都产生了连接性的需求,从冰箱到电表,似乎所有电器都需要连入互联网。
通过为现有嵌入式系统增加因特网接入能力来扩展其功能,以Internet为介质实现信息交互的过程,这就产生了嵌入式Internet技术。
由于嵌入式系统自身资源的限制,处理能力不如台式机强,而台式机上的TCP/IP的复杂性,使得处理通信协议成为嵌入式系统接入Internet的关键,也是嵌入式系统接入Internet的难点之一。
LwIP是一套用于嵌入式系统的开放源码的轻型TCP/IP协议栈,它实现了较为完备的IP、ICMP、UDP、TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。
LwIP在保持协议主要功能的基础上减少对RAM和ROM的占用,一般它只需要几十K的RAM和40K 左右的ROM就可以运行,很适合同μC/OS-II相配合用在嵌入式系统中。
1μC/OS-II操作系统的移植μC/OS-II是一个专门用于嵌入式系统的实时操作系统,根据用户需要可以方便的进行移植、剪裁。
对于μC/OS-II操作系统的移植主要是对以下几个文件进行修改:1.1OS_CPU.H文件对于这个文件的修改主要包含三部分内容:1)由于不同的处理器有不通的字长,所以在这个文件中定义了与编译器相关的数据类型;2)设定了堆栈的单位,以及堆栈的增长方向;3)定义了中断开关的宏以及任务切换的宏。
1.2OS_CPU_C.C文件文件包含一个OSTaskStkInit()函数和若干hook函数,OSTaskStkInit()在创建任务时被OSTaskCreate()或OSTaskCreateExt()调用来初始化任务的堆栈结构。
系统hook函数在没有特殊需求的情况下只需要将其都实现为空函数即可。
1.3OS_CPU_A.ASM文件文件中包含了OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()四个函数。
零拷贝技术及其实现的研究
可向民;龚正虎;夏建东
【期刊名称】《计算机工程与科学》
【年(卷),期】2000(022)005
【摘要】零拷贝(zero-copy)是实现主机或路由器等设备高速网络接口的主要技术.零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作系统开销和协议处理开销,从而有效提高通信性能,实现高速数据传输.
【总页数】5页(P17-20,24)
【作者】可向民;龚正虎;夏建东
【作者单位】国防科技大学计算机学院;国防科技大学计算机学院;国防科技大学计算机学院
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于零拷贝的网络数据捕获技术的研究与实现 [J], 张珂;权义宁
2.Linux平台下基于Intel千兆网卡的零拷贝技术的研究与实现 [J], 刘峰;黄凯明;黎忠文
3.基于IXP2400的多播数据包零拷贝技术的实现 [J], 陈杰;李晓勇
4.光纤通道交换网络接口卡的零拷贝技术研究与实现 [J], 许伟;冯萍;郭海山
5.基于RTL8169网卡的零拷贝技术研究与实现 [J], 刘靖龙;刘颖;张思东
因版权原因,仅展示原文概要,查看原文内容请购买。
剖析linux下的零拷贝技术背景大多数的网络服务器是基于server-client模式的。
在这当中,下载是一个很常见的功能。
此时服务器端需要将主机磁盘上的文件发送到客户端上去。
传统的Linux操作系统的标准I/O接口是基于数据拷贝操作的,即I/O操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。
那么传统的I/O操作过程是咋样的呢?(下面是具体说明,以read和write为例)在执行read操作时,操作系统首先会检查,文件内容是否缓存在内核缓冲区,如果在内核缓冲区,则不用去磁盘中读取文件,而是直接将内核缓冲区的内容拷贝到用户空间缓冲区中去。
如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区(DMA),然后再把内核缓冲区上的内容拷贝到用户缓冲区中。
接下来,write系统调用再把用户缓冲区的内容拷贝到网络堆栈相关的内核缓冲区中,最后再往对方的sockfd中些数据。
并且在这个过程中还涉及到了四次的上下文切换。
那传统的I/O操作会带来什么问题呢?在高速网络中,大量传统的I/O操作导致的数据拷贝工作会占用CPU 时间片,同时也需要占用额外的内存带宽。
使cpu将大多数的时间用于I/O操作上,从而无法处理其他的任务,很大程度上影响了系统的性能,使服务器成为性能瓶颈。
而本身我们可以看出:很多数据复制操作并不是真正需要的。
所以可以消除一些复制操作以减少开销并提高性能。
这就引出了我们今天要介绍的“零拷贝”技术。
概念零拷贝(Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。
这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。
而且,零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上下文切换而带来的开销。
lwip原理lwip原理是指轻量级IP协议栈(Lightweight IP),是一种适用于嵌入式系统的TCP/IP协议栈。
本文将介绍lwip原理的基本概念、工作流程和应用场景。
一、基本概念lwip原理基于TCP/IP协议栈,是一种开源的网络协议栈。
它具有轻量级、高效性和可移植性的特点,适用于嵌入式系统的资源有限环境。
lwip原理提供了TCP/IP协议栈中的网络层和传输层功能,支持IP、ICMP、UDP和TCP等协议。
二、工作流程lwip原理的工作流程包括网络接口驱动、协议栈处理和应用程序接口。
1. 网络接口驱动网络接口驱动负责与硬件设备进行通信,包括数据的发送和接收。
它提供了与硬件设备的接口函数,通过这些函数将数据传输到网络中或接收网络中的数据。
2. 协议栈处理协议栈处理是lwip原理的核心部分,它包括网络层和传输层的处理。
网络层处理主要负责IP数据包的路由和转发,通过路由表确定数据包的下一跳地址。
传输层处理主要负责数据的可靠传输,包括UDP和TCP协议的处理。
在网络层和传输层之间,lwip原理使用了一个缓冲区来存储数据包。
当数据包到达网络层时,lwip原理会根据目的地址查询路由表,确定数据包的下一跳地址,并将数据包传递给传输层进行处理。
在传输层,lwip原理根据协议类型选择相应的协议处理函数进行处理,如UDP协议或TCP协议。
3. 应用程序接口应用程序接口是lwip原理与应用程序之间的接口,应用程序可以通过这个接口进行网络通信。
lwip原理提供了一系列的API函数,应用程序可以调用这些函数来发送和接收数据。
通过应用程序接口,应用程序可以实现各种网络应用,如Web服务器、FTP服务器等。
三、应用场景lwip原理适用于嵌入式系统中的网络通信应用。
它具有资源占用少、效率高的特点,适用于资源有限的嵌入式系统。
以下是lwip原理的一些应用场景:1. 物联网设备随着物联网的发展,越来越多的设备需要进行网络通信。
LwIP在μCOS-Ⅱ平台上的移植与应用的开题报告一、选题背景随着物联网概念的提出,越来越多的设备需要与网络进行连接。
而对于嵌入式设备来说,网络协议栈的开发是一项非常繁琐的任务。
LwIP是一个轻量级的TCP/IP协议栈,适用于嵌入式系统中。
其源码开放,可移植性强,被广泛应用于各类嵌入式设备的网络连接中。
本次选题将研究LwIP在μCOS-Ⅱ平台上的移植与应用。
二、研究意义本次研究旨在探索LwIP在μCOS-Ⅱ平台上的移植方法和应用,对于嵌入式系统的网络连接提供有效的解决方案。
同时,本次研究还可以促进μCOS-Ⅱ平台与LwIP协议栈的合作,加强两者之间的互动交流。
三、研究内容本次选题的主要研究内容包括如下几个方面:1. LwIP协议栈的特点和功能介绍:本部分将对LwIP协议栈的特点和功能进行详细介绍,帮助读者了解LwIP协议栈的基本概念和工作原理。
2. μCOS-Ⅱ操作系统介绍:本部分将介绍μCOS-Ⅱ操作系统的特点和应用领域,帮助读者了解操作系统和嵌入式系统的关系。
3. LwIP在μCOS-Ⅱ平台上的移植:本部分将介绍LwIP在μCOS-Ⅱ平台上的移植方法,包括代码修改、适配驱动等方面。
4. LwIP在μCOS-Ⅱ平台上的应用实例:本部分将介绍LwIP在μCOS-Ⅱ平台上的应用实例,包括网络连接的建立、数据传输等方面。
四、研究方法本次研究采用文献调研和实验分析相结合的方法。
通过查阅相关文献和资料,了解LwIP协议栈和μCOS-Ⅱ操作系统的特点和应用。
然后通过实验分析,探索LwIP在μCOS-Ⅱ平台上的移植方法和应用实例。
五、预期成果通过本次研究,预期达到以下几个成果:1. 对LwIP协议栈和μCOS-Ⅱ操作系统的特点和应用有深入的了解。
2. 掌握LwIP在μCOS-Ⅱ平台上的移植方法。
3. 实现LwIP在μCOS-Ⅱ平台上的网络连接和数据传输功能。
4. 撰写技术论文,对研究结果进行总结和归纳。
六、参考文献1. Grönvall, B., & Delsing, J. (2019). Lightweight TCP/IP (LwIP) open-source implementation for embedded systems. IEEE Access, 7, 133–145.2. 李伟. 嵌入式操作系统μC/OS-II在移动物联网中的应用研究[D]. 浙江大学, 2015.3. 武金喜, 郝澍. 基于μC/OS-Ⅱ和lwip的配电自动化数据采集系统的设计[J]. 电力电子技术, 2019, 53(08):72-76+96.。
程序员面试之零拷贝技术解析Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章给大家分享一篇非常优质的文章-零拷贝技术,零拷贝技术也是面试常考的一个点,比较重要,而这篇文章恰好的解决了所有的疑惑,推荐给你。
1.数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:1.File.read(file,buf,len);2.Socket.send(socket,buf,len);例如消息中间件Kafka就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。
在没有任何优化技术使用的背景下,操作系统为此会进行4次数据拷贝,以及4次上下文切换,如下图所示:如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:4次copy:1.CPU负责将数据从磁盘搬运到内核空间的Page Cache中;2.CPU负责将数据从内核空间的Socket缓冲区搬运到的网络中;3.CPU负责将数据从内核空间的Page Cache搬运到用户空间的缓冲区;4.CPU负责将数据从用户空间的缓冲区搬运到内核空间的Socket缓冲区中;4次上下文切换:1.read系统调用时:用户态切换到内核态;2.read系统调用完毕:内核态切换回用户态;3.write系统调用时:用户态切换到内核态;4.write系统调用完毕:内核态切换回用户态;我们不免发出抱怨:1.CPU全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于CPU;2.4次copy太多了,4次上下文切换也太频繁了;2.DMA参与下的数据四次拷贝DMA技术很容易理解,本质上,DMA技术就是我们在主板上放一块独立的芯片。
在进行内存和I/O设备的数据传输的时候,我们不再通过CPU 来控制数据传输,而直接通过DMA控制器(DMA Controller,简称DMAC)。
Linux零拷贝原理到目前为止,几乎所有人都听说过Linux下所谓的零拷贝功能,但我经常遇到对这个主题没有完全了解的人。
正因为如此,我决定写几篇文章,深入探讨这个问题,希望能解开这个有用的特性。
在这篇文章中,我们从一个用户的角度看零拷贝,血淋淋的内核级细节被有意省略。
什么是零拷贝?为了更好地理解问题的解决方案,我们首先需要了解问题本身。
让我们来看看网络服务器处理的简单过程中所涉及到的内容,它将存储在文件中的数据存储到网络上的客户端中。
这里有一些示例代码:看起来很简单;你会认为只有这两个系统调用不会有太多的开销. 事实上,这与事实并无太大的距离。
在这两个调用的后面,数据至少被复制了4次,并且几乎已经执行了许多用户/内核上下文切换(实际上这个过程要复杂得多,但我想让它保持简单)。
为了更好地了解所涉及的过程,请看图1。
顶部显示了上下文切换,而底部显示了复制操作。
图1。
在两个示例系统调用中复制第一步:读系统调用会导致从用户模式到内核模式的上下文切换。
第一个复制由DMA引擎执行,它读取磁盘中的文件内容并将其存储到内核地址空间缓冲区中。
第二步:将数据从内核缓冲区复制到用户缓冲区,read系统调用返回。
调用的返回导致了从内核返回到用户模式的上下文切换,现在,数据存储在用户地址空间缓冲区中,它可以再次开始向下移动。
第三步:write系统调用导致从用户模式到内核模式的上下文切换,执行第三个复制,将数据再次放入内核地址空间缓冲区中。
但是这一次,数据被放入一个不同的缓冲区,这个缓冲区是与套接字相关联的。
第四步:写系统调用返回,创建第四个上下文切换。
DMA引擎将数据从内核缓冲区传递到协议engin时,第四个复制发生了独立和异步的情况。
你可能会问自己,“你说的独立和异步是什么意思?”在调用返回之前,数据不是传输的吗?”实际上,调用返回并不能保证传输;它甚至不能保证传输的开始。
它只是意味着以太网驱动程序在其队列中有空闲的描述符并接受了我们的传输数据,在我们的之前可能会有很多的数据包在排队。
本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。
E-mail: wwwlkk@来源: /?business&aid=6&un=wwwlkk#7零拷贝技术交流文档目录:(一)linux中的分页机制 (1)(二)实现零拷贝的两个理论方案 (2)(三)为防火墙定制的零拷贝技术方案 (3)(四)参考文献 (5)前言:零拷贝技术是比较实用的技术,但是网络上很少有人介绍这种技术的实现原理,本文的目的就是详细的讲解零拷贝的实现原理,但是不讨论技术细节,因为技术细节不好表述,而且不同的需求或者不同的程序员,都会选择不同技术来实现,但是最终的实现原理是不变的。
(一)linux中的分页机制CPU要访问某块物理内存,必须要获得内存的物理地址,CPU集成有寻址硬件,会根据机器语言指令中提供的地址,执行地址转换,获得的物理地址。
CPU有两种转换模式:1.实模式2.保护模式。
实模式下的物理地址=线性地址,保护模式下的物理地址=线性地址通过分页机制转化为物理地址。
启动保护模式:把CPU控制寄存器CR0中的最高位置1。
CPU保护模式寻址方式:图1 分页机制寻址说明:CR3控制寄存器的值是物理地址。
由于寻找的是页框的物理地址,页框的物理地址是4096的整数倍,所以CR3,页目录和页表中存储的物理地址后12位都为0。
也就是这12位的空间不存储物理地址信息,而是用于存储访问控制信息(可读/可写/CPU特权级别),或者对应的页是否存在等信息。
其中访问控制信息(可读/可写/CPU特权级别)可以特别利用:例如:如果某个页框的范围控制标记是只读的,那么进程如果对这个页框进行写操作,就会产生段错误。
注意:从2.6.11版本开始,采用了四级分页模型,但基本原理是一样的。
每个进程的CR3的值是不同,进程切换时保存或者恢复CR3的值。
只要设置了CR3的值CPU 将自动进行寻址。
linux内核开发(零拷贝)linux 内核开发(零拷贝)我正在写一个linux网卡零拷贝的驱动,是在intel e1000驱动基础之上改动。
查了查资料已经搞清楚DMA是如何运作,而且也知道如何使DMA将数据直接写入自己申请的内存空间。
已经有了一个大致的解决方案,但有以下下几个细节搞不定,请同学们帮帮。
我先说下我的思路:首先从用户太说起,数据包从经数据线至网卡驱动至协议栈最后至用户太要经过至少两次拷贝才能完成,期间cpu参与过多,造成cpu负担过重,效率低下。
从e1000的驱动看到:pci_map_single()这个函数完成了将内核内存映射到DMA设备的过程。
我所做的就是将pci_mag_single()映射的内存替换成我申请的内存。
这样DMA设备就把数据直接写到指定的内存了,用户台进程读这块内存就OK了。
其中没有cpu的参与。
如何替换呢?写过内核的同学们都知道skb buffer这个东西。
当网卡驱动被初始化的时候,会n etdev_alloc_skb这个系统函数,预先申请一堆的skb buffer。
从源码中看出,申请过程分两个过程,首先申请一个skb buffer结构。
skb buffer中有一个指针类型的成员变量data,此时的data是没有指向任何有效数据块的。
然后在用kmalloc()申请一块内存,赋给skb->data。
网卡驱动就是用pci_map_single()将skb->data映射入DMA设备。
然后DMA设备会将收到的数据直接写入skb->data指向的内存区。
所以我们只需增加一个内存分配模块,替换网卡驱动skb buffer的分配函数即可。
那是DMA设备会自动的将收到的数据写入我们指定的内存中。
以上是我的思路。
不对的地方请指正。
下面是我的问题。
DMA将数据写入我们分配的内存后,就需要通知用户态的进程来读取了。
问题如下:1.用户态如何读取这部分内存。
我查了查资料,有两种方式可以完成。
收稿日期:2017-07-07 修回日期:2017-11-15 网络出版时间:2018-02-24基金项目:陕西省重大科技创新专项资助项目(2010ZKC 02-08)作者简介:赵成青(1990-),男,硕士研究生,研究方向为嵌入式系统开发与设计;李宥谋,教授,研究方向为集成电路设计㊁嵌入式系统开发与设计㊂网络出版地址:http :// /kcms /detail /61.1450.TP.20180224.1521.066.htmlLWIP 中零拷贝技术的研究与应用赵成青,李宥谋,刘永斌,王 涛(西安邮电大学,陕西西安710000)摘 要:LWIP 是一种轻量级的TCP /IP 协议栈㊂在运行过程中占用少量的资源,主要应用在低端的嵌入式系统㊂文中从物理层到应用层,分三个层次分析了LWIP 协议栈的数据传递过程㊂分别是物理层到协议栈内部的数据传递过程㊁协议栈内部本身的数据传递过程㊁协议栈和外部应用程序数据的传递过程㊂而数据在协议栈内部传递时,通过pbuf 缓冲包在各层之间传递数据包的地址指针已经实现了数据在协议栈内部各层之间的零拷贝传递㊂提出了在物理网卡和LWIP 协议栈传递数据㊁外部应用程序和LWIP 协议栈传递数据时的改进方法,避免了数据的两次拷贝,从而实现了数据从物理层直达应用层,提高了系统的传输效率和并发性能㊂测试结果表明,数据传输速率从未优化的2.04MB /s 提升到9.8MB /s,已接近网卡性能极限㊂关键词:分层;内存映射;指针传递;零拷贝;IPC 方式中图分类号:TP216 文献标识码:A 文章编号:1673-629X (2018)07-0182-05doi:10.3969/j.issn.1673-629X.2018.07.039Research and Application of Zero Copy Technology in LWIPZHAO Cheng -qing ,LI You -mou ,LIU Yong -bin ,WANG Tao(Xi ’an University of Posts and Telecommunications ,Xi ’an 710000,China )Abstract :LWIP ,a lightweight TCP /IP stack ,occupies a small amount of resources during the operation and is mainly used in low -end embedded systems.From the physical layer to the application layer ,the data transfer process of the LWIP protocol stack is analyzed in three levels which are the data transfer process from the physical layer to the protocol stack ,the data transfer process inside the protocol stack ,and the data transfer between the protocol stack and the external application program.When the data is passed inside the protocol stack ,the address pointer of the data packet is transmitted between the layers through the pbuf buffer packet ,and the data has been trans⁃mitted by zero copy between the layers of the protocol stack.We propose an improved method to transfer data between the physical net⁃work card and the LWIP protocol stack ,the external application program and the LWIP protocol stack ,so as to avoid the two copy of the data.The system realizes the direct application of data from the physical layer to the application layer ,and improves the transmission effi⁃ciency and the concurrent performance of the system.Test shows that the rate of data transmission has been optimized from 2.04MB /s to 9.8MB /s ,which is close to the network card performance limit.Key words :layered ;memory mapping ;pointer passing ;zero copy ;IPC mode0 引 言LWIP 是瑞典计算机科学院(SICS )的AdamDunkels 开发的用于嵌入式系统的开源TCP /IP 协议栈[1]㊂LWIP 的含义是轻量级的TCP /IP 协议,专注于减少资源消耗㊂嵌入式网络传输系统由于成本资源的限制,往往采用简化的TCP /IP 协议㊂文中通过研究㊁分析常用的嵌入式网络协议栈LWIP 的结构,在物理层和应用层提出了提高系统传输效率的改进方法㊂在小型嵌入式系统中,LWIP 的实现基于上层协议已明确知道下层协议所使用的数据结构的特点[2]㊂它会假设各层间的部分数据结构和实现原理在其他层是可见的㊂在数据包递交过程中,各层协议可以通过指针直接指向数据包中其他层次的字段㊂所以上层可直接使用取地址计算得到下层中的数据,这不仅使整个协议栈对数据包的操作更加灵活,而且避免了LWIP 协议栈内部数据递交时的复制㊂但是,这仅仅第28卷 第7期2018年7月 计算机技术与发展COMPUTER TECHNOLOGY AND DEVELOPMENT Vol.28 No.7July 2018是在LWIP协议栈内部实现数据的零拷贝㊂在物理网卡向协议栈传递数据时和协议栈向应用程序传递数据时,还是存在两次消耗较大的数据拷贝过程㊂所以,文中提出在网卡接收数据时让LWIP内核存储区指针直接指向物理网卡的寄存器地址的方法,避免了物理网卡数据到LWIP协议栈缓冲区数据的拷贝[3]㊂在应用层,提出了利用μcos操作系统的邮箱机制,避免了多个外部应用程序和协议栈内核交互时的数据拷贝[4],从而实现了从物理层到应用层真正的数据零拷贝,并且提高了系统的并发性㊂1 物理网卡到LWIP协议栈数据的传递在嵌入式系统中应用比较广泛的是MicroChip公司的ENC28J60网卡㊂在网卡驱动函数接收数据包时,网卡驱动函数首先向网卡发送数据包传送指令,此时网卡会把BNRY(边界寄存器)处的一个网卡格式的数据包数据一次性全部发送到DMA端口,此时网卡驱动函数会在DMA端口读取所有字节数据后,网卡会自动将BNRY(边界寄存器)值调整为下一个数据包地址,以准备下一次读取所有字节数据㊂然后将接收到的数据封装成LWIP熟悉的格式并且写到缓冲区中,这个过程涉及到数据到拷贝[5]㊂在ENC28J60网卡中接收缓冲器由一个硬件管理的循环FIFO构成㊂ERXST表示接收缓冲区起始地址,ERXNDH表示接收缓冲区结束地址[6]㊂如图1所示,通过把网卡相关的寄存器映射到LWIP内核内存空间,就可以直接对网卡寄存器进行操作,避免了物理网卡到LWIP 内核空间的数据拷贝㊂然后封装成LWIP内核能够识别的pbuf类型的数据包结构,在LWIP内核中由low_ level_input()函数完成这个功能㊂通过ehternetif_in⁃put()函数解析该数据包的类型,然后将该数据包指针递交给相应的上层㊂图1 网卡内部寄存器指针映射2 LWIP协议层间数据传递在网卡接收数据时,需要申请一个数据包,然后将网卡中的数据填入数据包中㊂发送数据包时,协议栈的某层中会申请一个pbuf,并将相应的数据装入到数据区域,同时相关的协议首部信息也会被填写到pbuf 的预留数据区域中[7]㊂数据包申请函数有两个重要参数,一个是想申请的数据包pbuf类型,另一个重要参数是该数据包是在协议栈中哪一层被申请的,分配函数会根据这个层次的不同,在pbuf数据区域前为相应的协议预留出首部空间,这就是offset值㊂总的来说, LWIP定义了四个层次,当数据包申请时,所处的层次不同,会导致预留空间的offset值不同[8]㊂层次定义时通过一个枚举类型pbuf_layer:Typedef enum{PBUF_TRANSPORT,//传输层PBUF_IP,//网络层PBUF_LINK,//链路层PBUF_RAW,//原始层}pbuf_layer;上面的结构体中除了定义枚举类型pbuf_layer来表示各个网络协议层的名称外,还定义了两个宏: PBUF_TRANSPORT_HLEN和PBUF_IP_HLEN㊂前者是典型的TCP报文首部长度,而后者是典型的不带任何选项字段的IP首部长度㊂代码如下所示:Switch(layer){Case PBUF_TRANSPORT:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN+PBUF_ TRASNSPORT_HLEN;Case PBUF_IP:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN;Case PBUF_LINK:Offset=PBUF_LINK_HLEN;Case PBUF_LINK:Offset=0;在LWIP的数据包管理函数pbuf.c中,首先根据数据包申请时传入的协议层参数,计算需要在pbuf数据区签预留的长度offset值,然后根据pbuf的类型进行实际申请㊂Pbuf_pooll类型申请最复杂[9],因为可能需要几个pool连接在一起,以此来满足用户的空间需求㊂限于篇幅,对LWIP内存分配机制不做深入研究; pbuf_ref和pbuf_rom类型申请最简单,它们只是在内存MEMEP_PBUF中分配一个pbuf结构空间,然后初始化相关字段,注意这两种类型的payload指针需要用户自行设置,通常在调用完函数pbuf_alloc后,调用者需要将payload指向某个数据区㊂在原始层以太网驱动中:P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);这个调用语句申请了一个PBUF_RAM类型的pbuf,且其申请的协议层为PBUF_RAW,所以pbuf_al⁃loc函数不会在数据区前预留出任何首部空间;通过使用p->payload,就可以实现对pbuf中数据区的读取或㊃381㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用者写入操作了㊂在传输层TCP层: P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);它告诉数据包分配函数使用PBUF_RAM类型的pbuf,且数据前应该预留一部分的首部空间㊂由于这里是PBUF_TRANSPORT层,所以预留空间将有54个字节,即TCP首部长度的20个字节㊁IP数据包首部长度的20个字节以及以太网帧首部长度的14字节㊂当数据包往下层递交,各层协议就直接操作这些预留空间的数据,以实现数据首部的填写,这样就避免了数据的拷贝㊂3 LWIP软件与用户程序间的数据传递3.1 用户缓冲数据结构协议栈API实现时,也为用户提供了数据包管理函数,可以完成数据包内存申请㊁释放㊁数据拷贝等任务㊂无论是UDP还是TCP连接,当协议栈接收到数据包后,会将数据封装在一个netbuf中,并递交给应用程序[10]㊂在发送数据时,不同类型的连接将导致不同的数据处理方式㊂对于TCP连接,内核会根据用户提供待发送数据的起始数据和长度,自动将数据封装在合适的数据包中,然后放入发送队列;对于UDP,用户需要手动将数据封装在netbuf中,通过调用发送函数,内核直接发送数据包中的数据段㊂应用程序使用netbuf结构来描述㊁组装数据包,该结构只是对内核pbuf的简单封装,是用户应用程序和协议栈共享的㊂外部应用程序可以使用该结构来管理发送数据㊁接收数据的缓冲区㊂netbuf是基于pbuf实现的,其结构如以下代码所示:Struct netbuf{Struct pbuf*p,*ptr;Ip_addr_t*addr;U16_t port;}其中,netbuf相当于一个数据首部,保存数据的字段是p,它指向pbuf链表首部,ptr指向链表中的其他位置,addr表示IP地址,port表示端口号㊂netbuf是应用程序描述待发送数据和已接收数据的基本结构,引入netbuf结构看似会让应用程序更加繁杂,但实际上内核为应用程序提供了API,通过共享一个netbuf结构(如图2所示),两部分API就能实现对数据包的共同处理,避免了数据拷贝㊂图2 用户缓冲区结构3.2 操作数据缓冲区指针与BSD相同,LWIP协议栈API也对网络连接进行了抽象㊂但它们之间的抽象存在一定的差别:BSD 实现了更高级别的抽象,用户可以像操作文件那样来操作一个网络连接;LWIP中,API只能实现较低级别的抽象,用户操作的仅仅是一个网络连接,而不是文件㊂在BSD中,应用程序处理的网络数据都处于一片连续的存储区域中,可以使用户对数据的处理更加方便㊂在LWIP中,若API使用上述数据存储机制可能会导致很大的缺陷,因为LWIP中网络数据都存储在pbuf中,如果要实现存储在连续的存储区的话,需要将所有pbuf数据拷贝到这个连续的存储中,这将造成数据的拷贝㊂为了避免数据拷贝以后再递交给用户,需要直接操作pbuf的一些方法,而LWIP中恰恰提供了这些方法㊂比如通过netbuf_next()可以修改数据指针指向下一个数据段,如果返回值为0,表示netbuf 中还存在数据段,大于0说明指针已经指向netbuf中的最后一个数据段了,小于0表明netbuf中已经没有数据段了㊂当用户未调用netbuf_next()函数的情况下,ptr和p都默认指向第一个pbuf㊂通过netbuf_next()对协议栈和应用程序共同缓冲区指针的调整和读取,避免了应用程序和数据以及内核栈的拷贝㊂4 应对多个外部应用程序的指针传递在单独运行LWIP时,用户应用程序和协议栈内核处于同一进程中,用户程序通过回调的方式进行㊂这样,用户程序和协议栈内核出现了相互制约的关系,因为用户程序执行的时候,内核一直处于等待状态,内核需要等待用户函数返回一个处理结果再继续执行㊂如果用户执行计算量很大,执行时间很长,则协议栈代码就一直得不到执行,协议栈接收,处理数据包效率会受到直接的影响㊂最严重的结果是,如果发送方速度很快,则协议栈会因为来不及处理而出现丢包的情况㊂为了设计多进程外部应用程序,将LWIP移植到㊃481㊃ 计算机技术与发展 第28卷μcos操作系统下,让LWIP内核作为操作系统的一个任务运行[11]㊂LWIP协议栈设计时,提供了协议栈与操作系统之间函数的接口㊂协议栈API由两部分组成㊂一部分提供给应用程序,一部分提供给协议栈内核㊂应用程序和协议栈内核通过进程间通信机制进行通信和同步[12]㊂使用到的进程通信机制包括了以下三种[13]:(1)邮箱,例如内核邮箱mbox㊁连接上接收数据的邮箱recvmbox;(2)信号量,例如op_completed,用于两部分API 同步;(3)共享内存,例如内核消息结构tcp_msg㊁API 消息内容api_msg等[14]㊂两部分API间的关系如图3所示㊂API设计的主要思想是让应用程序成为一个单独的进程;而协议栈也成为一个单独的进程㊂用户进程只负责数据的计算等其他工作,协议栈进程仅仅负责通信工作㊂两部分进程之间使用三种IPC方式中的邮箱和信号量集,内核进程可以直接将数据递交到应用程序邮箱中,然后继续执行,不必阻塞等待,邮箱对于应用程序来说就像一个输入队列,提高了系统的实时性[15]㊂图3 两部分独立进程间的通信 全局邮箱mbox在协议栈初始化时建立,用于内核进程tcpip_thread接收消息㊂内核进程通过共享内存的方式与协议栈的其他各个模块进行通信,它从邮箱中获得的是一个指向消息结构的指针㊂函数tcp_ input在内存池中为系统消息结构申请空间,并根据消息类型初始化结构中的相关字段,把内核消息封装在tcp_msg结构中,最后将消息投递到系统邮箱中等待内核进程tcpip_thread处理㊂tcpip_thread使用从邮箱中获得的指针指定到对应内存地址处读取消息内容,从而避免了两个进程间通信的数据的拷贝㊂5摇性能测试对比及其应用在局域网内,对ARM开发板STM32F103VET6-EV上基于无操作系统和移植了μcos操作系统的LWIP两种方法编写的UDP服务器进行数据吞吐能力的测试,以此来估算网卡及整个板子的网络处理性能及对比无操作系统模拟层和在操作系统模拟层下编写的UDP服务器性能的差别㊂在Windows主机上运行iperf软件来测试服务器的数据吞吐能力㊂如图4(a)所示,在软件上选择UDP 协议,设置好服务器IP地址(192.168.1.230)和端口号(5000)后,单击start iperf,软件开始对服务器性能进行测试㊂从图4(a)可以看出,服务器的上下行带宽都可以维持在9800kb/s左右,很接近ENC28J60网卡的处理值上线10M/s㊂在操作系统模拟层下基于LWIP零拷贝技术编写的UDP服务器,板子的网络处理性能达到最优㊂从图4(b)可以看出,基于无操作系统模拟层下编程的服务器在客户端连续发送大量数据图4 UDP性能测试㊃581㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用时导致丢包情况,严重情况下甚至出现死机的情况㊂6摇结束语综上所述,在应对多个外部应用程序的情况下,无操作系统模拟层的UDP 服务器编程,虽然避免了数据的拷贝,但是无法应对多个外部应用程序㊂所以将LWIP 移植到μcos 操作系统下,不仅减少了内存开销,而且能够应对多个外部应用程序㊂文中的研究成果已经成功应用于嵌入式网管系统项目并实际运行,不仅提高了基于STM 32平台μcos 操作系统下测量仪器代理模块的传输效率,提高了系统的实时性,而且节约了内存开销㊂参考文献:[1] CAROFIGLIO G ,MUSCARIELLO L.On the impact of TCPand per -flow scheduling on internet performance [J ].IEEE /ACM Transactions on Networking ,2012,20(2):52-56.[2] SHERWANI S A ,KHIYAL M S H.Real -time scheduler fortransport protocols [J ].Information Technology Journal ,2007,6(3):376-379.[3] LI Jinlei ,ZHENG Wengang ,SHEN Changjun ,et al.Applica⁃tion of modbus protocol based on μC /TCPIP in water savingirrigation in facility agricultural [C ]//International confer⁃ence on computer and computing technologies in agriculture.[s.l.]:[s.n.],2014.[4] SCHIEPEK G ,AICHHORN W.Real -time monitoring ofpsychotherapeutic change processes [J ].Psychotherapie ,Psy⁃chosomatik ,Medizinische Psychologie ,2013,63(1):39-47.[5] 陈 实,武 杰.一种基于以太网的嵌入式数据传输速率优化方法研究[J ].微型机与应用,2015,34(4):64-66.[6] 张庆辉,马延立.STM 32F 103VET 6和ENC 28J 60的嵌入式以太网接口设计[J ].单片机与嵌入式系统应用,2012(9):23-25.[7] 张 齐,劳炽元.轻量级协议栈LWIP 的分析与改进[J ].计算机工程与设计,2010,31(10):2169-2171.[8] 蔡雄飞,王新华,郭淑琴.嵌入式TCP /IP 协议LWIP 的内存管理机制研究[J ].杭州电子科技大学学报,2012,32(4):118-121.[9] 付晓军,夏应清,何 轩.嵌入式LWIP 协议栈的内存管理[J ].电子技术应用,2006,32(3):56-58.[10]李茂正.嵌入式系统中实现网络协议[D ].南京:南京大学,2011.[11]苏勇辉.基于ARM 微处理器TCP /IP 协议栈LwIP 实现[J ].国外电子测量技术,2009,28(10):76-78.[12]MOLAY B.Unix /Linux 编程实践教程[M ].杨宗源,黄海涛,译.北京:清华大学出版社,2004:464-475.[13]LABROSSE J J.嵌入式实时操作系统μC /OS -II [M ].邵贝贝,译.北京:航空航天大学出版社,2012:143-150.[14]STEINKE R C ,NUTT G J.A unified theory of shared mem⁃ory consistency [J ].Journal of the ACM ,2004,51(5):800-849.[15]任 哲.嵌入式实时操作系统μC /OS -II 原理及应用[M ].北京:航空航天大学出版社,2005:133-139.(上接第181页) 网络性能比较[J ].中国卫生统计,2013,30(2):173-176.[4] 卢辉斌,李丹丹,孙海艳.PSO 优化BP 神经网络的混沌时间序列预测[J ].计算机工程与应用,2015,51(2):224-229.[5] 游丹丹,陈福集.基于改进粒子群和BP 神经网络的网络舆情预测研究[J ].情报杂志,2016,35(8):156-161.[6] 张宝堃,张宝一.基于BP 神经网络的非线性函数拟合[J ].电脑知识与技术,2012,8(27):6579-6583.[7] BUSCEMA M.Back propagation neural networks [J ].Sub⁃stance Use &Misuse ,1998,33(2):233-270.[8] 范广坡,余学飞,卢广文,等.改进PSO -BP 算法的压力导丝温度及非线性补偿研究[J ].自动化仪表,2016,37(6):16-20.[9] 崔东文.多隐层BP 神经网络模型在径流预测中的应用[J ].水文,2013,33(1):68-73.[10]JIAN Huajiang ,BU Yunsheng ,LI Xionggong ,et al.PSO al⁃gorithm based task allocation in dynamic virtual enterprise [J ].Advanced Materials Research ,2011,189-193:2572-2576.[11]朱小明,张慧斌.PSO 算法的稳定性分析及算法改进[J ].计算机科学,2013,40(3):275-278.[12]涂娟娟.PSO 优化神经网络算法的研究及其应用[D ].镇江:江苏大学,2013.[13]LIU Lilan ,HU Rongsong ,HU Xiangping ,et al.A hybridPSO -GA algorithm for job shop scheduling in machine tool production [J ].International Journal of Production Research ,2015,53(19):5755-5781.[14]梅金平,张士兵,王海莲.基于PSO -GA 算法的多用户OFDM 系统资源分配[J ].电视技术,2014,38(1):115-119.[15]崔宝才.基于GA 改进BP 神经网络网络异常检测方法[J ].现代电子技术,2016,39(3):90-93.[16]马福祥,马秀娟.一种基于二次变异策略的改进型遗传算法[J ].计算机工程与应用,2014,50(13):62-65.[17]SRINIVAS M ,PATNAIK L M.Adaptive probabilities ofcrossover and mutation in genetic algorithms [J ].IEEE Transactions on Systems ,Man ,and Cybernetics ,1994,24(4):656-667.㊃681㊃ 计算机技术与发展 第28卷。