一种基于IntelDPDK的地址转换方法与流程

文档序号:15923526发布日期:2018-11-14 00:54阅读:601来源:国知局

本申请涉及计算机软件开发技术领域,特别涉及一种基于inteldpdk的地址转换方法。

背景技术

dpdk(dataplanedevelopmentkit,数据面开发套件)是intel公司提出的一种高速网络数据包的软件开发套件,现已开源。前期主要支持采用intelcpu及网卡的系统,现已支持ibmpower、cavium等其他cpu,以及部分非intel的网卡。dpdk通过旁路linux系统网络协议栈,直接对网卡进行读写,结合对多核cpu中不同内核的绑定,创造一个没有线程调度、没有系统调用、没有网卡中断的环境,能够实现10gbit网络小包流量下的线速收发。

dpdk模型示意图如图1所示。dpdk程序都是运行在用户面下的,dpdk直接从pcie(peripheralcomponentinterconnectexpress,高速外部设备互连)网口轮询接收网络包,然后送给linux操作系统内核协议栈,即从用户面向内核空间递交网络数据包。这需要从用户空间到内核空间的地址转换才能在内核看到数据包。反过来从linux内核协议栈向dpdk网口发送数据包时也是先要从内核空间将报文送到dpdk的用户空间,再由dpdk填进pcie网口。而dpdk用户空间是无法访问内核空间的,报文的交互都只能在linux内核完成(因为内核是能看到用户空间内容的,而用户空间不能读出内核的数据),因此,无论是接收方向还是发送方向,linux内核协议栈都要进行“从用户空间向内核的地址转换”。通常这种转换都是要先读出用户任务的任务结构块(structtask_struct),再在任务结构块的任务内存信息(structmm_struct)中找到该地址信息,然后通过pgd_offset函数找到该地址的页目录指针表(pdpt),再通过pud_offset函数找到该地址的中间级的页表的页目录表项pud,再用pud_offset找到页目录表项(pgd->pud->pmd),最后将表内地址转成内核地址,才能读写该地址内的数据。而且dpdk和其它用户程序通过ip交互时也需要这种地址转换。因此高效准确的地址转换对dpdk的使用很重要。

上述现有地址转换不仅步骤繁多,效率低,而且需要用户任务完全启动,该任务页表配置完成后才能进行,如果在页表配置完之前进行该任务页表的查找还会出现内存异常问题。通过在intel服务器、pc、嵌入式soc上对已有的dpdk多个版本的测试,证实:在内存转换处理上现有方法有较高的内存异常风险,而且分配的总内存zone空间越大,dpdk引起系统死机的风险越大。



技术实现要素:

本申请提供了一种基于inteldpdk的地址转换方法,以快速实现地址转换。

本申请提供了一种基于intel数据面开发套件dpdk的地址转换方法,包括:

在初始化时,对内核配置dpdk各个内存区zone的内核地址和用户地址的差值;

对每个从操作系统内核协议栈通过dpdk网口向外发送的或通过dpdk网口接收进内核协议栈的包,通过该包的地址利用所述配置的差值计算对应的内核地址。

较佳的,所述配置dpdk各个zone的内核地址和用户地址的差值的方式包括:

在内核空间建立两级表,其中,第一级表为查找表,用于存储zone地址,第二级表为索引表,用于存储各个zone的物理地址和用户地址的差值。

较佳的,所述通过该包的地址利用所述配置的差值计算对应的内核地址包括:通过该包的用户地址查找第一级表找到对应的zone,再根据所述zone查找第二级表,得到所述zone的物理地址和用户地址的差值,以用户地址减所述差值得到物理地址,物理地址再加上一个固定偏移得到对应的内核地址。

较佳的,所述配置dpdk各个zone的内核地址和用户地址的差值的方式包括:

在内核空间建立两级表,其中,第一级表为查找表,用于存储zone地址,第二级表为索引,用于存储各个zone的内核地址和用户的虚拟地址的差值。

较佳的,所述通过该包的地址利用所述配置的差值计算对应的内核地址包括:通过该包的用户地址查找第一级表找到对应的zone,再根据所述zone查找第二级表,得到所述zone的内核地址和用户的虚拟地址的差值,以用户地址减所述差值得到对应的内核地址。

较佳的,所述配置dpdk各个zone的内核地址和用户地址的差值的方式包括:

在内核空间建立一级表,所述表为查找表,用于存储各个zone的内核地址和用户地址的差值。

较佳的,所述通过该包的地址利用所述配置的差值计算对应的内核地址包括:通过该包的用户地址查找所述一级表找到对应的内核地址和用户地址的差值,以用户地址减所述差值得到对应的内核地址。

较佳的,所述查找表包括以下的至少一种:哈希查找表、树形查找表。

由上述技术方案可见,本申请提出的基于inteldpdk的地址转换方法,利用dpdk地址的特点通过建立各个zone的内核地址和用户地址的差值查找表,简单快速地实现了dpdk地址转换,有效避免了dpdk在管理大量zone进行数据收发中因地址转换导致内核异常的风险,提高了dpdk的稳定性。

附图说明

图1为dpdk模型示意图;

图2为本发明一级hash查找表示意图。

具体实施方式

为使本申请的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本申请作进一步详细说明。

