前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >深入浅出思科VPP24.02系列:thread0函数业务逻辑介绍

深入浅出思科VPP24.02系列:thread0函数业务逻辑介绍

作者头像
通信行业搬砖工
发布2024-10-12 21:24:20
发布2024-10-12 21:24:20
8800
代码可运行
举报
文章被收录于专栏:网络虚拟化网络虚拟化
运行总次数:0
代码可运行

上期内容回顾

在上一篇章节中,我们介绍了思科VPP软件核心函数vlib_unix_main初始化介绍,

文章链接如下:

深入浅出思科VPP24.02系列:vlib_unix_main初始化介绍

其初始化流程如下所示:

接下来我们将继续介绍上一章节中:clib_calljmp在开启thread0的同时也向thread0这个线程传入了栈; 之后的业务流程

代码语言:javascript
代码运行次数:0
复制
代码片段:
i = clib_calljmp (thread0, (uword) vm,
        (void *) (vlib_thread_stacks[0] +
            VLIB_THREAD_STACK_SIZE));
  return i;

VPP函数thread0介绍

函数路径介绍:thread0函数位于vlib/unix/main.c中

函数功能介绍:主要是调用vlib/main.c的vlib_main()函数。

代码逻辑展示:

代码语言:javascript
代码运行次数:0
复制
static uword
thread0 (uword arg)
{
  vlib_main_t *vm = (vlib_main_t *) arg;
  vlib_global_main_t *vgm = vlib_get_global_main ();
  unformat_input_t input;
  int i;

  vlib_process_finish_switch_stack (vm);

  unformat_init_command_line (&input, (char **) vgm->argv);
  i = vlib_main (vm, &input);
  unformat_free (&input);

  return i;
}

结构体vlib_global_main_t介绍

代码语言:javascript
代码运行次数:0
复制
typedef struct vlib_global_main_t
{
  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);

  /* Per-thread Mains */
  vlib_main_t **vlib_mains;

  /* Name for e.g. syslog. */
  char *name;

  /* full path to main executable */
  char *exec_path;

  /* command line arguments */
  u8 **argv;

  /* post-mortem callbacks */
  void (**post_mortem_callbacks) (void);

  /*
   * Need to call vlib_worker_thread_node_runtime_update before
   * releasing worker thread barrier.
   */
  int need_vlib_worker_thread_node_runtime_update;

  /* Command line interface. */
  vlib_cli_main_t cli_main;

  /* Node registrations added by constructors */
  vlib_node_registration_t *node_registrations;

  /* Event logger. */
  elog_main_t elog_main;
  u32 configured_elog_ring_size;

  /* Packet trace capture filter */
  vlib_trace_filter_t trace_filter;

  /* List of init functions to call, setup by constructors */
  _vlib_init_function_list_elt_t *init_function_registrations;
  _vlib_init_function_list_elt_t *main_loop_enter_function_registrations;
  _vlib_init_function_list_elt_t *main_loop_exit_function_registrations;
  _vlib_init_function_list_elt_t *worker_init_function_registrations;
  _vlib_init_function_list_elt_t *num_workers_change_function_registrations;
  _vlib_init_function_list_elt_t *api_init_function_registrations;
  vlib_config_function_runtime_t *config_function_registrations;

  /* Hash table to record which init functions have been called. */
  uword *init_functions_called;

} vlib_global_main_t;

结构体参数功能介绍:

1、CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); 其工程上的含义是:指定结构体按照64字节对齐,提高缓存命中。

关于CPU cacheline相关的基础知识介绍:在微机原理专业课上介绍是由tag、index和offset三者组合就可以唯一确定一个cache地址。

假设我们读取cache line的数据,64Bytes的数据,每个cache line的大小为8个字节,因此我们在读取的时候可以把这块数据看成一个数组,因此在使用对齐之后,避免内存空洞的出现,从而提高了读取的效率。

2、vlib_main_t **vlib_mains; 其工程意义为每个线程维护的mains,因为我们的vpp是使用intel DPDK的 run-to-complete的RTC模式,每个核处理自己的业务逻辑。关于RTC模式,在上一章节已经介绍,本次就不再多叙述。

3、vlib_node_registration_t *node_registrations; 节点注册相关功能,这个在后期章节中继续介绍。

4、elog相关功能,该部分主要是用来配置elog日志功能的参数;

代码语言:javascript
代码运行次数:0
复制
  elog_main_t elog_main;
  u32 configured_elog_ring_size;

5、vlib_trace_filter_t trace_filter; 该部分主要是和trace功能相关,主要是介绍报文在vpp处理的路径等可维护性相关的功能相关。

6、该部分主要涉及初始化函数等相关功能的介绍,在后期章节中介绍

代码语言:javascript
代码运行次数:0
复制
  _vlib_init_function_list_elt_t *init_function_registrations;
  _vlib_init_function_list_elt_t *main_loop_enter_function_registrations;
  _vlib_init_function_list_elt_t *main_loop_exit_function_registrations;
  _vlib_init_function_list_elt_t *worker_init_function_registrations;
  _vlib_init_function_list_elt_t *num_workers_change_function_registrations;
  _vlib_init_function_list_elt_t *api_init_function_registrations;
  vlib_config_function_runtime_t *config_function_registrations;

处理函数vlib_process_finish_switch_stack介绍

该部分主要是Sanitizers工具,发现代码bug相关的逻辑,在使能该特性的前提下使用。

代码语言:javascript
代码运行次数:0
复制
static_always_inline void
vlib_process_finish_switch_stack (vlib_main_t * vm)
{
#ifdef CLIB_SANITIZE_ADDR
  const void *bottom_old;
  size_t size_old;

  __sanitizer_finish_switch_fiber (&vm->asan_stack_save, &bottom_old,
           &size_old);
#endif
}

参数传入vlib_main介绍

该部分逻辑是将参数,格式化至input变量,传入vlib_main函数的逻辑

代码语言:javascript
代码运行次数:0
复制
  unformat_init_command_line (&input, (char **) vgm->argv);
  i = vlib_main (vm, &input);
  unformat_free (&input);

本次章节thread0的处理逻辑就讲完了,小伙伴们,你们学会了吗?

课间休息时间,放松一下心情!

下一章节,我们将继续介绍vlib_main()函数的处理逻辑,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 通信行业搬砖工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档