一种实现armcpu用户态收发报文的方法

文档序号:6547975阅读:263来源:国知局
一种实现arm cpu用户态收发报文的方法
【专利摘要】本发明公开了一种实现ARM?CPU用户态收发报文的方法,所述方法包括:对ARM网口的内核驱动进行整改,除去Linux内核中ARM网口初始化函数中挂载的关于中断及收发包的函数;将所述除去的ARM网口初始化函数中关于收发包的函数移植到用户态;用户态在初始化时从内核获取大块连续内存,并对这块物理连续内存进行单独管理,使得用户态空间可以访问到DMA的内存;用户态在初始化时进行与ARM网口收发相关的硬件寄存器的配置,使得收发包过程中用户态可以读写与ARM网口收发相关的硬件控制寄存器;用户态收发报文。本发明消除了内核态收发包触发大量中断及数据包到用户态拷贝致使消耗大量CPU性能的缺陷,提高了设备的转发性能。
【专利说明】—种实现ARM CPU用户态收发报文的方法

【技术领域】
[0001]本发明属于计算机网络【技术领域】,具体涉及一种实现ARM CPU用户态收发报文的方法。

【背景技术】
[0002]ARM CPU多为内核驱动,网口初始化与收发包都部署在内核态,这样在数据报文大流量的冲击下会引发大量的中断,导致消耗一定的CPU资源,同时Linux操作系统的内核态到用户态的数据拷贝也会损耗大量的CPU性能,如果能够使用用户态来收发报文,则会大大提高设备的转发报文性能。
[0003]因此,有必要提供一种实现ARM CPU用户态收发报文的方法,使得用户态空间可以访问到DMA的内存,实现用户态收发报文,以解决上述技术问题。


【发明内容】

[0004]本发明的目的是提供一种实现ARM CPU用户态收发报文的方法,使得用户态空间可以访问到DMA的内存,实现用户态收发报文,以解决使用内核态收发报文导致消耗大量CPU性能,不利于提高设备转发性能的缺陷。
[0005]根据本发明的一个方面,提供一种实现ARM CPU用户态收发报文的方法,包括以下步骤:步骤SI,对ARM网口的内核驱动进行整改,除去Linux内核中ARM网口初始化函数中挂载的关于中断及收发包的函数;步骤S2,将所述除去的ARM网口初始化函数中关于收发包的函数移植到用户态;步骤S3,用户态在初始化时从内核获取大块连续内存,并对这块物理连续内存进行单独管理,使得用户态空间可以访问到DMA的内存;步骤S4,用户态在初始化时进行与ARM网口收发相关的硬件寄存器的配置,使得收发包过程中用户态可以读写与ARM网口收发相关的硬件控制寄存器;步骤S5,用户态进行收发报文。
[0006]其中,在上述发明中,所述步骤S2进一步包括:步骤S21,将与ARM网口收发包相关的处理函数移植到用户态;步骤S22,对用户态中植入后的与ARM网口收发包相关的处理函数进行整改,去掉一些用户态不需要的操作;步骤S23,创建线程进行收包,编译链接生成可执行程序。
[0007]其中,在上述发明中,所述收包采用轮询方式进行。
[0008]其中,在上述发明中,所述步骤S3进一步包括:步骤S31,在Linux内核初始化时,申请大块连续内存,以备用户态收发包申请skb使用;步骤S32,用户态初始化时,通过1ctl方式从内核获取已申请的所述大块连续内存的地址和大小;步骤S33,采用_ap函数将所述大块连续内存的地址映射为用户态可操作的虚拟地址,使得收发包使用的skb申请和释放可以在映射后的这块内存中进行。
[0009]其中,在上述发明中,所述步骤S31进一步包括:在Linux内核初始化时,利用Bigphysarea申请所述大块连续内存,以备用户态收发包申请skb使用。
[0010]其中,在上述发明中,所述已申请的所述大块连续内存的大小为300M。
[0011]其中,在上述发明中,所述步骤S4进一步包括:步骤S41,用户态在初始化时获取与ARM网口收发相关的硬件寄存器的物理基地址及寄存器空间的大小;步骤S42,将所述获取的硬件寄存器的物理基地址及寄存器空间的大小定义为宏,通过_ap函数将硬件寄存器的基地址映射为用户态虚拟地址。
[0012]其中,在上述发明中,所述步骤S5进一步包括:用户态通过执行ARM网口的收发包初始化函数,分配收发资源,控制寄存器的配置、接口注册及收发函数挂载,来实现收发报文。
[0013]其中,在上述发明中,所述分配收发的资源包括队列、描述符和buffer缓存。
[0014]根据本发明的一种实现ARM CPU用户态收发报文的方法,将ARM网口的内核驱动进行整改并在内核进行加载,而将网络数据报文的收发则移植到用户态,消除了内核态收发包触发大量中断及数据包到用户态拷贝致使消耗大量CPU性能的缺陷,提高了设备的转发性能。

【专利附图】

