第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调试固件,非常方便。
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可能会遇到一些奇奇怪怪的链接问题。
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
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的步骤:
- 解压BSP包:tar -xzf bsp-bluefield-3.9.0.tar.gz
- 设置环境变量:source bsp-env.sh
- 编译BSP:make -j4
- 烧录到板卡:用厂商提供的烧录工具
2.4 知识体系总览
说了这么多,我画个图帮你理一理思路。整个固件开发环境搭建,其实就这三块:
这张图你看懂了吗?硬件平台是基础,工具链是桥梁,SDK/BSP是上层建筑。三者缺一不可。
好了,环境搭建这块我就讲这么多。记住,别急着写代码,先把环境跑通。我见过太多人一上来就写固件,结果编译不过、烧录失败,折腾半天才发现是工具链版本不对。
踏踏实实把这一步走稳了,后面的开发才会顺风顺水。
公众号:蓝海资料掘金营,微信deep3321