2. DPDK Hello World

任务目标

编写一个最小DPDK程序,完成EAL初始化并打印一条日志消息,验证DPDK开发环境可用。程序不涉及任何收发包逻辑,仅作为DPDK环境自检。

环境依赖

  • DPDK版本:20.11+(建议使用LTS版本)
  • 已编译DPDK并设置RTE_SDK和RTE_TARGET环境变量
  • 系统支持hugepage(至少预留1024MB)
  • 需要root权限运行(或已配置rte_eal_init所需权限)

关键完整代码

#include <rte_eal.h>
#include <rte_log.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int ret;

    /* 初始化EAL,解析传入的EAL参数(如 -l, -m 等) */
    ret = rte_eal_init(argc, argv);
    if (ret < 0) {
        rte_log(RTE_LOG_ERR, RTE_LOGTYPE_EAL,
                "EAL init failed: %d\n", ret);
        return -1;
    }

    /* 打印DPDK版本和当前lcore信息 */
    RTE_LOG(INFO, EAL, "DPDK %s initialized successfully\n",
            rte_version());
    RTE_LOG(INFO, EAL, "Running on lcore %u\n", rte_lcore_id());

    /* 清理EAL资源 */
    rte_eal_cleanup();
    return 0;
}

编译与运行

# 编译(假设当前目录为hello_world.c所在目录)
gcc -o hello_world hello_world.c \
    -I$RTE_SDK/$RTE_TARGET/include \
    -L$RTE_SDK/$RTE_TARGET/lib \
    -Wl,-rpath,$RTE_SDK/$RTE_TARGET/lib \
    -lrte_eal -lrte_log

# 运行(需要root权限,指定使用2个lcore)
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mount -t hugetlbfs pagesize=2M none /mnt/huge
./hello_world -l 0-1 -m 256

验证方法

程序运行后观察输出:

  • 若EAL初始化失败,会输出EAL init failed及错误码,需检查hugepage配置或权限。
  • 成功时输出包含DPDK 20.11.x initialized successfully和Running on lcore 0的日志。
  • 程序退出码为0表示正常完成。

通过条件:看到上述两条INFO日志且无ERROR输出,即证明DPDK环境配置正确、EAL可正常初始化。

常见问题

  • EAL init failed: Cannot get hugepage information:hugepage未挂载或数量不足,检查/sys/kernel/mm/hugepages/配置。
  • EAL: Detected 0 lcores:CPU亲和性配置问题,尝试用-l 0指定单个lcore。
  • 编译时找不到头文件:确认RTE_SDK和RTE_TARGET路径正确,且DPDK已编译完成。