【附图说明】
[0015]图1显示了现有技术中的Linux内核态收发报文的结构示意图;
[0016]图2显示了本发明的实现ARM CPU用户态收发报文的结构示意图;
[0017]图3显示了本发明优选实施例的实现ARM CPU用户态收发报文方法的流程图;
[0018]图4显示了图3中步骤S2的子流程图;
[0019]图5显示了图3中步骤S3的子流程图;
[0020]图6显示了图3中步骤S4的子流程图。

【具体实施方式】
[0021]为使本发明的目的、技术方案和优点更加清楚明了,下面结合【具体实施方式】并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
[0022]图1显示了现有技术中的Linux内核态收发报文的结构示意图。
[0023]如图1所示,在现有技术中,ARM CPU多为内核驱动,网口初始化与收发包都部署在内核态,使得Linux系统通过内核态来收发报文,再将报文拷贝至用户态,但是在数据报文大流量的冲击下会引发大量的中断,这样会导致消耗一定的CPU资源,同时Linux操作系统的内核态到用户态的数据拷贝也会损耗大量的CPU性能。
[0024]图2显示了本发明的实现ARM CPU用户态收发报文的结构示意图。
[0025]如图2所示,在本发明中,将ARM网口的内核驱动进行整改并在内核进行加载,而将网络数据报文的收发则移植到用户态,实现用户态直接收发报文,消除了内核态收发包触发大量中断及数据包到用户态拷贝致使消耗大量CPU性能的缺陷,提高了设备的转发性倉泛。
[0026]图3显示了本发明优选实施例的实现ARM CPU用户态收发报文方法的流程图;图4显示了图3中步骤S2的子流程图;图5显示了图3中步骤S3的子流程图;图6显示了图3中步骤S4的子流程图。
[0027]如图3所示,本发明优选实施例的实现ARM CPU用户态收发报文方法包括以下步骤:
[0028]步骤SI,对ARM网口的内核驱动进行整改,除去Linux内核中ARM网口初始化函数中挂载的关于中断及收发包的函数。
[0029]一般地,ARM CPU多为内核驱动,网口初始化与收发包都部署在内核态,使得Linux系统通过内核态来收发报文,再将报文拷贝至用户态。在步骤SI中,对ARM网口的内核驱动进行整改,除去Linux内核中ARM网口初始化函数中挂载的关于中断及收发包的函数,使得内核不再使用中断收发报文,只进行正常的网口初始化及一些硬件控制寄存器的配置。
[0030]步骤S2,将所述除去的ARM网口初始化函数中关于收发包的函数移植到用户态。
[0031]本步骤将内核中的ARM网口初始化函数中关于收发包的函数移植到用户态,使得用户态直接收发报文,消除内核态收发包触发大量中断及数据包到用户态拷贝致使消耗大量CPU性能的缺陷,提高设备的转发性能。
[0032]其中,步骤S2如图4所示,包括下述子步骤:
[0033]步骤S21,将与ARM网口收发包相关的处理函数移植到用户态。即将内核中的ARM网口初始化函数中关于收发包的函数移植到用户态。
[0034]步骤S22,对用户态中植入后的与ARM网口收发包相关的处理函数进行整改,去掉一些用户态不需要的操作。并不是将所有与ARM网口收发包相关的处理函数都保留在用户态,而是为了在提高系统转发性能的同时尽量减小CPU性能的消耗,将一些用户态不需要的操作去掉,例如CPU控制等是用户态所不需要的操作,因此可以去掉。
[0035]步骤S23,创建线程进行收包,编译链接生成可执行程序。优选地,采用轮询方式进行收包。
[0036]步骤S3,用户态在初始化时从内核获取大块连续内存,并对这块物理连续内存进行单独管理,使得用户态空间可以访问到DMA的内存。
[0037]具体来说,步骤S3如图5所示,包括下述子步骤:
[0038]步骤S31,在Linux内核初始化时,申请大块连续内存,以备用户态收发包申请skb使用。具体地,在Linux内核初始化时,利用Bigphysarea向内核申请大块连续内存,以备用户态收发包申请skb使用,skb是标识报文的一个数据结构,包括报文头、数据段等,内核的所有业务处理都基于skb数据结构完成,其中Bigphysarea为大块内存申请的补丁,可以有效地解决Linux系统无法申请大块连续内存的问题。在步骤S31中,优先地,向内核申请大小为300M的连续内存,当然所要申请的连续内存的大小可以根据系统总内存的大小自行定义,如果总内存越大,相应地可以申请更大的连续内存,反之要减小所要申请的连续内存的大小。
[0039]步骤S32,用户态初始化时,通过1ctl (1ctl是设备驱动程序中对设备的I/O通道进行管理的函数,可用于用户态和内核间通信)方式从内核获取所述申请的大块连续内存的地址和大小。具体地,通过1ctl方式对申请的内存进行检测,检测出该内存的地址和大小,如果检测到地址和大小相符,则进行获取。
[0040]步骤S33,采用_ap函数将所述大块连续内存的地址映射为用户态可操作的虚拟地址,使得收发包使用的skb申请和释放可以在映射后的这块内存中进行。
[0041]在步骤S33中,完成地址的映射操作,将步骤S31中申请到的内存的地址映射为用户态可操作的虚拟地址,使得用户态可以对这块物理连续内存进行单独管理,以实现用户态空间可以访问到DMA的内存。
[0042]步骤S4,用户态在初始化时进行与ARM网口收发相关的硬件寄存器的配置,使得收发包过程中用户态可以读写与ARM网口收发相关的硬件控制寄存器。
[0043]具体来说,步骤S4如图6所示,包括下述子步骤:
[0044]步骤S41,用户态在初始化时获取与ARM网口收发相关的硬件寄存器的物理基地址及寄存器空间的大小。
[0045]步骤S42,将所述获取的硬件寄存器的物理基地址及寄存器空间的大小定义为宏,通过_ap函数将硬件寄存器的基地址映射为用户态虚拟地址。
[0046]通过步骤S41和步骤S42的流程,用户态先获取与ARM网口收发相关的硬件寄存器的物理基地址及寄存器空间的大小,再使用_ap函数将硬件寄存器的基地址映射为用户态虚拟地址,使得用户态可以对与ARM网口收发相关的硬件寄存器进行管理,保证收发包过程中用户态可以读写与ARM网口收发相关的硬件控制寄存器。
[0047]步骤S5,用户态收发报文。
[0048]在步骤S5中,具体地,用户态执行ARM网口的收发包初始化函数,该执行过程和内核执行过程相似,在所有与收发相关的操作中都需执行。另外,用户态分配收发资源,控制寄存器的配置、接口注册及收发函数挂载,实现收发报文。其中分配收发的资源包括队列、描述符、buffer缓存等。
[0049]通过采用上述流程,先采用Bigphysarea申请大块连续内存,然后采用mmap函数将申请的内存的物理地址映射为用户态虚拟地址,使得用户态空间可以访问到DMA的内存,并且在用户态进行与ARM网口收发相关的硬件寄存器的配置,实现了用户态收发报文,消除了内核态收发包触发大量中断及数据包到用户态拷贝致使消耗大量CPU性能的缺陷,进而提高了设备转发性能。
[0050]应当理解的是,本发明的上述【具体实施方式】仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
【权利要求】
1.一种实现ARM CPU用户态收发报文的方法,其特征在于,包括以下步骤: 步骤SI,对ARM网口的内核驱动进行整改,除去Linux内核中ARM网口初始化函数中挂载的关于中断及收发包的函数; 步骤S2,将所述除去的ARM网口初始化函数中关于收发包的函数移植到用户态; 步骤S3,用户态在初始化时从内核获取大块连续内存,并对这块物理连续内存进行单独管理,使得用户态空间可以访问到DMA的内存; 步骤S4,用户态在初始化时进行与ARM网口收发相关的硬件寄存器的配置,使得收发包过程中用户态可以读写与ARM网口收发相关的硬件控制寄存器; 步骤S5,用户态收发报文。
2.根据权利要求1所述的方法,其特征在于,所述步骤S2进一步包括: 步骤S21,将与ARM网口收发包相关的处理函数移植到用户态; 步骤S22,对用户态中植入后的与ARM网口收发包相关的处理函数进行整改,去掉一些用户态不需要的操作; 步骤S23,创建线程进行收包,编译链接生成可执行程序。
3.根据权利要求2所述的方法,其特征在于,所述收包采用轮询方式进行。
4.根据权利要求1所述的方法,其特征在于,所述步骤S3进一步包括: 步骤S31,在Linux内核初始化时,申请大块连续内存,以备用户态收发包申请skb使用; 步骤S32,用户态初始化时,通过1ctl方式从内核获取已申请的所述大块连续内存的地址和大小; 步骤S33,采用_ap函数将所述大块连续内存的地址映射为用户态可操作的虚拟地址,使得收发包使用的skb申请和释放可以在映射后的这块内存中进行。
5.根据权利要求4所述的方法,其特征在于,所述步骤S31进一步包括: 在Linux内核初始化时,利用Bigphysarea申请所述大块连续内存,以备用户态收发包申请skb使用。
6.根据权利要求4所述的方法,其特征在于,所述已申请的所述大块连续内存的大小为 300M。
7.根据权利要求1所述的方法,其特征在于,所述步骤S4进一步包括: 步骤S41,用户态在初始化时获取与ARM网口收发相关的硬件寄存器的物理基地址及寄存器空间的大小; 步骤S42,将所述获取的硬件寄存器的物理基地址及寄存器空间的大小定义为宏,通过mmap函数将硬件寄存器的基地址映射为用户态虚拟地址。
8.根据权利要求1所述的方法,其特征在于,所述步骤S5进一步包括: 用户态通过执行ARM网口的收发包初始化函数,分配收发资源,控制寄存器的配置、接口注册及收发函数挂载,来实现收发报文。
9.根据权利要求8所述的方法,其特征在于,所述分配收发的资源包括队列、描述符和buffer 缓存。
【文档编号】G06F12/08GK104050101SQ201410232336
【公开日】2014年9月17日 申请日期:2014年5月29日 优先权日:2014年5月29日
【发明者】高福亮 申请人:汉柏科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1