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当中。

未完待续…

相关内容

热门资讯

安卓双系统内存卡,安卓双系统内... 你有没有想过,为什么你的安卓手机有时候会卡得像蜗牛一样?其实,这跟你的内存卡有着千丝万缕的关系呢!今...
安卓系统怎么取消双卡,安卓系统... 手机里的双卡功能,有时候真是让人又爱又恨。有时候,你可能会觉得两个卡槽太占地方,或者一个卡槽的流量用...
安卓系统被篡改怎么修复,快速修... 手机突然变得不听使唤了?安卓系统被篡改,是不是让你心头一紧?别慌,今天就来手把手教你如何修复安卓系统...
倩女幽魂ios系统和安卓系统,... 你有没有玩过倩女幽魂这款游戏呢?它可是近年来非常火爆的一款手游,无论是倩女幽魂ios系统还是安卓系统...
现在安卓手机什么系统,揭秘最新... 你有没有发现,现在走在街上,几乎每个人手里都拿着一部安卓手机?那么,问题来了,现在安卓手机都运行着什...
安卓系统能校准坐标吗,坐标定位... 你有没有想过,你的安卓手机里的地图导航是不是有时候会“迷路”?别急,今天就来聊聊这个话题:安卓系统能...
王者荣耀安卓系统进不去,王者荣... 最近是不是有不少王者荣耀的安卓玩家遇到了一个让人头疼的问题——进不去游戏?别急,今天就来给你详细解析...
c11系统是安卓系统吗,揭秘其... 你有没有听说过C11系统?是不是好奇它是不是安卓系统的一员呢?今天,就让我带你一探究竟,揭开这个神秘...
安卓系统上有没有safari,... 你有没有想过,在安卓系统上,我们能不能也像在苹果手机上那样,使用Safari浏览器呢?这可是个让人好...
小米是安卓系统的吗,引领智能生... 亲爱的读者,你是否曾好奇过,那些在我们生活中无处不在的小米手机,它们到底是不是安卓系统的呢?今天,就...
Windows11安卓子系统 亲爱的读者们,你是否也像我一样,对Windows 11的新功能充满了好奇和期待?今天,我要和你聊聊一...
苹果系统怎么登录安卓号 你是不是也有过这样的烦恼?手机里装了各种应用,账号密码记不住,想换个手机系统用用,却发现账号绑定在另...
安卓系统相册总有相片,揭秘“总... 你有没有发现,不管你的安卓手机里存了多少照片,相册里总有那么几张“常驻嘉宾”呢?这些照片仿佛有魔力,...
g1安卓系统拆解,G1安卓系统... 你有没有想过,手机里的安卓系统其实就像一个神秘的盒子,里面藏着无数的秘密?今天,就让我带你一起拆解这...
现在安卓系统多久不卡,多久不卡... 你有没有发现,手机用久了,尤其是安卓系统,有时候就像老牛拉车一样,慢吞吞的,让人有点抓狂。那么,现在...
塞班系统会被安卓取代吗,未来将... 塞班系统,这个曾经手机界的王者,如今却面临着被安卓系统取代的危机。那么,塞班系统真的会被安卓取代吗?...
换壁纸怎么换安卓系统,安卓系统... 手机壁纸看腻了?想要给安卓系统换个新面貌?别急,跟着我一步步来,保证让你的手机焕然一新!一、解锁壁纸...
鸿蒙系统是安卓11吗,揭秘其与... 你有没有听说最近华为推出的鸿蒙系统?是不是好奇它和安卓11有什么关系呢?别急,今天就来给你揭秘这个谜...
安卓系统谷歌在哪里下,谷歌在安... 你有没有想过,你的安卓手机里那个无所不能的谷歌,它到底藏在哪里呢?别急,今天我就带你一探究竟,揭开安...
安卓系统如何回退老版本,安卓系... 手机用久了,是不是觉得安卓系统越来越卡,功能也越来越不跟得上潮流了呢?别急,今天就来教你怎么把安卓系...