VPP学习-VPP初始化流程

概念

        VPP作为一个开源的、高性能的用户态网络协议栈,以进程的形式运行于Linux或(类unix)系统下,即VPP实际是一个用户进程,VPP启动后可通过"ps -ef | grep vpp"命令查看。

VPP启动

        用户态进程启动都有一个main函数即程序入口函数,VPP也不例外,VPP main函数位于/src/vpp/net/main.c中,主要做了如下工作:

        1)加载并解析VPP配置文件startup.conf,获取诸如heapsize、plugin_path等配置参数值。

        2)利用配置参数值完成内存堆初始化

        3)vlib_main_init

        4)vpe_main_init

        5)vlib_unix_main

        针对上述过程,分别了解学习

配置文件解析

        VPP配置文件在启动时通过 如下形式加载:

        vpp -c /etc/vpp/startup.conf

         关于配置文件形式、内容及参数含义可参考此前博客:VPP配置文件介绍

        配置文件读取、解析获取配置参数信息。 

堆初始化

        配置文件解析后,完成相关初始化工作,具体如下:

        1)设置堆大小,堆页大小参数,堆大小默认为1G,在main函数入口时设定uword main_heap_size = (1ULL << 30),

        2)设置主线程CPU亲和性

        3)根据此前设置好的堆相关参数,分配并完成堆的初始化

                a)main_heap = clib_mem_init_with_page_size (main_heap_size,
                         main_heap_log2_page_sz)

                        i) clib_mem_init_internal

                                1) clib_mem_main_init初始化VPP巨页大小及numa节点信息

                                2)clib_mem_create_heap_internal (base, size, log2_page_sz,
                     1 /*is_locked */ , "main heap") 分配创建堆,

                                        a)获取有效的页大小信息

                                        b)使得分配内存的大小对齐于页大小

                                        c)clib_mem_vm_map_internal分配heap内存

                                        d)初始化并返回结构体变量指针clib_mem_heap_t *h.

                b)获取当前numa 节点索引

                c)设置巨页大小

                d)根据此前分配的主堆设置每一个numa节点的main_heap:  clib_mem_set_per_numa_heap (main_heap);

vlib_main_init

        1)vgm->init_functions_called = hash_create (0, /* value bytes */ 0);创建hash表用于记录已被调用的初始化函数;当vpp启动后,可以

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值