4. 编译并运行Hello World示例
任务目标
编译DPDK源码包中自带的helloworld示例程序,运行后观察每个lcore依次打印启动信息,验证DPDK环境与多核支持是否正常。
环境准备
- 已安装DPDK(源码位于
/path/to/dpdk),并完成meson setup build编译(若未编译,先执行meson setup build && ninja -C build)。 - 系统已预留大页内存(建议至少2GB),并挂载hugetlbfs。若未配置,执行:
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs pagesize=2MB /mnt/huge
- 加载内核模块(如使用VFIO或IGB_UIO,按实际驱动加载):
modprobe vfio-pci
编译helloworld示例
DPDK示例程序位于源码目录的examples/helloworld。使用meson构建系统编译该示例:
cd /path/to/dpdk
meson configure build -Dexamples=helloworld
ninja -C build
编译完成后,可执行文件生成于build/examples/dpdk-helloworld。
运行与验证
运行前需设置大页内存环境变量,然后直接执行程序:
export DPDK_HUGEPAGES=/mnt/huge
./build/examples/dpdk-helloworld
若系统有多个lcore,程序会为每个lcore打印一条信息。预期输出格式如下(具体lcore数量取决于机器配置):
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
hello from core 1
hello from core 2
hello from core 3
hello from core 4
hello from core 5
hello from core 6
hello from core 7
hello from core 0
通过条件:每个lcore均打印hello from core X,且程序正常退出(exit code 0)。若某个core未打印或程序报EAL初始化错误,说明大页内存配置或驱动绑定有问题。
核心代码说明
helloworld示例的核心逻辑极简,仅注册一个回调函数并在每个lcore上执行。关键代码如下(完整源码见examples/helloworld/main.c):
static int
lcore_hello(__rte_unused void *arg)
{
unsigned lcore_id = rte_lcore_id();
printf("hello from core %u\n", lcore_id);
return 0;
}
int main(int argc, char **argv)
{
int ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_panic("Cannot init EAL\n");
RTE_LCORE_FOREACH_WORKER(lcore_id) {
rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
}
rte_eal_mp_wait_lcore();
rte_eal_cleanup();
return 0;
}
该程序通过rte_eal_remote_launch将任务分发到每个worker lcore,主lcore(core 0)不参与执行,因此输出中core 0通常最后打印或由EAL主线程处理。
常见问题
- EAL初始化失败:检查大页内存是否足够(
cat /proc/meminfo | grep HugePages),以及DPDK_HUGEPAGES路径是否正确挂载。 - 无输出或卡死:确认当前用户对
/mnt/huge有读写权限,且未与其他DPDK进程冲突。 - lcore数量不符:程序默认使用所有可用lcore,可通过
--lcores参数指定,例如--lcores 0-3只使用前4个核。