一种零拷贝网络报文接收方法

文档序号:7665179阅读:129来源:国知局
专利名称:一种零拷贝网络报文接收方法
技术领域
本发明涉及一种计算机网络数据接收方法,特别是涉及一种把内存直接映射为网卡DMA緩冲区的零拷贝网络^^文接收方法。
技术背景现有技术的计算机操作系统使用的是分层思想,网卡驱动在内核层运行, 给网卡分配报文緩沖区,接收报文时通过软中断处理报文緩沖区与应用数据区 中的数据,而在软中断处理中,是通过协议栈来实现数据接收的,所以这种网 络数据接收方式,虽然保证了一般操作系统上的通用性,但由于现有技术的数 据接收过程需通过内核传递,而不是用户内存与网络直接接收,所以对要求高 速传送的高速网上的应用来说,现有技术已不能满足应用的需要。发明内容本发明针对现有技术中,网卡接收报文要经过内核协议栈拷贝到用户空 间,致使收包速度低、浪费系统资源,无法满足高速网应用对数据拷贝的速 度要求的问题,提供了一种使应用能够直接访问网卡DMA緩冲区,从而极大 提高网络数据接收速度,满足高速网应用的零拷贝方法。 为了实现上述发明目的,本发明采用下述技术方案 一种零拷贝网络报文接收方法,其中,所述方法包括如下操作步骤A、应用程序调用接口库提供的函数打开设备接口; B、打开设备接口函数在用户空间 内存中申请一片连续的内存作为报文緩冲区,并把緩沖区首地址传给内核驱动; C、内核驱动根据緩沖区首地址及緩冲区大小,构造緩沖区控制结构,并把控制 结构的物理地址传给接口函数,所述结构包括才艮文緩冲区队列的信息及队列中 每个緩冲区的物理地址;D、接口函数根据緩冲区控制结构的地址,通过内存映
射得到緩冲区控制结构中的信息;E、网卡驱动程序从緩沖区队列中取空闲缓沖区作为接收报文的DMA緩冲区,并把接收到的报文数据不经内核空间直接DMA传送到用户内存中的报文接收緩沖区中;F、应用程序处理用户内存中报文接收緩冲区中的报文数据。一种优选的零拷贝网络报文接收方法,其中,所述步骤B中的报文接收緩冲区队列的长度由参数指定,每个緩沖区的大小为2KB,为保证在用户空间申请的緩冲区位于连续的内存页面上,接口库函数申请的内存为共享内存,所述步骤B中的具体操作步骤为Bl、接口库函数申请共享緩冲区,并连接到共享緩冲区;B2、接口库函数把共享緩冲区的首地址通过系统调用传给驱动。进一步优选的零拷贝网络报文接收方法,其中,所述步骤C的具体操作步骤 为Cl、内核驱动根据整个緩冲区队列的大小计算需要的緩沖区控制结构的大 小;C2、内核驱动申请连续的页面来构造缓冲区队列控制结构;C3、内核驱动 计算报文队列中每个緩冲区的物理地址,并将所述地址保存在一张物理地址表 中以便DMA使用;C4、内核驱动计算报文緩冲区队列控制结构的物理地址,并 将所述地址传给应用接口库函数。进一步优选的零拷贝网络报文接收方法,其中,所述步骤D的具体操作步骤 为Dl、用户接口库函数从系统调用返回的数据结构中获得内核驱动中构造的 緩冲区队列控制结构的物理地址;D2、用户接口库函数打开内存设备文件;D3、 用户接口库函数通过系统调用把内核中的緩冲区控制结构映射到自己的地址空间。进一步优选的零拷贝网络报文接收方法,其中,所述步骤E的具体操作步骤 为El、网卡驱动在给网卡分配DMA緩沖区的时候不从系统协议栈中分配緩沖 区,而是根据零拷贝缓冲区的控制结构,从用户空间的緩沖队列中取出空闲緩 冲区作DMA使用;E2、网卡把报文通过匿A方式写入緩冲区后发中断给驱动, 驱动把缓冲区放入应用的收包队列。进一步优选的零拷贝网络报文接收方法,其中,所述步骤F的具体操作步骤
为Fl、应用程序通过緩冲区控制结构确定已经在哪些緩冲区内有报文;F2、 应用程序不需要把4艮文从内核空间拷贝到用户空间而直接使用这些报文。本发明的上述技术方案,由于采用了直接访问网卡DMA緩冲区的零拷贝 方法,可满足高速网应用对数据接收的速度要求,与现有网络数据接收技术 相比,进一步节省了系统资源;由于引入了内存镜像连接技术,因此用户程 序可以直接访问内核空间的数据,甚至可以直接访问物理设备内存中的数 据,从而为应用提供了灵活、方便的数据接收机制,为开发人员提供了更广 泛的开发环境;本发明的数据接收(拷贝)是在用户空间申请内存进行的, 因此可以构造大空间的数据接收緩沖区,甚至可以达到GB级;由于在拷贝 过程中,可直接映射物理内存,从而避免了新增内核模块带来的不稳定性; 本发明在国家网络信息安全中心,在主干网上测试为进行报文分析而对专有 应用捕获报文,与现有技术相比,报文传输速度大大提高,比如在intel82546 千兆网卡上,经过协议栈的接收64字节的报文,速度最高为每秒接收270000 包,占用80%以上的cpu;但是用零拷贝方法接收报文,速度可以达到每秒 710000包,占用cpu不到10% 。以下结合附图对本发明做进一步详细说明。


