官方文档查看地址:
http://doc.dpdk.org/guides/linux_gsg/cross_build_dpdk_for_arm64.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-getting-started-guide.html
本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆
4.交叉编译用于ARM64的DPDK
本章描述如何从x86构建主机交叉编译用于ARM64的DPDK。
请注意
虽然建议在ARM64上原生构建DPDK(就像x86一样),但是也可以为ARM64交叉构建DPDK。为此使用了ARM64交叉编译GNU工具链。
4.1得到交叉工具链
最新的交叉编译工具链可以从https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads下载。
下面是获取8.2版本的步骤,这是撰写本文时最新的版本。
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz
4.2解压缩并添加到路径中
tar -xvf gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz
export PATH=$PATH:<cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/bin
请注意
有关主机需求和其他信息,请参考发布说明部分:https://releases.linaro.org/components/toolchain/binaries/
4.3获取必备库
大多数现代机器都需要NUMA,而非NUMA架构则不需要。
请注意要编译NUMA库,请运行libtool -version
以确保libtool版本>= 2.2,否则编译将失败,并出现错误。
git clone https://github.com/numactl/numactl.git
cd numactl
git checkout v2.0.11 -b v2.0.11
./autogen.sh
autoconf -i
./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc --prefix=<numa install dir>
make install
numa头文件和lib文件分别在< numa install dir >下的include和lib文件夹中生成。
4.4使用NUMA支持增强交叉工具链
请注意这种方法是可选的,另一种方法是使用额外的CFLAGS和LDFLAGS,如下面的Configure and cross compile DPDK Build中描述。
复制NUMA头文件和库到交叉编译器的目录:
cp <numa_install_dir>/include/numa*.h <cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/include/
cp <numa_install_dir>/lib/libnuma.a <cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/8.2/
4.5配置并交叉编译DPDK构建
要配置构建,请选择目标配置之一,比如arm64-dpaa2-linux-gcc和arm64-thunderx-linux-gcc。
make config T=arm64-armv8a-linux-gcc
要交叉编译,无需编译内核模块,可以使用以下命令:
make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n
要交叉编译,包括内核模块,需要通过设置RTE_KERNELDIR指定内核源树:
make -j CROSS=aarch64-linux-gnu- RTE_KERNELDIR=<kernel_src_rootdir> CROSS_COMPILE=aarch64-linux-gnu-
要编译非numa目标,无需编译内核模块,可以使用以下命令:
make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n CONFIG_RTE_LIBRTE_VHOST_NUMA=n CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n
请注意
- 应该添加EXTRA_CFLAGS和EXTRA_LDFLAGS来分别包含NUMA头文件和链接库,如果跳过了上述使用NUMA支持来增强交叉工具链的步骤,则工具链没有使用NUMA支持来增强。
- 应该在EXTRA_CFLAGS中添加“-isystem <numa_install_dir>/include”,否则numa.h文件将会出现大量编译错误,如Werror=cast-qual、Werror=strict-prototype和Werror=old-style-definition。
例子如下:
make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n EXTRA_CFLAGS="-isystem <numa_install_dir>/include" EXTRA_LDFLAGS="-L<numa_install_dir>/lib -lnuma"
4.6介子交叉编译DPDK
要在所需的目标机器上交叉编译DPDK,可以使用以下命令:
meson cross-build --cross-file <target_machine_configuration>
ninja -C cross-build
例如,如果目标机器是arm64,我们可以使用以下命令:
meson arm64-build --cross-file config/arm/arm64_armv8_linux_gcc
ninja -C arm64-build