基于零拷贝方式的多应用程序报文接收方法和装置的制作方法

文档序号:6584697阅读:81来源:国知局
专利名称:基于零拷贝方式的多应用程序报文接收方法和装置的制作方法
技术领域
本发明涉及数据报文接收领域,尤其涉及一种基于零拷贝方式的多应用程序报文 接收方法和装置。
背景技术
零拷贝(zero-copy)是指在某节点的网络报文收发过程中不会出现任何内存间 的拷贝,发送时数据包由应用程序的用户缓冲区直接经过网络接口到达外部网络。现有的 基于零拷贝方式的报文接收方法都是针对一个应用程序,如中国专利文献CN101150486A。 该专利文献公开了一种零拷贝缓冲区队列网络数据接收的管理方法,包括如下操作步骤 A.在用户空间分配连续的内存作为报文的DMA缓冲区;B.在内核驱动中建立缓冲区的控制 句柄;C.应用程序通过接口库映射控制句柄,实现对缓冲区的操作;D.接收报文时,驱动把 满缓冲区的物理地址写入网卡,应用从满缓冲区队列取出一个填充了报文的缓冲区,发送 报文内容后把缓冲区放入空缓冲区队列。该现有技术的问题是,不能支持多个应用程序接 收数据报文。

发明内容
针对现有技术不能基于零拷贝方式进行多应用程序报文接收的问题,本发明的目 的是提供一种能够基于零拷贝方式进行多应用程序报文接收的方法和装置。为实现上述目的,根据本发明的一个方面,提供了一种基于零拷贝方式的多应用 程序报文接收方法,包括下列步骤在网卡驱动程序中申请连续内存空间作为报文接收的 缓冲区队列;在网卡相关寄存器中设置一个缓冲区队列写指针寄存器和多个缓冲区队列读 指针寄存器,每个缓冲区队列读指针寄存器对应一个应用程序;网卡接收报文并判断缓冲 区队列是否已存储满,如果缓冲区队列未存储满则将报文存储在缓冲区队列,同时更新写 指针寄存器;以及每个应用程序分别判断是否有要接收的报文存储在缓冲区队列中,如果 有,则将报文从缓冲区队列中取走,同时网卡驱动程序更新应用程序对应的缓冲区队列读 指针寄存器。连续内存空间的首地址转换成物理地址存储到网卡相关寄存器,连续内存空间的 大小也存储到网卡相关寄存器。判断缓冲区队列是否已存储满是通过将写指针寄存器值与多个读指针寄存器值 进行比较。每个应用程序分别判断是否有要接收的报文存储在缓冲区队列是通过将应用程 序对应的读指针寄存器值与写指针寄存器值进行比较。连续内存空间的大小根据计算机的内存大小确定。相应地,本发明提供一种基于零拷贝方式的多应用程序报文接收装置,包括申请 模块,用于在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;网卡相关寄 存器模块,包括一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存器,每个缓冲区队列读指针寄存器对应一个应用程序;报文存储模块,用于接收报文,并判断缓冲区队列 是否已存储满,如果缓冲区队列未存储满则将报文存储在缓冲区队列,同时更新写指针寄 存器;以及报文取走模块,用于判断每一个应用程序是否有要接收的报文存储在缓冲区队 列,如果有,则将报文从缓冲区队列中取走,同时更新应用程序对应的读指针寄存器。网卡相关寄存器模块还用于存储连续内存空间的转换成物理地址的首地址和连 续内存空间的大小。在报文存储模块中,判断缓冲区队列是否已存储满是通过将写指针寄存器值与多 个读指针寄存器值进行比较。在报文取走模块中,对每一个应用程序分别判断是否有要接收的报文存储在缓冲 区队列是通过将应用程序对应的读指针寄存器值与写指针寄存器值进行比较。在申请模块中,连续内存空间的大小根据计算机的内存大小确定。借助本发明上述至少一个技术方案,通过网卡驱动程序和网卡共同维护报文缓冲 区队列的信息,实现多个应用程序通过零拷贝方式接收数据报文,不需要进行同步、互斥操 作,明显降低CPU的占有率。


