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 自带的调试工具。下图给出这一软件栈的分层关系与数据/控制路径。

Marvell DPU 网络虚拟化软件栈分层 控制面 / 编排层 ovs-vsctl · OVSDB · DPDK testpmd · DOCA CLI · SDK 调试工具 用户态数据面 DPDK (PMD / rte_flow) OVS-DPDK (datapath) DOCA Flow / Crypto / Compress 内核态驱动 octeontx2-af / pf / vf DOCA / OFED (RDMA, vDPA) VFIO / UIO 绑定 固件与引导 ATF / U-Boot · SCP 固件 · PCIe EP 配置 · SR-IOV VF 使能 Marvell OCTEON DPU 硬件 网络加速单元 · 加密引擎 · 压缩引擎 · PCIe 端点 控制/配置 数据/卸载

搭建环境时,建议按“固件 → 内核驱动 → 用户态库 → 控制面”的顺序推进,因为上层组件往往依赖下层暴露的设备节点与能力。以 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 日志级别,观察流表是否成功下发到硬件表项。

建议在环境搭建完成后,用一份最小验证清单逐项确认:固件版本、内核模块加载、VF 绑定、DPDK 端口探测、OVS 网桥创建、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 逐层打通,并用最小验证闭环确认每一层可用,才能为后续网络虚拟化卸载实验提供稳定基础。