#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h>
#include <rte_memory.h>
#include <rte_memzone.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>
/**
* 回调函数
* __attribute__((unused))的作用
* 表明函数或变量可能不被使用,可避免gcc编译时的警告信息
* 此处用来修饰void *arg,表示在lcore_hell()中,arg变量可能不被使用
*/
static int
lcore_hello(__attribute__((unused)) void *arg)
{
unsigned lcore_id;
lcore_id = rte_lcore_id(); //获取lcore的ID
printf("hello from core %u\n", lcore_id); //打印信息
return 0;
}
int
main(int argc, char **argv)
{
int ret; //返回值
unsigned lcore_id; //逻辑核心ID
/**
* 运行环境初始化
* 通过传递argc、argv来初始化DPDK运行环境
* /lib/librte_eal/common/eal_common_options.c中有对环境变量参数的详解
* -c 线程数掩码
* rte_eal_init()函数中,包含如下操作:
* 配置初始化
* 内存初始化
* 内存池初始化
* 队列初始化
* 告警初始化
* 中断初始化
* PCI初始化
* 定时器初始化
* 检测内存本地化(NUMA)
* 插件初始化
* 主线程初始化
* 轮询设备初始化
* 建立主从线程通道
* 将从线程设置在等待模式
* PCI设备的探测与初始化
*/
ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_panic("Cannot init EAL\n");
/* call lcore_hello() on every slave lcore */
/**
* RTE_LCORE_FOREACH_SLAVE(lcore_id)
* 遍历所有EAL指定可以使用的子lcore(logic core逻辑核)
* rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
* 在每个核心上,回调lcore_hello函数
*/
RTE_LCORE_FOREACH_SLAVE(lcore_id) {
printf("%d\n", lcore_id);
rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
}
/* call it on master lcore too */
//在主lcore上调用lcore_hello()函数
lcore_hello(NULL);
//等待所有执行单元结束
rte_eal_mp_wait_lcore();
return 0;
}