用于零拷贝缓冲区队列网络数据发送和接收的处理方法和装置的制作方法

文档序号:7720898阅读:175来源:国知局
专利名称:用于零拷贝缓冲区队列网络数据发送和接收的处理方法和装置的制作方法
技术领域
本发明涉及通信领域,尤其涉及一种用于零拷贝缓冲区队列网络数据发送和接收
的处理方法和装置。
背景技术
相关技术中公开了一种零拷贝缓冲区队列网络数据发送的管理方法,属于网络数 据零拷贝的数据缓冲区队列的管理方法领域。该技术方案包括如下操作步骤A、在用户空 间分配连续的内存作为报文的DMA缓冲区;B、在内核驱动中建立缓冲区的控制句柄;C、应 用程序通过接口库映射控制句柄,实现对缓冲区的操作;D、发送报文时,驱动把满缓冲区的 物理地址写入网卡,应用从满缓冲区队列取出一个填充了报文的缓冲区,发送报文内容后 把缓冲区放入空缓冲区队列。
该技术存在以下问题 (1)网卡驱动程序使用缓冲区描述符进行报文发送时DMA操作的效率很低;
(2)需要采用中断作为驱动程序与网卡硬件之间的通讯方式;
(3)发送的数据报文不是连续存储在报文DMA缓冲区中的,而是按照页面大小,比 如4K字节,分别对发送的数据报文进行存储。 上述问题的根本原因是,在用户空间申请的连续内存空间可能在内核空间并不是 连续的内存地址。这样,它需要将用户空间内存地址按页面大小转换成DMA操作所需的物 理地址。而且,网卡硬件在做DMA操作时,数据报文长度限制在页面大小范围内,比如4K字 节。驱动程序也需要使用中断方式与网卡硬件通讯,获得网卡进行报文传输后的硬件状态, 为后续的报文发送准备报文DMA缓冲区。

发明内容
针对相关技术中存在的一个或多个问题,本发明的目的在于提供一种用于零拷贝 缓冲区队列网络数据发送和接收的处理方法和装置,以解决上述问题中的至少之一。
为实现上述目的,根据本发明的一个方面,提供了一种用于零拷贝缓冲区队列网 络数据发送的处理方法,该方法包括在网卡驱动程序中申请预定大小的连续内存作为用 于报文发送的缓冲区队列;将所申请的连续内存的首地址转换为物理地址并将物理地址和 内存的大小存储到网卡相关寄存器中;以及在网卡寄存器中设置用于缓冲区队列的读指针 寄存器和写指针寄存器,在发送报文时,根据所要发送的报文、物理地址以及内存的大小更 新读指针寄存器和写指针寄存器。 为实现上述目的,根据本发明的另一个方面,提供了一种用于零拷贝缓冲区队列 网络数据发送的处理装置,其特征在于,装置包括内存申请单元,用于在网卡驱动程序中 申请预定大小的连续内存作为用于报文发送的缓冲区队列;转换单元,用于将所申请的连 续内存的首地址转换为物理地址并将物理地址和内存的大小存储到网卡相关寄存器中;以及寄存器设置和更新单元,用于在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写 指针寄存器,在发送报文时,根据所要发送的报文、物理地址以及内存的大小更新读指针寄 存器和写指针寄存器。 为实现上述目的,根据本发明的再一个方面,提供了一种用于零拷贝缓冲区队列 网络数据接收的处理方法,该方法包括在网卡驱动程序中申请预定大小的连续内存作为 用于报文接收的缓冲区队列;将所申请的连续内存的首地址转换为物理地址并将物理地址 和内存的大小存储到网卡相关寄存器中;以及在网卡寄存器中设置用于缓冲区队列的读指 针寄存器和写指针寄存器,在接收报文时,根据所接收的报文、物理地址和内存的大小更新 读指针寄存器和写指针寄存器。 为实现上述目的,根据本发明的又一个方面,提供了一种用于零拷贝缓冲区队列 网络数据接收的处理装置,包括内存申请单元,用于在网卡驱动程序中申请预定大小的连 续内存作为用于报文接收的缓冲区队列;转换单元,用于将所申请的连续内存的首地址转 换为物理地址并将物理地址和内存的大小存储到网卡相关寄存器中;寄存器设置和更新单 元,用于在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,并且在接 收报文时,根据所接收的报文、物理地址和内存的大小更新读指针寄存器和写指针寄存器。
借助本发明上述至少一个技术方案,通过将所申请的内存的首地址转换成物理地 址存储到相关寄存器中,并在发送和接收报文时及时地更新相关寄存器中的指针位置,这 样不需要采用中断方式通知驱动程序数据报文发送和接收情况,并且不占用CPU资源,也 不需要将用户空间内存地址按页面大小转换成DMA操作所需的物理地址,并且网卡硬件在 做DMA操作及发送和接收的数据报文在存储时,不受页面大小限制,比如4K字节,不需要使 用缓冲区描述符进行缓冲区队列的管理。


