第2章:固件开发环境搭建:硬件平台介绍、交叉编译工具链安装、SDK与BSP获取

说实话,很多刚入行的朋友问我:“做SmartNIC固件开发,第一步到底该干啥?”

我的回答很简单——先把你的开发环境整明白。别急着写代码,环境没搭好,后面全是坑。我自己带过不少新人,十有八九的问题都出在环境配置上。

2.1 主流硬件平台概览

目前市面上主流的SmartNIC平台,说白了就两大阵营:NVIDIA的BlueField系列,和Intel的IPU系列。我两个平台都深度用过,各有千秋。

2.1.1 NVIDIA BlueField系列

BlueField这玩意儿,我最早接触是BlueField-2。当时客户要求做OVS卸载,我折腾了整整两周才把环境跑通。现在BlueField-3都出来了,ARM核心更多,性能也更强。

特性 BlueField-2 BlueField-3
ARM核心数 8核 Cortex-A72 16核 Cortex-A78
DDR容量 8GB 16GB
网络接口 2x25GbE / 1x100GbE 2x100GbE / 1x200GbE
内置加速器 基础加解密 RegEx、加解密、压缩

我个人习惯用BlueField-3做原型验证。为什么呢?因为它的ARM子系统跑的是标准的Linux,你可以在上面直接gdb调试固件,非常方便。

小提示: 如果你刚开始接触,建议从BlueField-2起步。文档更成熟,社区资源也多。BlueField-3有些新特性文档还不够完善,我踩过不少坑。

2.1.2 Intel IPU系列

Intel的IPU(Infrastructure Processing Unit),走的是另一条路。它用的是Xeon-D或者Atom处理器,配合FPGA做灵活加速。

我记得有一次做项目,客户指定要用Intel IPU。我一开始还挺抵触,觉得ARM生态更熟。但用下来发现,Intel的DPDK生态确实强,很多网络处理库直接就能跑。

特性 Intel Mount Evans Intel Oak Springs Canyon
处理器 Xeon-D 4核 Atom P5900 8核
FPGA Arria 10 Stratix 10
内存 16GB DDR4 32GB DDR4
特色 内置QAT加速 支持CXL互联

2.2 交叉编译工具链安装

做固件开发,你肯定不是在SmartNIC上直接写代码。你的开发机是x86,目标平台是ARM。这就需要一个东西——交叉编译工具链。

说白了,就是在你的x86电脑上,装一个能生成ARM可执行文件的编译器。

2.2.1 安装aarch64交叉编译器

以Ubuntu 22.04为例,安装过程其实很简单:

# 安装ARM64交叉编译工具链
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 验证安装
aarch64-linux-gnu-gcc --version
# 输出类似:aarch64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0

嗯,这里要注意。你可能会问:“为什么不用clang?” 我个人建议,初期还是用GCC。为什么?因为SDK和BSP大多是为GCC优化的,你用clang可能会遇到一些奇奇怪怪的链接问题。

我曾经踩过的坑: 有一次我图省事,直接apt安装了默认版本的交叉编译器。结果编译出来的固件在BlueField上跑不起来,报段错误。查了两天才发现是编译器版本太老,不支持某些ARMv8.2的指令。所以,一定要确认编译器版本和你的目标平台匹配。

2.2.2 配置环境变量

我个人习惯把交叉编译器的路径加到环境变量里,这样写Makefile的时候方便:

export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar

你想想看,每次都要敲一长串aarch64-linux-gnu-gcc,多累啊。用CROSS_COMPILE变量,Makefile里直接写$(CC)就行了。

2.3 SDK与BSP获取

SDK和BSP,这两个东西是固件开发的基石。没有它们,你连灯都点不亮。

2.3.1 NVIDIA DOCA SDK

NVIDIA的SmartNIC,用的是DOCA(Data Center Infrastructure-on-a-Chip Architecture)框架。说白了,就是NVIDIA给你封装好的一套API,让你不用直接操作硬件寄存器。

获取方式:

  • 官网注册下载:需要企业邮箱,个人邮箱有时候会被拒
  • GitHub:NVIDIA有开源的DOCA示例代码
  • Docker镜像:我推荐这种方式,省去环境配置的麻烦
# 拉取DOCA开发镜像
docker pull nvcr.io/nvidia/doca/doca:2.6.0

# 运行容器并挂载本地代码
docker run -it --rm \
  -v $(pwd):/workspace \
  nvcr.io/nvidia/doca/doca:2.6.0 \
  /bin/bash
我的经验: 用Docker镜像开发,可以避免“在我机器上能编译”这种尴尬。团队里统一用同一个镜像,环境完全一致,省心。

2.3.2 Intel IPU SDK

Intel的IPU SDK,走的是OPAE(Open Programmable Acceleration Engine)框架。这个框架最早是给FPGA用的,后来扩展到IPU。

获取方式:

  • Intel官网:需要注册Intel Developer Zone账号
  • YUM/APT仓库:Intel提供了官方仓库,可以直接apt-get安装
  • 源码编译:从GitHub拉取OPAE源码,自己编译
# 添加Intel仓库
sudo rpm --import https://repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
sudo rpm -ivh https://repos.intel.com/intel-gpg-keys/intel-repo-key-1.0-1.noarch.rpm

# 安装OPAE SDK
sudo yum install opae-sdk-devel

2.3.3 BSP获取与配置

BSP(Board Support Package),就是板级支持包。它包含了启动代码、设备树、驱动等。

获取BSP的途径:

  • 硬件厂商官网:最权威的来源
  • GitHub:有些厂商会把BSP开源
  • 内部SVN/Git:公司内部一般有定制化的BSP

配置BSP的步骤:

  1. 解压BSP包:tar -xzf bsp-bluefield-3.9.0.tar.gz
  2. 设置环境变量:source bsp-env.sh
  3. 编译BSP:make -j4
  4. 烧录到板卡:用厂商提供的烧录工具
注意: BSP版本一定要和硬件版本匹配。我曾经犯过一个低级错误,把BlueField-2的BSP刷到了BlueField-3上,结果板子直接变砖。还好有JTAG救回来,不然就真成砖了。

2.4 知识体系总览

说了这么多,我画个图帮你理一理思路。整个固件开发环境搭建,其实就这三块:

固件开发环境搭建知识体系 硬件平台 交叉编译工具链 SDK与BSP NVIDIA BlueField 系列 Intel IPU 系列 aarch64-linux-gnu-gcc 环境变量配置 DOCA / OPAE SDK BSP 获取与烧录 三者缺一不可,环境搭好,开发事半功倍

这张图你看懂了吗?硬件平台是基础,工具链是桥梁,SDK/BSP是上层建筑。三者缺一不可。

好了,环境搭建这块我就讲这么多。记住,别急着写代码,先把环境跑通。我见过太多人一上来就写固件,结果编译不过、烧录失败,折腾半天才发现是工具链版本不对。

踏踏实实把这一步走稳了,后面的开发才会顺风顺水。


公众号:蓝海资料掘金营,微信deep3321