intel dpdk rte_eal_cpu_init() 函数介绍

本文详细介绍了DPDK中rte_eal_cpu_init函数的工作原理,包括读取CPU信息并填充rte_config结构体的过程。该函数通过解析/proc/cpuinfo文件来获取系统核心数和物理CPU信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:此文档只做学习交流使用,请勿用作其他商业用途

author:朝阳_tony
E-mail : linzhaolover@gmail.com
Create Date:2013-7-7 14:06:26 Sunday
Last Change: 2013-8-8 13:22:36 Thursday

转载请注明出处:http://blog.youkuaiyun.com/linzhaolover


此文中源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org


请注意:此文请结合dpdk的源码去阅读,此文中提到的源码是dpdk-1.2.3版本,目前dpdk已经更新的1.3.1,1.3.1版本中的代码有很大的改变;


1、函数作用

rte_eal_cpu_init  读取当前系统cpu信息,并将其填入全局结构体rte_config中;dpdk的运行,要了解当前系统的core数,检查创建线程的合法化;


2、函数调用讲解

rte_eal_cpu_init(void) 在文件( dpdk/lib/librte_eal/linuxapp/eal/eal_lcore.c  )中;

/* get pointer to global configuration */
    config = rte_eal_get_configuration();
去获取rte_config结构体的指针,后面会将一些系统信息放入这个结构体中,这结构体很重要;

 /* open /proc/cpuinfo */
    f = fopen(PROC_CPUINFO, "r");
打开 /proc/cpuinfo  这个记录文件,去查询信息;

 if (parse_processor_id(buf, &lcore_id) == 0)
     continue;
去查询core信息;/* parse one line and try to match "processor : %d". */

if (parse_socket_id(buf, &socket_id) == 0)
    continue;
去查询物理cpu信息;/* parse one line and try to match "physical id : %d". */
lcore_config[lcore_id].detected = 1;
lcore_config[lcore_id].socket_id = socket_id;

lcore_config这个结构会存储cpu信息;

struct lcore_config 在dpdk/lib/librte_eal/linuxapp/eal/include/exec-env/rte_lcore.h文件中的定义;


config->lcore_count = count;
最后将cpu可以用的core数传递给rte_config-> locre_count 中;
而这个count与之前我们执行程序传递的 -c所产生的coremask有效掩码数相一致;


### DPDK `rte_eal_init` 参数详解及用法 #### 初始化环境抽象层 (EAL) `rte_eal_init` 是 Data Plane Development Kit (DPDK) 中用于初始化环境抽象层(Environment Abstraction Layer, EAL) 的函数。此函数负责设置运行应用程序所需的底层资源,包括内存管理、多核处理支持和其他必要的配置。 该函数接受两个参数: 1. **argc**: 命令行参数的数量。 2. **argv[]**: 包含命令行参数的字符串数组。 这些参数通常来自程序入口处传递给 `main()` 函数的标准输入参数列表。通过解析这些参数,EAL 可以完成一系列重要的初始化工作[^2]。 #### 主要选项解释 以下是常见的命令行选项及其作用: - `-c COREMASK`: 设置CPU亲和力掩码,指定哪些逻辑核心可用于执行线程。COREMASK是一个十六进制数表示的核心位图。 - `-l CORELIST`: 类似于-c,但是使用逗号分隔的具体核心ID列表来代替掩码形式。 - `--proc-type=TYPE`: 定义进程类型(primary/secondary),这对于共享内存段特别重要,在某些场景下允许多个实例访问相同的物理内存区域。 - `--file-prefix=PREFIX`: 当多个DPDK应用共存时,前缀用来区分不同应用创建的对象名称,防止冲突。 - `--socket-mem MB_PER_SOCKET[,MB_PER_SOCKET,...]`: 分配给每个NUMA节点上的Hugepage数量,单位为兆字节(MB),对于高性能网络包处理至关重要。 - `--huge-dir DIR_PATH`: 如果系统未自动挂载hugetlbfs文件系统,则需手动提供路径以便放置大页文件。 - `--no-huge`: 不使用巨页分配,默认情况下会尝试利用Linux内核的大页面特性提高性能;当遇到问题时可禁用此项测试是否由其引起。 - `--base-virtaddr ADDR`: 设定虚拟地址空间的基础起始位置,有助于避免与其他库加载器发生重叠碰撞的情况。 - `--pci-blacklist PCI_ID`: 排除特定PCI设备不被探测到并加入黑名单中。 - `--vdev DEVICE_NAME`: 添加虚拟设备描述符,允许用户定义额外的伪硬件接口供后续模块调用。 - `--log-level LEVEL`: 控制定制化日志记录级别,影响输出信息量大小以及详细程度。 - `--master-lcore ID`: 明确指出哪个逻辑处理器作为主控角色承担调度职责,其余则默认成为工作者身份参与任务计算过程。 ```bash ./your_dpdk_app -n 4 \ --proc-type primary \ --file-prefix myapp \ --socket-mem 1024,1024 \ --log-level info ``` 上述示例展示了如何启动一个名为 `your_dpdk_app` 的应用程序,并指定了四个可用的工作线程(编号0至3), NUMA节点数目设为4的同时还设置了其他一些常用选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值