图1为本发明操作步骤示意图; 图2为本发明步骤B的具体操作过程示意图; 图3为本发明步骤C的具体操作过程示意图; 图4为本发明步骤D的具体操作过程示意图; 图5为本发明步骤E的具体操作过程示意图; 图6为本发明步骤F的具体操作过程示意图。
具体实施方式
在本发明上述技术方案的设计思想下,本发明可以有多种,下面通过具体
实施例予以iJL明。实施例一图1为本发明操作步骤示意图。在linux操作环境中,如图1所示,本发 明执行如下操作步骤A、 应用程序调用接口库提供的打开设备函数。在本步骤中,首先打开网卡 设备,确定DMA緩存大小及分配给接收队列的百分比,设置接收模式、发送模 式;以上操作成功则返回网卡设备ID。B、 打开设备接口函数程序在用户空间内存中申请一片连续的内存作为报文 緩冲区。并把緩冲区首地址传给内核驱动。在本步骤中,检查系统初始设置的最大共享内存值,若请求内存值大于 系统默认共享内存值,则对系统默认内存值进行修改。根据所需的内存大小 来分配共享内存,成功返回内存的起始地址后,就可以对内存进行保存数据 或锁定操作。在使用完内存后,将此内存归还给系统。C、 内核驱动根据緩冲区首地址和緩沖区大小等相关参数,构造緩冲区控制 结构,其中包括报文緩沖区队列的信息,队列中每个緩沖区的物理地址等。并 把控制结构的物理地址传给接口函数。在本步骤中,驱动程序会申请一块内存,作为全局的控制句柄,成员包 括描述发送和接收报文的队列,此队列由空闲的接收队列、空闲的传输队列、 緩存数据报的接收队列及緩存数据报的发送队列组成;描述驱动工作模式的变量,工作模式包含正常模式和直接拷贝模式;用于进程同步及互斥的变量 等。控制句柄进行初始化后,把用户空间中发送和接收报文地址区域分割成若干数据块,将每一块的首地址转换成内核空间的物理地址,即DMA操作 所需的地址,存储在控制句柄的队列结构中。D、 接口函数根据緩沖区控制结构的地址,通过内存映射得到緩沖区控制结构。本实施例中通过映射緩存句柄的物理地址到用户空间的虛拟地址实现以上 操作。到这里为止,内核驱动和用户接口函数就都能拿到緩沖区的控制结构中 的信息了。E、 网卡驱动程序从緩冲区队列中取空闲緩冲区作为接收报文的DMA緩沖 区,可以把接收到的报文数据不经内核空间直接DMA传送到用户内存中的报文 接收緩冲区中;F、 应用程序处理用户内存中报文接收緩沖区中的报文数据。实施例二本实施例与实施例一的不同之处在于,本发明步骤B的具体操作过程如示 意图2所示,所述步骤B中的报文接收緩冲区队列的长度可以由参数指定,每 个缓冲区的大小为2KB,为保证在用户空间申请的緩冲区位于连续的内存页面 上,接口库函数申请的内存为共享内存,因为在linux操作系统中,共享内存 位于连续的物理页面上。具体操作步骤为Bl、接口库函数申请共享緩冲区,并连接到共享緩沖区。B2、接口库函数把共享緩沖区的首地址通过ioctl系统调用传给驱动。实施例三本实施例与实施例二的不同之处在于,本发明步骤C的具体操作过程如示 意图3所示,所述步骤C的具体操作步骤为Cl、内核驱动根据整个緩沖区队列的大小计算需要的緩冲区控制结构的大小。C2、内核驱动申请连续的页面来构造緩沖区队列控制结构。 C3、内核驱动计算队列中每个緩沖区的物理地址,保存在一张物理地址表 中以便DMA使用。C4、内核驱动计算緩冲区队列控制结构的物理地址,传给应用接口库函数。 实施例四本实施例与实施例三的不同之处在于,本发明步骤D的具体操作过程如示意图4所示,所述步骤D的具体操作步骤为Dl、用户接口库函数从系统调用返回数据结构中获得内核驱动中构造的緩冲区队列控制结构的物理地址。D2、用户接口库函凄t打开内存设备文件/dev/mem。D3、用户接口库函数通过系统调用隱ap把内核中的緩沖区控制结构映射到 自己的地址空间。本实施例与实施例四的不同之处在于,本发明步骤E的具体操作过程如示 意图5所示,所述步骤E的具体操作步骤为El、网卡驱动在给网卡分配DMA緩冲区的时候不从系统协议栈中分配緩冲 区,而是根据零拷贝緩沖区的控制结构,从用户空间的緩沖队列中取出空闲緩 冲区作DMA使用。E2、网卡把报文通过薩A方式写入緩冲区后会发中断给驱动,驱动把緩冲 区》丈入应用的收包队列。本实施例与实施例五的不同之处在于,本发明步骤F的具体操作过程如示 意图6所示,所述步骤F的具体操作步骤为Fl、应用程序通过缓沖区控制结构确定已经在哪些緩沖区内有报文;实施例五实施例F2 、应用程序不需要把报文从内核空间拷贝到用户空间而直接使用这些报文。最后应当说明的是以上实施例仅用以说明本发明的技术方案而非对其限 制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解依然可以对本发明的具体实施方式
进行修改或者等同替换,而未 脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利 要求范围当中。
权利要求
1、一种零拷贝网络报文接收方法,其中,所述方法包括如下操作步骤A、应用程序调用接口库提供的函数打开设备接口;B、打开设备接口函数在用户空间内存中申请一片连续的内存作为报文缓冲区,并把缓冲区首地址传给内核驱动;C、内核驱动根据缓冲区首地址及缓冲区大小,构造缓冲区控制结构,并把控制结构的物理地址传给接口函数,所述结构包括报文缓冲区队列的信息及队列中每个缓冲区的物理地址;D、接口函数根据缓冲区控制结构的地址,通过内存映射得到缓冲区控制结构中的信息;E、网卡驱动程序从缓冲区队列中取空闲缓冲区作为接收报文的DMA缓冲区,并把接收到的报文数据不经内核空间直接DMA传送到用户内存中的报文接收缓冲区中;F、应用程序处理用户内存中报文接收缓冲区中的报文数据。
2、 如权利要求1所述的零拷贝网络报文接收方法,其中,所述步骤B中的 报文接收緩冲区队列的长度由参数指定,每个緩冲区的大小为2KB,为保证在 用户空间申请的緩冲区位于连续的内存页面上,接口库函数申请的内存为共享 内存,所述步骤B中的具体操作步骤为Bl、接口库函数申请共享緩冲区,并连接到共享緩沖区; B2、接口库函数把共享緩沖区的首地址通过系统调用传给驱动。
3、如权利要求1所述的零拷贝网络报文接收方法,其中,所述步骤C的具 体操作步骤为Cl 、内核驱动根据整个緩冲区队列的大小计算需要的緩冲区控制结 构的大小;C2、内核驱动申请连续的页面来构造緩冲区队列控制结构;C3、内核驱动计算报文队列中每个緩沖区的物理地址,并将所述地址保存在一张物理地址表中以便DMA使用;C4、内核驱动计算报文緩冲区队列控制结构的物理地址,并将所述地址传给应用接口库函数。
4、 如权利要求1所述的零拷贝网络报文接收方法,其中,所述步骤D的具 体操作步骤为D1 、用户接口库函数从系统调用返回的数据结构中获得内核驱动中构造的緩冲区队列控制结构的物理地址;D2、用户接口库函数打开内存设备文件;D3 、用户接口库函数通过系统调用把内核中的緩冲区控制结构映射 到自己的地址空间。
5、 如权利要求1所述的零拷贝网络报文接收方法,其中,所述步骤E的具 体操作步骤为El、网卡驱动在给网卡分配DMA緩冲区的时候不从系统协议栈中 分配緩冲区,而是根据零拷贝緩冲区的控制结构,从用户空间的緩 冲队列中取出空闲緩冲区作DMA使用;E2、网卡4巴才艮文通过DMA方式写入緩冲区后发中断给驱动,驱动 4巴緩冲区放入应用的收包队列。
6、 如权利要求1所述的零拷贝网络报文接收方法,其中,所述步骤F的具 体操作步骤为Fl、应用程序通过緩冲区控制结构确定已经在哪些緩冲区内有报文;F2 、应用程序不需要把报文从内核空间拷贝到用户空间而直接使用 这些报文。
全文摘要
本发明公开了一种零拷贝网络报文接收方法,属于把用户空间内存直接映射为网卡DMA缓冲区的零拷贝方法领域。本发明采用下述技术方案A.应用程序调用接口库提供的函数打开设备接口;B.在用户空间内存中申请报文缓冲区;C.构造缓冲区控制结构;D.通过内存映射得到缓冲区控制结构中的信息;E.接收到的报文数据直接DMA传送到报文接收缓冲区中;F.处理报文接收缓冲区中的报文数据。本发明适用于接收网络数据的零拷贝管理方法。
文档编号H04L12/54GK101150488SQ20071017737
公开日2008年3月26日 申请日期2007年11月15日 优先权日2007年11月15日
发明者刘朝辉, 军 历, 宇 曾, 华 聂 申请人:曙光信息产业(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1