内核的地址转换是以dpdk的mbuf(memorybuffer,存储器缓存)为单位的(mbuf的长度不固定,一般比网络包长一些),而dpdk的mbuf又是从memoryzone(内存区,每个zone的大小为2mb)分配得来的。同一个zone分配出来的地址,其内核地址和用户地址的差值固定;不同zone分配出来的地址,其内核地址和用户地址的差值可能不同,但有时不同zone分配出来的地址,其内核地址和用户地址的差值也可能相同。比如dpdk有2048个zone的内存用于分配mbuf,那么所有这些zone分配出来的mbuf,其内核地址和用户地址的差值可能只有15种(在同一台致强服务器上每次启动看到的分段数和差值数都不一样,有时只有6段而下次重启却是35段),而不是2048种差值。

dpdk驱动可以在初始化时将内存zone和其下内核地址和用户地址的差值配置给内核,这样内核每次收发报文时可以从该mbuf的用户地址找到对应的zone(实际上,将用户地址的后20比特清0就是zone地址),再找到该zone相关的内核地址和用户地址的差值,以用户地址减该差值得到物理地址,物理地址再加上一个固定偏移即可得到内核地址。

差值表的查找可以采用哈希(hash)查找。仍然以如前所述的2048个zone的内存为例,如果采用一级表,至少需要2048*(8+8)=32k的空间,由于存在zone内存空间不连续的情况,实际可能要40k空间存储一级表(只有所有zone内存连续才可以采用直接索引查找)。二级表采用简单的索引表,以如前所述的2048个zone只有15种差值为例,只需要建一个15个成员,每个成员8字节的索引表即可。这样,内核对每个从dpdk用户空间取到的mbuf地址,先用其zone地址通过hash查找的方法从一级表里找出对应表项,表项内容是二级表下的索引值,根据索引值从二级表取到差值,再以用户空间地址减该差值,再加上一个固定偏移就能得到内核地址。

下面结合附图并举实施例对本发明作进一步详细描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。

本发明提出的dpdk快速地址转换方法包括以下步骤:

步骤1:dpdk初始化时提取所有zone的内存地址,取得其用户地址和物理地址的差值。

以intel至强处理器为例,内存地址差值计算的具体实例如下:

用户空间地址为0x7fe745900000,对应的物理地址为0x823700000,两者差值为0x7fdf22200000。

步骤2:修改dpdk的kni_misc.c文件,在kni_ioctl()函数里增加相应的设置zone地址及差值表的控制功能接口。

步骤3:取得kni设备的文件描述符,dpdk初始化时已经打开了kni设备文件,这里只需从dpdk中取得相应文件描述符。

步骤4:对kni文件描述符调用ioctl(),将zone内存用户地址和物理地址的差值表配置到内核里。

步骤5:内核根据zone内存用户地址和物理地址的差值表建立一级zone地址hash表和第二级差值映射表。

一级zone地址hash表如图2所示,第二级差值映射表只是简单的差值列表(或者说每个成员64位的数组),下面是一个差值列表示例:

{0x7fdf22200000,0x7fe71e800000,0x7fe70d200000,0x7fdf59400000,0x7f584cc00000,0x7f5870600000,0x7f5894000000,…………}

步骤6:修改dpdk的kni_net.c文件里的kni_net_rx_normal()函数及kni_net_tx()函数,在kni_net_rx_normal()函数里对收到的每个包的mbuf地址(这是一个用户空间地址)取得其zone地址,用这个zone地址对步骤5建立的一级hash表进行hash查找,找出对应表项(是步骤5建立的二级表下的索引值),再从第二级差值映射表取得差值。在kni_net_tx()也是对每个从dpdk新得到的mbuf通过相同的方法查到差值。

步骤7:对每个从操作系统内核协议栈通过dpdk网口向外发送的或通过dpdk网口接收进内核协议栈的包,按步骤6查得其mbuf地址差值,再以用户空间地址减该差值就得到物理地址,然后用物理地址加上一个固定偏移就得到内核地址。

仍然以步骤1里的实例为例子:

假设内核读到mbuf的地址是0x7fe74596c740,那么,对应的zone是0x7fe74590000,按步骤7查出差值是0x7fdf22200000,补差值计算对应的物理地址就是0x7fe74596c740-0x7fdf22200000=0x82376c740,内核地址只需加上0xffff880000000000就得到实际的内核地址:

0x82376c740+0xffff880000000000=0xffff88082376c740

步骤8:mbuf内核地址下的指针都是dpdk用户空间地址(有的指向有效数据,有的指向下一个mbuf),对这种地址要么按步骤7转换得到内核的地址,要么根据有效数据相对mbuf头的固定偏移规律直接加上固定偏移得到有效数据内容。

上述步骤只是为了方便说明地址转换过程及原理,实际使用中可进一步简化或变通:比如建差值表时直接用zone的内核地址减用户的虚拟地址,这样内核收到mbuf后补差值直接就得到内核上的地址,不需要经过计算物理地址这一中间环节。再比如可以将差值直接存在hash查找表里,不需要建第二级差值映射表。或者采用树形查找等其它方法代替hash查找。或者采用更大的页表以减少查找项。以上等同替代方式都属于本申请思想。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1