DPDK helloworld 源码阅读
在 DPDK Programmer's Guides 中的 EAL 一篇中有一个图可以很清晰地看到一个DPDK的应用程序的大致执行思路:

初始化检查CPU支持、微架构配置等完成后,执行main()函数。
- 第一步是
rte_eal_init(),核心初始化和启动。其中线程使用的是pthread库,创造线程,并设置CPU亲和性:DPDK通常每个核心固定一个pthread,以避免任务切换的开销。 - 然后是 other inits,其余对象的初始化(mbuf、mempool、ring、lpm hash table等)都应该作为主 lcore 上整体应用程序初始化的一部分来完成。
rte_eal_remote_lauch(func, NULL, lcore_id),在每个逻辑核上注册一个回调函数。rte_eal_mp_wait_lcore(),等待各个线程返回。- 继续其余的部分。
下面对照此思路阅读 /dpdk/examples/helloworld/main.c 这个代码:
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2014 Intel Corporation
*/
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h>
#include <rte_memory.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>
static int
lcore_hello(__attribute__((unused)) void *arg)
{
unsigned lcore_id;
lcore_id = rte_lcore_id(); // ⑤ 返回当前执行单元的线程ID
printf("hello from core %u\n", lcore_id);
return 0;
}
int
main(int argc, char **argv)
{
int ret;
unsigned lcore_id;
ret = rte_eal_init(argc, argv); // ① 初始化EAL
if (ret < 0)
rte_panic("Cannot init EAL\n");
RTE_LCORE_FOREACH_SLAVE(lcore_id) { // ② 浏览除主lcore之外的所有lcore
rte_eal_remote_launch(lcore_hello, NULL, lcore_id); // ③ 在lcore上执行函数
}
lcore_hello(NULL);
rte_eal_mp_wait_lcore(); // ④ 等待lcore完成工作
return 0;
}
① rte_eal_init()初始化环境抽象层(EAL)。此函数仅在应用程序的main()函数中尽快在MASTER lcore上执行。
② 宏:RTE_LCORE_FOREACH_SLAVE(i) :浏览除主lcore之外的所有正在运行的lcores。
#define RTE_LCORE_FOREACH_SLAVE(i)
Value:
for (i = rte_get_next_lcore(-1, 1, 0); \
i<RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 1, 0))
③ rte_eal_remote_launch(lcore_hello, NULL, lcore_id);在另一个lcore上启动一个函数。应仅在MASTER lcore上执行。第一个参数是函数名,第二个参数是以什么参数执行该函数,第三个参数是逻辑核的ID。
④ rte_eal_mp_wait_lcore();应仅在MASTER lcore上执行,等到lcore完成它的工作。一个lcore有三种状态:WAIT、RUNNING、FINISHED,对应空闲、正在执行一个函数、执行完成。依据三个状态来协调线程的launch和wait。
⑤ rte_lcore_id() 返回执行单元的线程ID
API 文档:
- DPDK Programmer's Guides - initialization-and-core-launching
- EAL环境抽象层 包括上文的 ①
- CPU-multicore:lcore ②、⑤
- CPU-multicore:launch ③、④
DPDK helloworld 源码阅读的更多相关文章
- DPDK L3fwd 源码阅读
代码部分 整个L3fwd有三千多行代码,但总体思想就是在L2fwd的基础上,增加网络层的根据 IP 地址进行路由查找的内容. main.c 文件 int main(int argc, char **a ...
- DPDK L2fwd 源码阅读
代码部分 /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #include ...
- DPDK flow_filtering 源码阅读
代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...
- DPDK flow_classify 源码阅读
代码部分 /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2017 Intel Corporation */ #include < ...
- DPDK QoS_meter 源码阅读
main.c /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #inclu ...
- [PHP源码阅读]explode和implode函数
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...
- Sping学习笔记(一)----Spring源码阅读环境的搭建
idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- [控件] Firemonkey 跨平台 Toast
控件说明:一个简单的讯息提示功能,使用 FMX 基本控件,因此支持 Win, macOS, iOS, Android 平台. 已知问题:如果使用了 WebBrowser, MapView... 等原生 ...
- WPF 主题
原文:WPF 主题 WPF 切换主题 string packUri = String.Format(@"/WpfControlLibrary1;component/Dictionary1.x ...
- jQuery学习- 内容选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 9.22 开课第十九天(window对象)
DOM:文档对象模型 --树模型 文档:标签文档,对象:文档中每个元素对象,模型:抽象化的东西 一:window: 属性(值或者子对象): opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏 ...
- Famous框架系列一:famous/core/Surface
famous/core/Surface 既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us Famous12年的作品,点击右下角Fun thi ...
- CSS盒模型 flex
用于网页布局,PC的话,兼容性不够,慎用,手机端的话,神器 整理部分通用的,可以直接复制的,省得下次再写一遍 注意,设为 Flex 布局以后,子元素的float.clear和vertical-alig ...
- CentOS 7.X下 -- 配置nginx正向代理支持https
环境说明: 本次测试使用的操作系统为:CentOS 7.2 x86 64位 最小化安装的操作系统,系统基础优化请参考:https://www.cnblogs.com/hei-ma/p/9506623. ...
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- jmeter控制器(一)
简单控制器: 也就是最简单的控制器,里面没有任何内容的,如下图所示: 当我设置线程为循环10次时,运行简单控制器及下边的注册,设置如下图: 通过查看结果数得知,注册只成功了一次 ,再注册时出现邮箱已存 ...
- Received non-all-whitespace CHARACTERS or CDATA event in nextTag(). ,无法整齐打印验证错误。 解析XML文档出现的问题
在启动keyCloak,想要在standAlone模式下切换数据库,修改standAlone.xml文件时. 在bin/目录下启动standAlone模式出现错误: 10:07:24,799 INFO ...