作者简介:王栋,英特尔数据中心平台应用工程师,主要负DPDK、Intel处理器平台、QuickAssist加速卡以及Xeon/FPGA的技术支持
文章转载自DPDK与SPDK开源社区
在某些DPDK开发环境中,编译服务器是固定的(使用Xeon系列CPU),但DPDK应用的部署平台往往与编译服务器不同(Atom、Core和Xeon)。为了让编译器使用部分平台特有指令对软件进行优化,DPDK在编译时通过TARGET的第二个字段指定了平台(ARCH-MACHINE-EXECENV-TOOLCHAIN),目前用于i686、x86_64的TARGET模板使用的都是native,所以有时会导致DPDK应用在部署平台上无法运行。
本文所引用的代码和DPDK程序均来自DPDK-17.11,编译器使用gcc 4.8.5。
下面的l2fwd是在Intel® Xeon E5 2658v4设备上使用T=x86_64-native-linuxapp-gcc编译的,无法在Intel® Atom C3858上运行,提示程序中含有非法的指令:
TARGET模板对应的配置文件都在config/目录中,文件名字以defconfig_开头。
在config/defconfig_x86_64-native-linuxapp-gcc中,“native”赋值给了 CONFIG_RTE_MACHINE:
在DPDK进行编译时,会:
根据CONFIG_RTE_MACHINE查找mk/machine中保存的每个平台的编译参数,传递给gcc编译器。DPDK为大部分平台定义了常用的编译参数,这些文件在mk/machine目录中:
所以,针对Intel平台,我们也可以通过在config目录中创建不同的TARGET模板文件来灵活地为部署平台编译DPDK应用。
在为目标平台创建配置文件前,先来说一下machine目录中的intel平台的全称:
如果你不确定目标平台的code name,可以在ark.intel.com查询。下面以Intel® Xeon E5645作为目标平台来演示一下如何创建新的配置文件并进行交叉编译。
第一步
在ark.intel.com上查找的Intel® Xeon E5645的结果如下:
Xeon E5645的平台名称为Westmere。
第二步
在config目录中复制一下defconfig_x86_64-native-linuxapp-gcc并改名为defconfig_x86_64-wsm-linuxapp-gcc。
第三步
修改defconfig_x86_64-wsm-linuxapp-gcc,将平台名称改为wsm。
第四步
使用T=x86_64-wsm-linuxapp-gcc来编译DPDK,编译DPDK应用时使用的RTE_TARGET也设置为x86_64-wsm-linuxapp-gcc。
以上就是一个简单的跨Intel®平台编译的过程,在后续的编译过程中,直接使用x86_64-wsm-linuxapp-gcc即可。
然而,以上是一个非常理想的情况,有时你会发现目标平台的配置文件不在mk/machine目录中……
在文章开始,我是在Intel® Atom C3858的平台上证明DPDK程序在不同的Intel® 平台上也有指令不兼容的问题。但是我后来却拿Xoen E5645来举例,为什么?因为我发现mk/machine里没有Denverton (Intel® Atom C3858平台的Code Name)……目前很多公司使用基于Intel®平台的工控机+DPDK来做一些网络设备,这些工控机使用的CPU涵盖了Intel的高中低端,各个领域(例如用于平板电脑的CPU),各个系列。的确,Intel支持DPDK的工程师也无法提供所有的配置文件,这时就需要你自己构建mk/machine目录里的配置文件了。
因为此时DPDK没有提供相应的编译器选项,先要确定这个平台在gcc对应的-march是什么,使用同一版本的gcc在部署平台上运行下面的命令:
可以看到-march参数为slm,Silvermont的简写,Denverton和Silvermont是有一些渊源的。
在mk/machine中添加新的目录,Intel® Atom C3858的平台Code Name是Denverton,简写为dnv:
修改mk/machine/dnv/rte.vars.mk,将-march设置为slm:
按照前面介绍的步骤,使用x86_64-dnv-linuxapp-gcc来重新编译DPDK和l2fwd,我将新生成的l2fwd改名为l2fwd-dnv来进行区分。在Intel® Atom C3858上测试l2fwd-dnv,运行成功: