一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法

文档序号:7759605阅读:230来源:国知局
专利名称:一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法
技术领域
本发明涉及一种Linux系统中实现高速收发包的方法,尤其是一种在报发收发过 程中零拷贝的收发包方法,具体地说是一种Linux下基于网卡驱动的零拷贝以太网报文捕 获及发送的实现方法。
背景技术
[在网络通信监控及流量分析等应用中,需要实现大流量的高性能的对报文进行 捕获或者发送,通常所采用socket及libpcap等方式进行报文的捕获及发送的性能往往达 不到系统所要求的性能需求,成为整个系统中的性能瓶颈。这些通用方案在报文到达网卡, 有网卡驱动接收到报文后,会进行大量的处理及多次拷贝动作,包括从内核态向用户空间 进行报文的拷贝,这些操作虽然保证了较好的通用性,但也导致了其性能不满足系统的需 求。

发明内容
本发明的目的是针对现有的报文收发包均需进行反复拷贝才能完成收发过程造 成速度难以提高的问题,发明一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送 的实现方法。本发明的技术方案是
一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法,其特征是它 包括以下步骤
首先,在内核态报文驱动模块中建立捕包队列、报文释放队列、报文缓存队列及发送队 列以实现对报文的管理,并创建相应的报文填充线程、报文释放线程及报文发送线程;
其次,在加载网卡驱动且打开相应的网卡设备时,立即向前述报文驱动模块进行网卡 设备注册,获得相应的报文发送接口 ;
第三,在用户进程中将整个物理内存映射到用户空间,使得用户进程可以直接访问整 个物理内存;
第四,当用户进程需要进行报文捕获或者发送时,通过Linux下的/proc文件项方式通 知内核态报文驱动模块进行初始化工作,创建相应资源及记录用户进程的初始配置,初始 化成功后,用户进程即可进程报文捕获及发送;
最后,采用物理地址在用户态和内核态之间进行数据交互,在用户态使用过程中将用 户态的物理地址转换为虚拟地址,在内核态使用过程时,将内核态的物理地址其转换为内 核虚拟地址,以实现零拷贝的以太网报文捕获及发送。所述的报文填充线程负责申请报文缓存,并将报文指针的物理地址放入报文缓存 队列;所述的报文释放线程负责从报文释放队列中取出待释放报文指针,并相应缓存释放; 所述的报文发送线程负责从报文发送队列中取出待释放报文指针,并将该报文发送出去;当网卡接收到报文,网卡驱动将报文上送到报文驱动模块,报文驱动模块将报文指针的物 理地址放入相应的捕包队列中。所述的用户进程通过dmesg启动信息或者/proc/iomem文件获取到当前物理地址 的最大值,并将当前进程空间使用的内存大小设置为无限制(即当前进程空间可使用的内 存大小没有上限设置),同时根据获取到的最大物理地址使用mmap将整个物理内存映射到 用户进程空间。所述的内核报文驱动模块注册初始化/proc文件项及其读写方法,然后由用户进 程打开初始化/proc文件项,并向所述的初始化/proc文件项中写入初始配置项;内核态报 文驱动模块获取到初始配置后,分配相应资源,设置捕包配置;内核初始化成功后,用户进 程获取映射相应资源到用户空间,则用户进程可以通过相应资源捕获及发送报文。所述的报文捕获方法是当报文到达网卡时,网卡驱动接收报文并将其上送到报 文驱动模块,报文驱动模块将报文的物理地址放入捕包队列中,用户进程从捕包队列中取 到报文的物理地址,转换为用户进程空间的虚拟地址,即可实现对报文数据的访问。所述的报文发送方法是当用户进程需要发送报文时,首先从报文缓存队列中取 出一个报文缓存的物理地址,转换为用户进程的虚拟地址,填充要发送的报文内容,然后将 该报文物理地址放入相应发送队列,内核报文驱动模块从发送队列中取出待发送报文的物 理地址,将其转换为内核态虚拟地址,调用网卡设备的发送接口,即可将该报文发送出去。本发明的有益效果
本发明直接将网卡驱动接收到的报文传递到用户空间,中间没有任何的拷贝动作,用 户进程也可以将要发送的报文直接传递到网卡驱动进行报文的发送,中间也没有任何的拷 贝动作,从而极大的提高了报文的捕获及发送速率,能够较好的满足网络通信监控及流量 分析等应用对报文捕获及发送有高性能的要求。本发明采用用户进程映射整个物理内存,采用物理地址在内核态和用户态之间 进行内存共享,从而实现用户进程直接捕获到内核中网卡驱动接收到的报文,以及直接在 用户进程中将要发送报文通过网卡驱动发送出去,省去的正常的内核态和用户态之间数据 拷贝,以及Linux协议栈对报文的复杂的处理流程,从而极大的提高了报文的捕获及发送 性能,并且降低了 CPU的消耗。将测试,在IBM X3650M2服务器(CPU为Xeon X556X2,内 存16GB)上使用该方法进行报文转发能够达到3. 8Gbps的报文转发性能,而CPU消耗不到 10%。因此,本发明能够满足网络流量监控及分析等应用对报文的收发的高性能要求,且能 够使用较少的资源达到该目的,从而基本不会影响上层应用对资源的使用。本发明采用分 层实现,使得该方法能够同时支持多种类型的网卡,且易于添加对新网卡的支持。本发明采用分层实现,使得该方法能够同时支持多种类型的网卡,且易于添加对 新网卡的支持。本发明在报文的捕获和发送过程中没有一次拷贝动作,能够实现高性能的报文捕 获及发送,适用于网络流量监控及分析等对报文的收发的性能有很高要求的情景。


图1为本发明实现方法的框架结构示意图。图2为本发明的内核态报文驱动模块的工作过程示意图。
5
图3为本发明的网卡加载注册过程示意图。图4为本发明的物理内存映射到用户空间的具体操作过程示意图。图5为本发明的内核态报文驱动模具初始化过程示意图。图6为本发明的捕包报文的流程示意图。图7为本发明的发送报文的流程示意图。
具体实施例方式下面结合附图和实施例对本发明作进一步的说明。如图1-7所示。一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法,它包括 以下步骤
A、在内核态报文驱动模块中建立捕包队列,报文释放队列,报文缓存队列及发送队列, 实现对报文的管理,并创建相应的报文填充线程,报文释放线程及发送线程;
Linux系统启动之后,首先加载内核报文驱动模块,该模块负责将报文在用户空间和网 卡驱动之间进行直接传递,而省略两者之间的复杂处理过程。其具体操作步骤如图2所示。B、当加载相应网卡驱动并网卡设备被打开时,会向报文驱动模块进行注册设备, 及相应的报文发送接口;
当网卡驱动向报文驱动模块注册设备成功后,报文驱动模块将获取到相应网卡的设备 指针,报文驱动模块即可通过该指针获取网卡设备相关属性,属性设置接口以及通过该网 卡发送报文接口。其具体操作步骤如图3所示。C、在用户进程中将整个物理内存映射到用户空间,使得用户进程可以之间访问整 个物理内存;
当用户进程映射整个物理内存到进程空间后,用户进程即可直接访问到这个物理内 存,而Linux内核中使用的虚拟地址和物理地址为一一对应关系,内核网卡驱动接收到的 报文,存储在内核空间中,用户进程只要取得该报文的物理地址即可实现对该报文的直接 访问,也同样可以实现对队列资源的内核和用户进程共享,同时进行操作。本发明即是利用 这种对应关系为基础实现报文的零拷贝捕获及发送。其具体操作步骤如图4所示。D、当用户进程需要进行报文捕获或者发送时,通过Linux下的/proc文件项方式 通知内核报文驱动模块进行相关初始化工作,创建相应资源及记录用户进程的初始配置, 初始化成功后,用户进程即可进程报文捕获及发送;
内核报文驱动模块在加载时,即会注册相应PR0C文件项,为用户进程向内核报文驱动 模块注册提供接口。Linux下的PR0C文件项为用户态和内核态进行数据交互的一种方式。 其具体操作步骤如图5所示。E、用户态和内核态之间进行数据交互时均采用物理地址,在用户态中使用时,要 将物理地址转换为虚拟地址,在内核态使用时,也要将其转换为内核虚拟地址。当报文到达网卡时,网卡驱动接收报文并将其上送到报文驱动模块,报文驱动模 块将报文的物理地址放入捕包队列中,用户进程从捕包队列中取到报文的物理地址,转换 为用户进程空间的虚拟地址,即可实现对报文数据的访问,其具体操作步骤如图6所示。当用户进程需要发送报文时,首先从报文缓存队列中取出一个报文缓存的物理地址,转换为用户进程的虚拟地址,填充要发送的报文内容,然后将该报文物理地址放入相应 发送队列,内核报文驱动模块从发送队列中取出待发送报文的物理地址,将其转换为内核 态虚拟地址,调用网卡设备的发送接口,即可将该报文发送出去,其具体操作步骤如图7所示 o本发明实现方法的框架结构如图1所示,它由底层(包括各类型网卡)、核心层(包 括内核态的报文驱动模块和各类型网卡驱动)、交换层(物理内存)和工作层(用户进程)组 成。以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定 本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在 不脱离本发明构思的前提下,还可以做出若干推演或替换,都应当视为属于本发明的保护 范围。本发明未涉及部分均与现有技术相同或可采用现有技术加以实现。
权利要求
一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法,其特征是它包括以下步骤:首先,在内核态报文驱动模块中建立捕包队列、报文释放队列、报文缓存队列及发送队列以实现对报文的管理,并创建相应的报文填充线程、报文释放线程及报文发送线程; 其次,在加载网卡驱动且打开相应的网卡设备时,立即向前述报文驱动模块进行网卡设备注册,获得相应的报文发送接口;第三,在用户进程中将整个物理内存映射到用户空间,使得用户进程可以直接访问整个物理内存;第四,当用户进程需要进行报文捕获或者发送时,通过Linux下的/proc文件项方式通知内核态报文驱动模块进行初始化工作,创建相应资源及记录用户进程的初始配置,初始化成功后,用户进程即可进程报文捕获及发送;最后,采用物理地址在用户态和内核态之间进行数据交互,在用户态使用过程中将用户态的物理地址转换为虚拟地址,在内核态使用过程时,将内核态的物理地址其转换为内核虚拟地址,以实现零拷贝的以太网报文捕获及发送。
2.根据权利要求1所述的Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实 现方法,其特征是所述的报文填充线程负责申请报文缓存,并将报文指针的物理地址放入 报文缓存队列;所述的报文释放线程负责从报文释放队列中取出待释放报文指针,并相应 缓存释放;所述的报文发送线程负责从报文发送队列中取出待释放报文指针,并将该报文 发送出去;当网卡接收到报文,网卡驱动将报文上送到报文驱动模块,报文驱动模块将报文 指针的物理地址放入相应的捕包队列中。
3.根据权利要求1所述的Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实 现方法,其特征是所述的用户进程通过dmesg启动信息或者/proc/iomem文件获取到当前 物理地址的最大值,并将当前进程空间使用的内存大小设置为无限制,同时根据获取到的 最大物理地址使用mmap将整个物理内存映射到用户进程空间。
4.根据权利要求1所述的Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的 实现方法,其特征是所述的内核报文驱动模块注册初始化/proc文件项及其读写方法,然 后由用户进程打开初始化/proc文件项,并向所述的初始化/proc文件项中写入初始配置 项;内核态报文驱动模块获取到初始配置后,分配相应资源,设置捕包配置;内核初始化成 功后,用户进程获取映射相应资源到用户空间,则用户进程可以通过相应资源捕获及发送 报文。
5.根据权利要求1所述的Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实 现方法,其特征是所述的报文捕获方法是当报文到达网卡时,网卡驱动接收报文并将其上 送到报文驱动模块,报文驱动模块将报文的物理地址放入捕包队列中,用户进程从捕包队 列中取到报文的物理地址,转换为用户进程空间的虚拟地址,即可实现对报文数据的访问。
6.根据权利要求1所述的Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实 现方法,其特征是所述的报文发送方法是当用户进程需要发送报文时,首先从报文缓存队 列中取出一个报文缓存的物理地址,转换为用户进程的虚拟地址,填充要发送的报文内容, 然后将该报文物理地址放入相应发送队列,内核报文驱动模块从发送队列中取出待发送报 文的物理地址,将其转换为内核态虚拟地址,调用网卡设备的发送接口,即可将该报文发送出去。
全文摘要
一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法,一、用户进程将整个物理内存映射到用户进程空间;二、使用队列方式管理报文驱动模块接收到的报文及要通过其发送的报文;三、使用报文驱动模块隔离各类型网卡驱动的区别对用户进程的影响;四、各类型网卡驱动加载成功后向报文驱动模块注册设备及相关操作方法。本发明采用分层实现,使得该方法能够同时支持多种类型的网卡,且易于添加对新网卡的支持。本发明在报文的捕获和发送过程中没有一次拷贝动作,能够实现高性能的报文捕获及发送,适用于网络流量监控及分析等对报文的收发的性能有很高要求的情景。
文档编号H04L12/26GK101917350SQ20101027960
公开日2010年12月15日 申请日期2010年9月13日 优先权日2010年9月13日
发明者姚文顶 申请人:南京中兴特种软件有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1