【实战指南】PLX SDK:从源码编译到DMA性能测试的完整流程
1. PLX SDK入门从下载到环境搭建第一次接触PLX SDK的朋友可能会有点懵这玩意儿到底是干啥的简单来说它就是一套专门用来捣鼓PLX公司那些PCIe设备的工具包。想象你买了个高级PCIe扩展卡想要让它乖乖听话干活就得靠这个SDK来调教。官网下载其实挺简单但有几个坑我得提前告诉你。首先打开PLX官网现在应该归Broadcom管了找到PCI/PCIe Software Development Kits这个分类。这里有个关键选择Linux用户记得选PCI/PCIe SDK Linux Package OnlyWindows用户则要选Complete Package。我上次就手快下错了版本结果白折腾半天。下载完的压缩包大概长这样PlxSdkLinux_vX.X.X.tar.gz。解压后你会看到几个关键目录Driver/- 放着内核驱动源码Samples/- 各种示例程序PlxApi/- 用户态API库Bin/- 预编译的工具脚本建议新建个专门的工作目录比如/opt/plx_sdk把解压后的文件都扔进去。这样后面编译时不会把系统搞得乱七八糟卸载也方便。记得给目录开权限sudo mkdir -p /opt/plx_sdk sudo chown $USER:$USER /opt/plx_sdk2. 编译环境配置的避坑指南编译环境这块我踩过的坑最多。首先确认你的Linux内核版本uname -rPLX SDK对内核版本有点挑剔太新的内核可能需要打补丁。我用的Ubuntu 20.04 LTS内核5.4比较稳。必备的构建工具链sudo apt update sudo apt install -y build-essential linux-headers-$(uname -r) libncurses-dev flex bison libssl-dev重点来了必须检查gcc版本gcc --version如果版本太高比如gcc-11可能会报各种奇怪错误。建议用gcc-9sudo apt install gcc-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90还有个隐藏坑点——内核配置。有些发行版默认没开PCIe相关选项需要重新编译内核cd /usr/src/linux make menuconfig # 确保勾选PCIe相关选项 make -j$(nproc) sudo make modules_install install3. 驱动编译与加载实战驱动编译是重头戏PLX SDK提供了自动化脚本但有些细节需要注意。先设置环境变量export PLX_SDK_DIR$(pwd) export ARCHx86_64 # ARM用户改成arm64编译服务驱动cd Driver chmod x build* ./builddriver svc | tee build.log # 保存日志很重要如果报错missing headers可能是内核头文件路径不对。试试手动指定make -C /lib/modules/$(uname -r)/build M$(pwd) modulesDMA驱动编译更娇气./builddriver 8000d这里常见错误是DMA地址映射问题解决方法是在Makefile里加上EXTRA_CFLAGS -DPLX_DMA_MEMORY_64BIT驱动加载有讲究顺序不能错cd ../Bin ./Plx_load svc ./Plx_load 8000d检查是否加载成功lsmod | grep PLX dmesg | tail -20 # 看内核日志4. DMA性能测试全流程终于到最硬核的部分了先编译测试程序cd ../PlxApi make clean make cd ../Samples/PlxDmaPerf make运行测试前要配置DMA参数cd App ./PlxDmaPerf -c config.ini这是我的常用配置[Transfer] BlockSize 4096 BlockCount 1000 SrcAddr 0x10000000 DestAddr 0x20000000 Direction DeviceToHost性能监控也很重要cd ../../PerfMonitor/App ./PerfMon -p 0 -r # 监控port 0的实时流量几个实用技巧用taskset绑定CPU核心减少抖动taskset -c 3 ./PlxDmaPerf关闭CPU节能提升稳定性sudo cpupower frequency-set --governor performance监测PCIe链路状态lspci -vv -s 01:00.0 | grep LnkSta5. 常见问题排查手册遇到Permission denied别慌先检查udev规则sudo tee /etc/udev/rules.d/99-plx.rules EOF SUBSYSTEMpci, ATTR{vendor}10b5, MODE0666 EOF sudo udevadm control --reloadDMA传输失败的典型症状及解法症状1DMA timeout error解法增大驱动中的超时参数echo 5000 | sudo tee /sys/module/plx8000_dma/parameters/timeout_ms症状2Invalid address解法检查物理地址对齐// 申请内存时要用posix_memalign posix_memalign(buf, 4096, size);性能调优三板斧调整PCIe最大负载大小setpci -s 01:00.0 CAP_EXP8.w5000启用write-combiningsudo setpci -s 01:00.0 COMMAND0x02禁用PCIe ASPMecho performance /sys/module/pcie_aspm/parameters/policy最后提醒每次内核升级后都要重新编译驱动建议写个自动编译脚本#!/bin/bash cd $PLX_SDK_DIR/Driver make clean ./builddriver all sudo ./Plx_load all