2. BlueField DPU硬件与软件架构
BlueField DPU 不是一块“更快的网卡”,而是一台以 PCIe 为背板、以 ARM 为核心、以加速引擎为专用算力的嵌入式服务器。理解它的硬件与软件架构,是后续用 DOCA 写数据面程序的前提:你必须清楚一段报文从光模块进来后,会经过哪些硬件单元、由谁处理、在哪一层被卸载,以及软件栈中 DOCA 运行时、驱动、固件三者如何协同。
一、硬件架构:ARM 核、网络接口、加速引擎与 PCIe
以 BlueField-2 为例,其内部可划分为四个关键域。第一是 ARM 计算域:8 个 Armv8 A72 核心,主频约 2.0 GHz,配 DDR4 内存(典型 16 GB),运行完整的 Linux(Ubuntu、RHEL 或 DOCA 基础镜像)。它让 DPU 能独立跑控制面、容器、Kubernetes 节点组件,而不占用主机 CPU。第二是 网络接口域:两个 100 Gb/s 以太网端口(或一个 200 Gb/s 聚合),通过 ConnectX 系列网卡逻辑接入,支持 RoCEv2、SR-IOV、VirtIO。第三是 加速引擎域:包括加解密引擎(IPsec/MACsec/TLS 卸载)、正则匹配引擎(RegEx)、压缩解压引擎(Compress)、数据搬运引擎(DMA)以及可编程包处理流水线(P4/DPDK 可编程的 eSwitch)。第四是 PCIe 域:DPU 通过 PCIe Gen4 x16 与主机相连,既作为网卡向主机暴露 PF/VF,也作为端点让主机访问 DPU 的 ARM 侧资源。
这里有一个容易混淆的点:DPU 在主机看来是“一个 PCIe 设备”,但在 DPU 自己看来,主机是“另一个端点”。因此 BlueField 支持两种代表模式(Representor Mode):switchdev 模式与 legacy SR-IOV 模式。switchdev 模式下,eSwitch 的每个 VF 都有一个对应的 representor 网络设备(如 pf0vf0),主机与 DPU 上的控制程序可以通过这些 representor 下发流表、做镜像、做 ACL;legacy 模式则更接近传统网卡,VF 直接透传给虚拟机,控制能力弱。做 DOCA 数据面开发时,通常选择 switchdev,因为 DOCA Flow、DOCA 的 eSwitch 编程接口都依赖它。
二、软件栈:DOCA 运行时、驱动与固件的分层关系
DPU 上的软件栈自下而上分为四层。最底层是 固件(Firmware),它固化在 DPU 的 flash 中,负责初始化 ASIC、管理 eSwitch、提供 PCIe 配置空间。第二层是 驱动:DPU 侧运行 mlx5_core、mlx5_ib、mlx5_fpga 等内核模块,主机侧同样需要匹配的 mlx5_core 驱动。第三层是 DOCA 运行时与库:DOCA Runtime 提供设备发现、内存管理、流表抽象;DOCA 库(DOCA Flow、DOCA Eth、DOCA RDMA、DOCA Crypto 等)向上提供 C/Python API。最上层是用户应用或容器。
这里最关键的是版本匹配。DOCA 版本、驱动版本、固件版本三者必须落在 NVIDIA 官方兼容矩阵内。例如 DOCA 2.5 要求固件 ≥ 32.37.1000、驱动 ≥ 24.04、主机内核 ≥ 5.15。若固件过旧,DOCA Flow 的某些 action(如 DOCA_FLOW_ACTION_ENCAP)会返回 DOCA_ERROR_NOT_SUPPORTED;若驱动与固件不匹配,mlxconfig 可能无法识别设备。排查时先用 doca_version、ethtool -i、mlxfwmanager 三条命令分别确认三层版本,再对照矩阵。
三、代表模式与 DOCA 数据面开发的关系
在 switchdev 模式下,DPU 的 eSwitch 把主机 PF、VF、DPU 自身的 representor 都挂在同一个虚拟交换机上。DOCA Flow 通过 representor 下发流表,报文可以在 eSwitch 内被直接转发、丢弃、镜像或送到加速引擎,而不必绕到主机内核。这就是“数据面卸载”的物理基础。若使用 legacy 模式,VF 直通虚拟机,DPU 侧看不到 VF 的流量,DOCA Flow 只能作用于 PF,能力大幅受限。因此,在开始写 DOCA 程序前,务必确认 /sys/class/net/pf0vf0 这类 representor 存在,且 devlink dev eswitch mode 显示为 switchdev。
doca_version 与 mlxfwmanager --query,把 DOCA、驱动、固件三个版本号记下来,再对照 NVIDIA DOCA Compatibility Matrix 确认是否匹配。这一步能避免后续 80% 的“接口调用失败”类问题。四、一个可复现的版本核对示例
假设你在一台 BlueField-2 上准备运行 DOCA Flow 示例。先执行以下命令,观察输出:
$ doca_version
DOCA 2.5.0
$ ethtool -i ens1f0np0 | grep -E "driver|version|firmware"
driver: mlx5_core
version: 24.04-1.1.1
firmware-version: 32.37.1000
$ devlink dev eswitch show pci/0000:03:00.0
pci/0000:03:00.0: mode switchdev inline-mode none encap-mode basic
判断依据:DOCA 2.5 对应固件 32.37.1000、驱动 24.04,三者一致;eswitch 为 switchdev,说明 representor 可用。若固件显示 32.36.1000,则需用 mlxfwmanager -u -d pci/0000:03:00.0 升级固件后再继续。若 eswitch 为 legacy,则用 devlink dev eswitch set pci/0000:03:00.0 mode switchdev 切换,并重启驱动。