图1是根据本发明的用于零拷贝缓冲区队列网络数据发送的处理方法的流程以及 图2是根据本发明的用于零拷贝缓冲区队列网络数据发送的处理装置的框图; 图3是根据本发明的用于零拷贝缓冲区队列网络数据接收的处理方法的流程图; 以及 图4是根据本发明的用于零拷贝缓冲区队列网络数据接收的处理装置的框图。
具体实施方式

功能概述 考虑到相关技术中存在的的问题,本发明提出用于零拷贝缓冲区队列网络数据发 送和接收的处理方法和装置,通过申请连续的内存作为发送或接收报文的缓冲区队列,将 所申请的内存的首地址转换成物理地址存储到相关寄存器中,并在发送或接收报文时及时 地更新相关寄存器中的指针位置,这样不需要采用中断方式通知驱动程序数据报文发送或 接收情况,并且不占用CPU资源,也不需要将用户空间内存地址按页面大小转换成DMA操作 所需的物理地址,并且网卡硬件在做DMA操作及发送和接收的数据报文在存储时,不受页 面大小限制,比如4K字节,不需要使用缓冲区描述符进行缓冲区队列的管理。
图1是根据本发明的用于零拷贝缓冲区队列网络数据发送的处理方法的流程图。
如图1所示,根据本发明的用于零拷贝缓冲区队列网络数据发送的处理方法包括 以下步骤 步骤S102,在网卡驱动程序中申请预定大小的连续内存作为用于报文发送的缓冲 区队列; 步骤S104,将所申请的连续内存的首地址转换为物理地址并将物理地址和内存的 大小存储到网卡相关寄存器中;以及 步骤S106,在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存 器,在发送报文时,根据所要发送的报文、物理地址以及内存的大小更新读指针寄存器和写 指针寄存器。 其中,可以通过配置文件指定所申请的连续内存的大小,也可以在驱动程序进行 加载时通过参数指定所申请的连续内存的大小。内存的大小需要根据计算机的内存大小确 定,例如32MB,64MB等。网卡相关寄存器可以为发送缓冲区首地址配置寄存器,其可以是64 位大小的。网卡寄存器本身就是一个存储32位数的内存空间。 在发送报文时,可以通过应用程序更新写指针寄存器,并且可以通过网卡更新读 指针寄存器。 在应用程序发送报文时,将读指针寄存器和写指针寄存器进行比较,如果写指针 寄存器的数值加上数据报文的长度不等于读指针寄存器的数值,则将报文存储在缓冲区中 的写指针寄存器的数值所在的偏移地址上,并将写指针寄存器的数值加上报文的总长度后 写到写指针寄存器中。 在网卡发送报文时,将读指针寄存器和写指针寄存器进行比较,如果读指针寄存 器的数值不等于写指针寄存器的数值,则将缓冲区队列中读指针寄存器的数值所在的偏移 地址作为报文头进行报文发送操作,并将读指针寄存器的数值加上报文的总长度之后写到 读指针寄存器中。 图2是根据本发明的用于零拷贝缓冲区队列网络数据发送的处理装置的框图。 如图2所示,根据本发明的用于零拷贝缓冲区队列网络数据发送的处理装置包
括内存申请单元202,用于在网卡驱动程序中申请预定大小的连续内存作为用于报文发
送的缓冲区队列;转换单元204,用于将所申请的连续内存的首地址转换为物理地址并将
物理地址和内存的大小存储到网卡相关寄存器中;以及寄存器设置和更新单元206,用于
在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,在发送报文时,根
据所要发送的报文、物理地址以及内存的大小更新读指针寄存器和写指针寄存器。 其中,可以通过配置文件指定所申请的连续内存的大小,也可以在驱动程序进行
加载时通过参数指定所申请的连续内存的大小。 在应用程序发送报文时,寄存器设置和更新单元将读指针寄存器和写指针寄存器 进行比较,如果写指针寄存器的数值加上数据报文长度不等于读指针寄存器的数值,则将 报文存储在缓冲区中的写指针寄存器的数值所在的偏移地址上,并将写指针寄存器的数值 加上报文的总长度后写到写指针寄存器中。 在网卡发送报文时,寄存器设置和更新单元将读指针寄存器和写指针寄存器进行 比较,如果读指针寄存器的数值不等于写指针寄存器的数值,则将缓冲区队列中读指针寄存器的数值所在的偏移地址作为报文头进行报文发送操作,并将读指针寄存器的数值加上 报文的总长度之后写到读指针寄存器中。 图3是根据本发明的用于零拷贝缓冲区队列网络数据接收的处理方法的流程图。
如图3所示,根据本发明的用于零拷贝缓冲区队列网络数据接收的处理方法包括 以下步骤 步骤S302,在网卡驱动程序中申请预定大小的连续内存作为用于报文接收的缓冲 区队列; 步骤S304,将所申请的连续内存的首地址转换为物理地址并将物理地址和内存的 大小存储到网卡相关寄存器中;以及 步骤S306,在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存 器,在接收报文时,根据所接收的报文、物理地址和内存的大小更新读指针寄存器和写指针
寄存器。 其中,可以通过配置文件指定所申请的连续内存的大小,也可以在驱动程序进行 加载时通过参数指定所申请的连续内存的大小。大小需要根据计算机的内存大小确定,例 如32MB,64MB等。网卡寄存器本身可以是一个存储32位数的内存空间。其中,网卡相关寄 存器可以为接收缓冲区首地址配置寄存器,接收缓冲区首地址配置寄存器可以是64位大 小的。 在驱动程序与用户运行的应用程序之间,存在一个应用程序可以调用的函数接口
库。函数接口库的目的是方便用户应用程序的编写及屏蔽驱动程序及网卡设备的内部实
现。因此,可以通过应用程序更新读指针寄存器,并且通过网卡更新写指针寄存器。 在应用程序接收报文时,将读指针寄存器和写指针寄存器进行比较,如果读指针
寄存器的数值不等于写指针寄存器的数值,则将缓冲区队列中读指针寄存器的数值所在的
偏移地址作为报文头返回给应用程序。 在网卡接收报文时,将读指针寄存器和写指针寄存器进行比较,如果写指针寄存 器的数值加上数据报文长度不等于读指针寄存器,则将报文存储在缓冲区中的写指针寄存 器的数值所在的偏移地址上,并将写指针寄存器的数值加上报文的总长度后写到写指针寄 存器中。 图4是根据本发明的用于零拷贝缓冲区队列网络数据接收的处理装置的框图。
如图4所示,根据本发明的用于零拷贝缓冲区队列网络数据接收的处理装置包 括内存申请单元402,用于在网卡驱动程序中申请预定大小的连续内存作为用于报文接 收的缓冲区队列;转换单元404,用于将所申请的连续内存的首地址转换为物理地址并将 物理地址和内存的大小存储到网卡相关寄存器中;寄存器设置和更新单元406,用于在网 卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,并且在接收报文时,根 据所接收的报文、物理地址和内存的大小更新读指针寄存器和写指针寄存器。
其中,内存申请单元可以通过配置文件指定所申请的连续内存的大小,也可以通 过在驱动程序进行加载时利用参数指定所申请的连续内存的大小。大小需要根据计算机的 内存大小确定,例如32MB,64MB等。网卡寄存器本身可以是一个存储32位数的内存空间。 其中,网卡相关寄存器可以为接收缓冲区首地址配置寄存器,接收缓冲区首地址配置寄存 器可以是64位大小的。
在应用程序接收报文时,寄存器设置和更新单元将读指针寄存器和写指针寄存器 进行比较,如果读指针寄存器的数值不等于写指针寄存器的数值,则将缓冲区队列中读指 针寄存器的数值所在的偏移地址作为报文头返回给应用程序。 在网卡接收报文时,寄存器设置和更新单元将读指针寄存器和写指针寄存器进行 比较,如果写指针寄存器的数值加上数据报文长度不等于读指针寄存器,则将报文存储在 缓冲区中的写指针寄存器的数值所在的偏移地址上,并将写指针寄存器的数值加上报文的 总长度后写到写指针寄存器中。 综上所述,借助本发明上述至少一个技术方案,通过申请连续的内存作为发送或 接收报文的缓冲区队列,将所申请的内存的首地址转换成物理地址存储到相关寄存器中, 并在发送或接收报文时及时地更新相关寄存器中的指针位置,能够实现以下技术效果
(1)网卡不需要采用中断方式通知驱动程序数据报文发送或接收完成情况,不占 用CPU资源; (2)不需要将用户空间内存地址按页面大小转换成DMA操作所需的物理地址;
(3)网卡硬件在做DMA操作及发送的数据报文在存储时,不受页面大小限制,比如 4K字节; (4)不需要使用缓冲区描述符进行缓冲区队列的管理。 显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用 的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成 的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储 在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们 中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的 硬件和软件结合。 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技 术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修 改、等同替换、改进等,均应包含在本发明的保护范围之内。
8
权利要求
一种用于零拷贝缓冲区队列网络数据发送的处理方法,其特征在于,包括在网卡驱动程序中申请预定大小的连续内存作为用于报文发送的缓冲区队列;将所申请的连续内存的首地址转换为物理地址并将所述物理地址和所述内存的大小存储到网卡相关寄存器中;以及在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,在发送报文时,根据所要发送的报文、所述物理地址以及所述内存的大小更新所述读指针寄存器和所述写指针寄存器。
2. 根据权利要求1所述的方法,其特征在于,通过配置文件指定所申请的连续内存的 大小,或在驱动程序进行加载时通过参数指定所申请的连续内存的大小。
3. 根据权利要求1所述的方法,其特征在于,在发送报文时,通过应用程序更新写指针 寄存器,并且通过网卡更新读指针寄存器,在应用程序发送报文时,将所述读指针寄存器和所述写指针寄存器进行比较,如果所 述写指针寄存器的数值加上数据报文长度不等于所述读指针寄存器的数值,则将所述报文 存储在所述缓冲区中的所述写指针寄存器的数值所在的偏移地址上,并将所述写指针寄存 器的数值加上报文的总长度后写到所述写指针寄存器中;在所述网卡发送报文时,将所述读指针寄存器和所述写指针寄存器进行比较,如果所 述读指针寄存器的数值不等于所述写指针寄存器的数值,则将所述缓冲区队列中所述读指 针寄存器的数值所在的偏移地址作为报文头进行报文发送操作,并将所述读指针寄存器的 数值加上报文的总长度之后写到所述读指针寄存器中。
4. 一种用于零拷贝缓冲区队列网络数据发送的处理装置,其特征在于,所述装置包括内存申请单元,用于在网卡驱动程序中申请预定大小的连续内存作为用于报文发送的 缓冲区队列;转换单元,用于将所申请的连续内存的首地址转换为物理地址并将所述物理地址和所 述内存的大小存储到网卡相关寄存器中;以及寄存器设置和更新单元,用于在网卡寄存器中设置用于缓冲区队列的读指针寄存器和 写指针寄存器,在发送报文时,根据所要发送的报文、所述物理地址以及所述内存的大小更 新所述读指针寄存器和所述写指针寄存器。
5. 根据权利要求4所述的方法,其特征在于,通过配置文件指定所申请的连续内存的 大小,或在驱动程序进行加载时通过参数指定所申请的连续内存的大小。
6. 根据权利要求5所述的方法,其特征在于在应用程序发送报文时,寄存器设置和更新单元将所述读指针寄存器和所述写指针 寄存器进行比较,如果所述写指针寄存器的数值加上数据报文长度不等于所述读指针寄存 器的数值,则将所述报文存储在所述缓冲区中的所述写指针寄存器的数值所在的偏移地址 上,并将所述写指针寄存器的数值加上报文的总长度后写到所述写指针寄存器中;以及在所述网卡发送报文时,寄存器设置和更新单元将所述读指针寄存器和所述写指针寄 存器进行比较,如果所述读指针寄存器的数值不等于所述写指针寄存器的数值,则将所述 缓冲区队列中所述读指针寄存器的数值所在的偏移地址作为报文头进行报文发送操作,并 将所述读指针寄存器的数值加上报文的总长度之后写到所述读指针寄存器中。
7. —种用于零拷贝缓冲区队列网络数据接收的处理方法,其特征在于,包括 在网卡驱动程序中申请预定大小的连续内存作为用于报文接收的缓冲区队列; 将所申请的连续内存的首地址转换为物理地址并将所述物理地址和所述内存的大小存储到网卡相关寄存器中;以及在所述网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,并且在接 收报文时,根据所接收的报文、所述物理地址和所述内存的大小更新所述读指针寄存器和 所述写指针寄存器。
8. 根据权利要求7所述的方法,其特征在于,通过配置文件指定所申请的连续内存的 大小,或在驱动程序进行加载时通过参数指定所申请的连续内存的大小。
9. 根据权利要求7所述的方法,其特征在于,在接收报文时,通过应用程序更新读指针 寄存器,并且通过网卡更新写指针寄存器,在所述应用程序接收报文时,将所述读指针寄存器和所述写指针寄存器进行比较,如 果所述读指针寄存器的数值不等于所述写指针寄存器的数值,则将所述缓冲区队列中所述 读指针寄存器的数值所在的偏移地址作为报文头返回给应用程序;在所述网卡接收报文时,将所述读指针寄存器和所述写指针寄存器进行比较,如果所 述写指针寄存器的数值加上数据报文长度不等于所述读指针寄存器,则将所述报文存储在 所述缓冲区中的所述写指针寄存器的数值所在的偏移地址上,并将所述写指针寄存器的数 值加上报文的总长度后写到所述写指针寄存器中。
10. —种用于零拷贝缓冲区队列网络数据接收的处理装置,其特征在于,包括 内存申请单元,用于在网卡驱动程序中申请预定大小的连续内存作为用于报文接收的缓冲区队列;转换单元,用于将所申请的连续内存的首地址转换为物理地址并将所述物理地址和所 述内存的大小存储到网卡相关寄存器中;寄存器设置和更新单元,在所述网卡寄存器中设置用于缓冲区队列的读指针寄存器和 写指针寄存器,并且在接收报文时,根据所接收的报文、所述物理地址和所述内存的大小更 新所述读指针寄存器和所述写指针寄存器。
11. 根据权利要求io所述的装置,其特征在于,所述内存申请单元通过配置文件指定所申请的连续内存的大小,或所述内存申请单元通过在驱动程序进行加载时利用参数指定 所申请的连续内存的大小。
12. 根据权利要求10所述的装置,其特征在于,在应用程序接收报文时,所述寄存器设 置和更新单元将所述读指针寄存器和所述写指针寄存器进行比较,如果所述读指针寄存器 的数值不等于所述写指针寄存器的数值,则将所述缓冲区队列中所述读指针寄存器的数值 所在的偏移地址作为报文头返回给应用程序;以及在所述网卡接收报文时,所述寄存器设置和更新单元将所述读指针寄存器和所述写指 针寄存器进行比较,如果所述写指针寄存器的数值加上数据报文长度不等于所述读指针寄 存器,则将所述报文存储在所述缓冲区中的所述写指针寄存器的数值所在的偏移地址上, 并将所述写指针寄存器的数值加上报文的总长度后写到所述写指针寄存器中。
全文摘要
本发明提供一种用于零拷贝缓冲区队列网络数据发送和接收的处理方法和装置,其中,该数据发送的处理方法包括在网卡驱动程序中申请预定大小的连续内存作为用于报文发送的缓冲区队列;将所申请的连续内存的首地址转换为物理地址并将物理地址和内存的大小存储到网卡相关寄存器中;以及在网卡寄存器中设置用于缓冲区队列的读指针寄存器和写指针寄存器,在发送报文时,根据所要发送的报文、物理地址以及内存的大小更新读指针寄存器和写指针寄存器。
文档编号H04L12/56GK101707564SQ20091024209
公开日2010年5月12日 申请日期2009年12月4日 优先权日2009年12月4日
发明者历军, 李永成, 聂华, 邵宗有 申请人:曙光信息产业(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1