DPU网络开发SDK—DPDK(三)
创始人
2024-05-14 16:53:39
0

rte_eal_init()

接上次内容继续对rte_eal_init所做的工作进行分析。

6. 将DPDK进程的启动参数保留下来

在启动DPDK进程时会传入启动参数,这些参数会分成两部分,一部分是DPDK的eal配置参数,如占用的CPU处理核的列表,分配的大页内存大小,网卡的黑白名单等;另外一部分是进程自定义参数,由开发者自行定义参数列表和含义。参数列表中eal配置参数放在前面,进程自定义参数在后面,中间通过“--”进行分割。

eal_save_args()中,分配两段内存空间并交给两个全局的变量eal_args和eal_app_args,后将两部分参数分别存放在这两段内存空间当中。

7. CPU处理核信息初始化

存在一个全局数组变量lcore_config,类型为struct lcore_config,大小由宏定义RTE_MAX_LCORE指定。在rte_eal_cpu_init()中,首先依次遍历数组中的每个元素并对struct lcore_config中的一些元素赋默认值。该结构体的数据结构包含如下内容: 

struct lcore_config {pthread_t thread_id;       // lcore绑定线程的标识符int pipe_main2worker[2];   // 从main到worker管道标识int pipe_worker2main[2];   // 从worker到main的管道标识lcore_function_t * volatile f; // lcore绑定线程的入口函数void * volatile arg;       // 入口函数的传入参数volatile int ret;          // 线程入口函数的返回值volatile enum rte_lcore_state_t state; // lcore的状态unsigned int socket_id;    // 该lcore所属CPU的socket idunsigned int core_id;      // 该lcore在CPU上的物理核int core_index;            // 该lcore的相对索引,从0开始uint8_t core_role;         // 该lcore的角色,可选项有OFF, RTE, SERVICErte_cpuset_t cpuset;       // 该lcore对应的主机CPU的lcore的mask
};

要理解该结构体中一些元素的含义,首先需要了解一下CPU的结构。在Linux中执行lscpu命令,可得到如下输出内容:

root@Soc:~# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
Address sizes:       46 bits physical, 57 bits virtual
CPU(s):             16
On-line CPU(s) list:    0-15
Thread(s) per core:  2
Core(s) per socket:  8
Socket(s):          1

该例子的主机中,有一个socket。socket可以对应主板上的一个CPU插槽,也就是一块CPU芯片。对于一般的PC机来说,只有一个socket,大型服务器一般有多个socket。一个socket中一般会有多个core,即一个独立的处理单元,在单线程模式下,一个独立的处理单元包含一套标准的寄存器和L1级缓存,同时刻只能运行一个线程;而多线程模式下,一套处理单元有两套寄存器,同时刻可以运行两个线程,这两个线程共享L1级缓存。上例中所显示的主机的CPU有8个处理单元,因为开启了多线程,每个处理单元线程数是2,这样逻辑上讲一共有16个线程(或CPU)。

对应到lcore_config中的相关结构,socket_id即为socket的编号,core_id对应的是处理单元的编号,而DPDK的处理核lcore则对应的是线程(或CPU)的编号。

在遍历lcore_config的每个元素时的索引就是lcore的编号,遍历时,根据lcore的编号去系统中查找对应的线程(或CPU)。如果该线程没有被启用,则将lcore_config结构体中的core_index置位负数,并将rte_config中的lcore_role中对应的值置为ROLE_OFF;线程被启用时,core_index设置为相对索引,lcore_role设为ROLE_RTE。

遍历完lcore之后,也就能够统计出涉及到的socket有哪些了,会根据这些信息设置rte_config中的numa_node信息。

需要另外指出的是,rte_eal_cpu_init()中涉及到的某些func,是通过直接访问sys文件系统实现的。如eal_cpu_socket_id()是遍历/sys/devices/system/node/nodeX目录中如果存在cpuY目录,则lcoreY的socket id是X;eal_cpu_detected()是遍历/sys/devices/system/cpu/cpuX/topology/core_id是否存在。

8. DPDK参数解析

eal_parse_args()是解析DPDK参数,比较重要的几个参数有:

  • -a:allow list,指定哪些网卡设备是允许被DPDK接管的,传入的参数值是设备的pci总线编号。

  • -b:block list,指定哪些网卡设备是进制被DPDK禁止的,传入值同上。

  • -c:指定DPDK进程所占用的处理核是哪些,用bitmask的方式进行表示。

  • -m:指定分配多大的内存空间给DPDK的内存池,以MB为单位。

解析之后的信息存放在internal_config这个全局变量或者其他的变量当中。DPDK涉及到的参数比较多,后续会根据需要补充说明各参数的含义。

9. 插件初始化

如果是Windows系统,是不支持插件动态载入的,eal_plugins_init()的内容为空。是Linux系统时,如果能通过执行系统调用dlopen打开动态链接库librte_eal.so.XX,则调用eal_plugin_add将默认动态库的目录default_solib_dir添加到全局变量solib_list当中(此外还可以通过DPDK的启动参数-d,将自定义目录添加到solib_list中)。

由于在初始化阶段加入solib_list中的可能是动态库本身也可能是动态库所在的目录,eal_plugins_init()会在遍历solib_list中将目录中的*.so文件全部遍历之后加入solib_list中;如果已经是*.so本身,则设置solib的lib_handle。

10. 初始化跟踪功能

调用eal_trace_init()初始化跟踪功能,该功能是对一些事件和变量进行跟踪,用于多线程同步和时间度量等。该功能比较复杂,后续分析过程中会详细介绍,此处先略过。

11. 解析设备

前面提到DPDK的参数时,-a和-b参数分别指定网卡设备的白黑名单,这些信息是存放在devopt_list这个全局变量当中的,eal_option_device_parse()会遍历其中的每个设备,并转换成新的数据结构存放在devargs_list当中。

未完待续…

相关内容

热门资讯

安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...
安卓系统是不是快要,安卓系统即... 你有没有发现,最近安卓系统好像有点儿“不安分”了呢?是不是快要发生什么大事情?咱们一起来探个究竟吧!...
安卓6系统和8系统差别,全面对... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,安卓系统也跟着时代的步伐,从6系统一路升...
安卓11系统推荐下载,体验全新... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓11系统!这款全新的操作系统一经推出,就吸引...
原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...