2、开发环境搭建:Linux开发环境配置、交叉编译工具链安装、硬件模拟器(QEMU/FPGA)部署
说实话,做存储加速器开发,环境搭建这一步最容易让人栽跟头。我见过太多人一上来就急着写代码,结果编译不过、跑不起来,最后发现是工具链没配好。嗯,咱们先把地基打牢。
2.1 Linux开发环境配置
我个人习惯用Ubuntu 20.04 LTS作为宿主机。为什么?因为它的软件源最全,社区支持最好。你想想看,万一遇到问题,网上随便一搜就有解决方案,省心。
基础依赖包,一个都不能少:
sudo apt-get update
sudo apt-get install -y build-essential git vim cmake
sudo apt-get install -y libssl-dev libncurses5-dev
sudo apt-get install -y flex bison bc kmod cpio
sudo apt-get install -y python3 python3-pip
sudo apt-get install -y qemu-system-arm qemu-user-static
这里有个坑——libncurses5-dev 和 libssl-dev 很多人会漏掉。我在项目中遇到过,编译内核时缺少这两个库,报错信息特别隐晦,折腾了半天才发现。
libncurses5-dev 可能已经被 libncurses-dev 替代。安装前先确认一下。
2.2 交叉编译工具链安装
存储加速器通常跑在ARM或RISC-V架构上,所以我们需要交叉编译工具链。说白了,就是在x86的电脑上编译出能在ARM上跑的程序。
我推荐用Linaro提供的工具链,稳定且更新及时:
# 下载ARM64工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu /opt/
# 配置环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
验证是否安装成功:
aarch64-linux-gnu-gcc --version
如果能看到版本信息,说明工具链已经就绪。我曾经犯过一个低级错误——忘记把工具链路径加到PATH里,结果编译时一直提示找不到编译器,还以为是下载的包有问题。
setenv.sh 脚本,把环境变量配置集中管理。这样切换项目时,只需要 source 不同的脚本就行。
2.3 硬件模拟器部署
开发存储加速器,不可能每次调试都往真机上烧录。太慢了。所以我们需要模拟器。这里主要讲两种:QEMU和FPGA模拟。
2.3.1 QEMU模拟器
QEMU可以模拟完整的ARM开发板,包括CPU、内存、外设。我习惯用它来做早期的功能验证。
安装QEMU并编译内核:
# 下载Linux内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.80.tar.xz
tar -xvf linux-5.15.80.tar.xz
cd linux-5.15.80
# 配置ARM64架构
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
编译完成后,用QEMU启动:
qemu-system-aarch64 -machine virt -cpu cortex-a57 \
-kernel arch/arm64/boot/Image \
-append "console=ttyAMA0" \
-nographic
嗯,这里要注意。QEMU的 -machine 参数决定了模拟的硬件平台。我刚开始用的时候,选了 virt 机器类型,结果发现它没有模拟真实的存储控制器,导致我的加速器驱动根本跑不起来。后来换成了 raspi3 才解决问题。
2.3.2 FPGA原型验证
当你的加速器设计基本稳定后,就需要上FPGA了。FPGA能提供接近真实硬件的运行速度,而且可以反复烧录,非常适合迭代调试。
我常用的FPGA开发板是Xilinx的Zynq系列,它集成了ARM处理器和FPGA逻辑,正好用来做存储加速器原型。
部署流程大致如下:
- 编写RTL代码 —— 用Verilog或SystemVerilog描述加速器逻辑
- 综合与实现 —— 用Vivado工具链生成比特流
- 烧录到FPGA —— 通过JTAG接口下载比特流
- 编写测试程序 —— 在ARM核上运行,通过AXI总线与加速器交互
这里有个经验之谈:FPGA的综合时间很长,动辄半小时到一小时。所以不要等到代码完全写完了才去综合。我习惯每写完一个模块就做一次局部综合,及早发现时序问题。
2.4 本章知识体系
为了让你更直观地理解整个开发环境的架构,我画了一张图:
这张图展示了从宿主机到目标平台的完整链路。你想想看,每一步都有对应的工具和验证手段,这样开发起来心里才有底。
2.5 避坑指南
最后,分享几个我踩过的坑:
- 内核版本不匹配 —— 编译内核时,一定要确认内核版本和工具链的兼容性。我曾经用gcc 9编译Linux 4.19内核,结果一堆编译错误。后来换回gcc 7就没事了。
- QEMU网络配置 —— 默认情况下QEMU的虚拟机没有网络。如果需要网络功能,得用
-netdev user参数配置用户模式网络。我第一次用的时候没配,结果想从虚拟机里下载东西,死活连不上。 - FPGA时序收敛 —— 综合后的时序报告一定要仔细看。如果setup time或hold time有违例,加速器在真实硬件上就会跑飞。我吃过这个亏,调试了整整两天才发现是时序问题。
好了,开发环境就讲到这里。记住,环境搭建虽然繁琐,但它是后续所有工作的基础。花点时间把它搞扎实,后面会省很多事。
公众号:蓝海资料掘金营,微信deep3321