3. DPDK在Layerscape上的环境搭建
Layerscape(如LS1046A、LS2088A、LX2160A)是ARM64架构的SoC,DPDK运行在板卡的Linux用户态,因此环境搭建的核心是"宿主机交叉编译 + 目标板部署运行"两条链路。本节以LS1046A(4×Cortex-A72,参考板为LS1046ARDB)为例,走通从工具链到l2fwd的完整闭环。所有参数均为教学示例,实际以所用BSP和DPDK版本为准。
一、交叉编译工具链
Layerscape SDK(LSDK)自带工具链,位于 aarch64-linux-gnu 目录下,也可使用Linaro GCC。关键要求是glibc版本不高于目标板rootfs,否则运行时报 GLIBC_2.xx not found。安装后验证:
export CROSS=aarch64-linux-gnu-
export PATH=$PATH:/opt/fsl-ls1046a/usr/bin
${CROSS}gcc --version
# 期望输出:aarch64-linux-gnu-gcc (Linaro GCC 7.5) 7.5.0
同时确认目标板内核版本与头文件匹配,DPDK编译需要内核头文件中的 uapi 定义(如 vfio.h、virtio_net.h)。
二、DPDK源码获取与交叉编译配置
推荐使用与LSDK匹配的DPDK版本(如LSDK 20.04对应DPDK 19.11)。获取源码后配置交叉编译文件:
git clone https://dpdk.org/git/dpdk
cd dpdk && git checkout v19.11
# 生成交叉编译配置
cat > config/arm64-ls1046a <<'EOF'
[target]
arch = arm64
machine = armv8a
toolchain = gcc
[compiler]
prefix = aarch64-linux-gnu-
EOF
meson build --cross-file config/arm64-ls1046a
ninja -C build
编译产物中,build/examples/dpdk-l2fwd 是本节要跑通的示例。若使用旧版make构建,则执行 make config T=arm64-armv8a-linuxapp-gcc 后 make -j。编译时需确认 CONFIG_RTE_LIBRTE_DPAA_BUS=y(DPAA1)或 CONFIG_RTE_LIBRTE_FSLMC_BUS=y(DPAA2),否则PMD不会被编入。
三、目标板系统部署
将 dpdk-l2fwd 及依赖库拷贝到目标板(可通过NFS或scp)。目标板需满足:内核开启 CONFIG_VFIO、CONFIG_UIO、CONFIG_HUGETLBFS,并加载对应PMD所需模块。DPAA1平台需 fsl_dpa 相关驱动,DPAA2平台需 fsl_mc_bus 与 vfio-fsl-mc。检查命令:
lsmod | grep -E 'vfio|uio|fsl'
ls /sys/bus/fsl-mc/devices/ # DPAA2平台
ls /dev/vfio/ # 应出现vfio容器节点
四、大页内存与VFIO/UIO绑定
DPDK需要大页内存作为mbuf池和ring的物理连续内存。在ARM64上通常使用2MB大页,预留4个即8MB,l2fwd足够:
echo 4 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge && mount -t hugetlbfs nodev /mnt/huge
grep Huge /proc/meminfo # 确认HugePages_Total=4
网卡绑定方面,DPAA1使用UIO(igb_uio或uio_dpa),DPAA2使用VFIO。以VFIO为例,先确认IOMMU开启(iommu=on),再将网络设备绑定到 vfio-pci:
dpdk-devbind.py --status
dpdk-devbind.py -b vfio-pci 0000:01:00.0
dpdk-devbind.py --status # 确认drv=vfio-pci
注意:绑定后该网口从内核网络栈消失,需通过DPDK程序访问。若使用UIO,则绑定到 igb_uio,并确保 uio_pci_generic 或 igb_uio 已加载。
五、跑通第一个l2fwd示例
l2fwd在两个网口间做二层转发,是验证环境是否可用的最小闭环。运行命令:
./dpdk-l2fwd -l 0-3 -n 4 -- -p 0x3 -q 2
# -l 0-3:使用4个lcore
# -n 4:4个内存通道
# -p 0x3:启用port 0和port 1
# -q 2:每port 2个队列
正常输出应包含 Port 0: link up、lcore 0: RX port 0 等日志,并周期性打印 Port statistics,其中 rx_packets 与 tx_packets 持续增长。若出现 EAL: No free hugepages reported,检查大页挂载;若 EAL: Cannot init vfio,检查IOMMU与vfio模块;若 No Ethernet device found,检查PMD是否编入及设备绑定状态。
--no-huge 排除大页问题,再逐步恢复大页与VFIO绑定,便于定位故障环节。