图1是本发明的基于零拷贝方式的多应用程序报文接收方法的流程图;图2是本发明的基于零拷贝方式的多应用程序报文接收装置的结构示意图。
具体实施例方式参见图1所示,本实施例的一种基于零拷贝方式的多应用程序报文接收方法,包 括下列步骤S110,在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;S120,在 网卡相关寄存器中设置一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存器,每 个缓冲区队列读指针寄存器对应一个应用程序;S130,网卡接收报文并判断缓冲区队列是 否已存储满,如果缓冲区队列未存储满则将报文存储在缓冲区队列,同时更新写指针寄存 器;以及S140,每个应用程序分别判断是否有要接收的报文存储在缓冲区队列中,如果有, 则将报文从缓冲区队列中取走,同时网卡驱动程序更新应用程序对应的缓冲区队列读指针 寄存器。在步骤SllO中,申请的连续内存空间的大小需要根据计算机内存的大小确定,连 续内存空间的大小可以是32MB、64MB或者其他不大于计算机内存大小的值。在步骤S120中,网卡相关寄存器是64位大小的接收报文缓冲区首地址配置寄存 器。网卡相关寄存器中包括一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存 器。缓冲区队列读指针寄存器有多个,是为了支持多个应用程序使用零拷贝方式接收数据 报文,每个应用程序对应一个缓冲区队列读指针寄存器。在步骤S130中,判断缓冲区队列是否已存储满的方法是将缓冲区队列写指针寄 存器值与多个缓冲区队列读指针寄存器值进行比较,如果写指针寄存器数值加一不等于读 指针寄存器数值,就说明缓冲区队列未存储满,网卡将接收到的报文存储在缓冲区队列中 写指针寄存器数值所在的偏移地址上,同时更新写指针寄存器,所说的更新写指针寄存器是指将写指针寄存器加上报文的总长度后写到写指针寄存器。如果缓冲区队列已存储满, 一种处理方法是网卡丢弃刚接收到的数据报文;另一种处理方法是让处理慢的应用程序放 弃对已接收但未处理的数据报文的处理,将这些数据报文全部丢弃,以留出空间接收新的 数据报文;这两种处理方法可以在加载网卡驱动程序时通过确定参数加以选择。在步骤S140中,每一个应用程序分别判断是否有其要接收 的报文存储在缓冲区 队列是通过将其对应的读指针寄存器值与写指针寄存器值进行比较。如果读指针寄存器数 值不等于写指针寄存器数值,就说明缓冲区队列存在该应用程序要接收的报文,将缓冲区 队列中读指针寄存器所在的偏移地址作为报文头返回给该应用程序,该应用程序从缓冲区 队列中取走报文,同时更新读指针寄存器,所说的更新读指针寄存器是指将读指针寄存器 数值加上报文总长度后写到读指针寄存器。当所有的应用程序都从报文缓冲区队列中取走 报文后,尾指针进行移动。相应地,本发明的一种基于零拷贝方式的多应用程序报文接收装置,包括申请模 块210,用于在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;网卡相关 寄存器模块220,包括一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存器,每个 缓冲区队列读指针寄存器对应一个应用程序;报文存储模块230,用于接收报文,并判断缓 冲区队列是否已存储满,如果缓冲区队列未存储满则将报文存储在缓冲区队列,同时更新 写指针寄存器;以及报文取走模块240,用于判断每一个应用程序是否有要接收的报文存 储在缓冲区队列,如果有,则将报文从缓冲区队列中取走,同时更新应用程序对应的读指针 寄存器。在申请模块中210中,连续内存空间的大小根据计算机的内存大小确定,例如连 续内存空间的大小可以是32MB、64MB或者其他不大于计算机内存大小的值。网卡相关寄存器模块220还用于存储连续内存空间的转换成物理地址的首地址 和连续内存空间的大小。在报文存储模块230中,判断缓冲区队列是否已存储满是通过将写指针寄存器值 与多个读指针寄存器值进行比较。如果写指针寄存器数值加一不等于读指针寄存器数值, 就说明缓冲区队列未存储满,网卡将接收到的报文存储在缓冲区队列中写指针寄存器数值 所在的偏移地址上,同时更新写指针寄存器,所说的更新写指针寄存器是指将写指针寄存 器加上报文的总长度后写到写指针寄存器。在报文取走模块240中,判断每一个应用程序是否有要接收的报文存储在缓冲区 队列是通过将应用程序对应的读指针寄存器值与写指针寄存器值进行比较。如果读指针寄 存器数值不等于写指针寄存器数值,就说明缓冲区队列存在该应用程序要接收的报文,将 缓冲区队列中读指针寄存器所在的偏移地址作为报文头返回给该应用程序,该应用程序从 缓冲区队列中取走报文,同时更新读指针寄存器,所说的更新读指针寄存器是指将读指针 寄存器数值加上报文总长度后写到读指针寄存器。在网卡相关寄存器模块220和报文取走模块240中,对多个应用程序使用程序号 进行区分。本发明通过网卡驱动程序和网卡共同维护报文缓冲区队列的信息,实现多个应用 程序通过零拷贝方式接收数据报文,不需要进行同步、互斥操作,明显降低了 CPU的占有率。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技 术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修 改、等同替换、改进等, 均应包含在本发明的保护范围之内。
权利要求
一种基于零拷贝方式的多应用程序报文接收方法,其特征在于,包括下列步骤在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;在网卡相关寄存器中设置一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存器,每个所述缓冲区队列读指针寄存器对应一个应用程序;网卡接收报文并判断所述缓冲区队列是否已存储满,如果所述缓冲区队列未存储满则将报文存储在所述缓冲区队列,同时更新所述写指针寄存器;以及每个所述应用程序分别判断是否有要接收的报文存储在所述缓冲区队列中,如果有,则将报文从所述缓冲区队列中取走,同时所述网卡驱动程序更新所述应用程序对应的所述缓冲区队列读指针寄存器。
2.根据权利要求1所述的接收方法,其特征在于,所述连续内存空间的首地址转换成 物理地址存储到所述网卡相关寄存器,所述连续内存空间的大小也存储到所述网卡相关寄 存器。
3.根据权利要求2所述的接收方法,其特征在于,所述判断所述缓冲区队列是否已存 储满是通过将所述写指针寄存器值与多个所述读指针寄存器值进行比较。
4.根据权利要求2所述的接收方法,其特征在于,每个所述应用程序分别判断是否有 要接收的报文存储在所述缓冲区队列是通过将所述应用程序对应的所述读指针寄存器值 与所述写指针寄存器值进行比较。
5.根据权利要求1至4任一所述的接收方法,其特征在于,所述连续内存空间的大小根 据计算机的内存大小确定。
6.一种基于零拷贝方式的多应用程序报文接收装置,其特征在于,包括申请模块,用于在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;网卡相关寄存器模块,包括一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄 存器,每个所述缓冲区队列读指针寄存器对应一个应用程序;报文存储模块,用于接收报文,并判断所述缓冲区队列是否已存储满,如果所述缓冲区 队列未存储满则将报文存储在所述缓冲区队列,同时更新所述写指针寄存器;以及报文取走模块,用于判断每一个应用程序是否有要接收的报文存储在所述缓冲区队 列,如果有,则将报文从所述缓冲区队列中取走,同时更新所述应用程序对应的所述读指针 寄存器。
7.根据权利要求6所述的接收装置,其特征在于,所述网卡相关寄存器模块还用于存 储所述连续内存空间的转换成物理地址的首地址和所述连续内存空间的大小。
8.根据权利要求7所述的接收装置,其特征在于,在所述报文存储模块中,所述判断所 述缓冲区队列是否已存储满是通过将所述写指针寄存器值与多个所述读指针寄存器值进 行比较。
9.根据权利要求7所述的接收装置,其特征在于,在所述报文取走模块中,所述对每一 个应用程序分别判断是否有要接收的报文存储在所述缓冲区队列是通过将所述应用程序 对应的所述读指针寄存器值与所述写指针寄存器值进行比较。
10.根据权利要求6至9任一所述的接收装置,其特征在于,在所述申请模块中,所述连 续内存空间的大小根据计算机的内存大小确定。
全文摘要
本发明提供一种基于零拷贝方式的多应用程序报文接收方法和装置,其中接收方法包括以下步骤在网卡驱动程序中申请连续内存空间作为报文接收的缓冲区队列;在网卡相关寄存器中设置一个缓冲区队列写指针寄存器和多个缓冲区队列读指针寄存器,每个缓冲区队列读指针寄存器对应一个应用程序;网卡接收报文,如果缓冲区队列未存储满则将报文存储在缓冲区队列,同时更新写指针寄存器;以及每个应用程序分别判断是否有要接收的报文存储在缓冲区队列中,如果有,则将报文从缓冲区队列中取走,同时网卡驱动程序更新应用程序对应的缓冲区队列读指针寄存器。本发明能够基于零拷贝方式,实现多个应用程序同时进行报文接收,明显降低了CPU的占有率。
文档编号G06F13/28GK101877666SQ200910238009
公开日2010年11月3日 申请日期2009年11月13日 优先权日2009年11月13日
发明者历军, 李永成, 聂华, 邵宗有 申请人:曙光信息产业(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1