4. Marvell DPU软件栈与开发环境搭建
Marvell OCTEON 系列 DPU(如 OCTEON 10、OCTEON TX2)在数据中心网络虚拟化场景中承担 OVS 卸载、vDPA/virtio 加速、加密与压缩卸载等任务。要让这些能力真正跑起来,软件栈不是单一组件,而是由固件、内核驱动、用户态数据面、控制面与工具链共同构成的层次结构。理解各层职责与依赖顺序,是搭建可复现开发环境的前提。
从下往上看,最底层是固件(Firmware)与启动引导,负责初始化硬件加速单元、配置 PCIe 端点与 SR-IOV 虚拟功能;其上是内核态驱动,包括 Marvell 提供的网络驱动(如 octeontx2-af/pf/vf)、DOCA/OFED 类 RDMA 与 vDPA 驱动;再往上是用户态数据面,典型组合是 DPDK + OVS-DPDK,或 DOCA 提供的 Flow、Crypto、Compress 等库;最上层是控制面与编排工具,如 OVS 数据库、ovs-vsctl、DPDK testpmd 以及 SDK 自带的调试工具。下图给出这一软件栈的分层关系与数据/控制路径。
搭建环境时,建议按“固件 → 内核驱动 → 用户态库 → 控制面”的顺序推进,因为上层组件往往依赖下层暴露的设备节点与能力。以 OCTEON 10 为例,典型流程如下。
固件与驱动准备
首先确认 DPU 固件版本与 SDK 版本匹配。Marvell 通常提供 SDK 包,内含 ATF、U-Boot、SCP 固件以及 Linux 内核补丁。烧录固件后,通过 lspci 应能看到 Marvell 网络控制器与加密/压缩加速器。随后加载内核模块:
modprobe octeontx2-af
modprobe octeontx2-nicpf
modprobe octeontx2-nicvf
modprobe rvu_cpt
modprobe rvu_nix
加载后可用 lspci -vv 查看 VF 是否已使能 SR-IOV,并用 ip link 确认 PF/VF 网口出现。若使用 vDPA,还需加载 vhost_vdpa 与 Marvell 对应的 vDPA 驱动,使 virtio 数据路径可被卸载到硬件。
DPDK 与 OVS-DPDK 编译
DPDK 需要针对 OCTEON 平台交叉编译或本地编译。以本地编译为例,先安装依赖(meson、ninja、python3-pyelftools),再配置:
meson setup build -Dplatform=octeontx2 -Dexamples=all
ninja -C build
编译完成后,用 dpdk-devbind.py 将 VF 绑定到 vfio-pci:
./usertools/dpdk-devbind.py --bind=vfio-pci 0002:01:00.1
./usertools/dpdk-devbind.py --status
随后运行 testpmd 验证基本收发:
./build/app/dpdk-testpmd -l 0-3 -a 0002:01:00.1 -- -i --rxq=4 --txq=4
testpmd> start
testpmd> show port stats all
若 show port stats 中 RX/TX 计数持续增长,说明 DPDK PMD 与硬件队列已正常工作。接着编译 OVS-DPDK,需在 ./configure 时指定 DPDK 路径:
./configure --with-dpdk=/path/to/dpdk/build
make && make install
启动 OVS 时设置 dpdk-init=true、dpdk-socket-mem 与 dpdk-devargs,再用 ovs-vsctl add-port 将 DPDK 端口加入网桥。此时可用 ovs-appctl dpif-netdev/pmd-stats-show 观察 PMD 线程的包处理速率与每队列分布。
DOCA/OFED 类驱动与工具链
若场景涉及 RDMA 或 vDPA,需要安装 DOCA OFED 栈。安装后通过 ibv_devinfo 确认 RDMA 设备,通过 doca_caps 查看 Flow、Crypto、Compress 等能力是否可用。DOCA Flow 常用于将 OVS 流表卸载到硬件,典型调用顺序是创建 pipe、添加 entry、提交并查询计数器。调试时可开启 DOCA 日志级别,观察流表是否成功下发到硬件表项。
调试环境配置
调试阶段常用工具包括:ethtool -S 查看硬件统计,ovs-appctl dpctl/dump-flows 查看软件流表,ovs-appctl dpif-netdev/pmd-rxq-show 查看队列与核绑定,以及 Marvell SDK 自带的寄存器与队列调试命令。若出现丢包,先确认 PMD 线程是否与网卡队列在同一 NUMA 节点,再检查 rxq 数量与 pmd-cpu-mask 是否匹配。若流表未卸载,检查 DOCA Flow 日志中是否有 unsupported match 或 table full 提示。
整体而言,Marvell DPU 的开发环境搭建是一项层次分明、依赖严格的工程任务。把固件、驱动、DPDK、OVS-DPDK 与 DOCA 逐层打通,并用最小验证闭环确认每一层可用,才能为后续网络虚拟化卸载实验提供稳定基础。