vpp源码分析(2) - 入口函数

image.png

我们使用:cmake3 --build /mnt/vdb1/vpp/build-root/build-vpp_debug-native/vpp
编译了 vpp
在次之前执行了make install-ext-deps,DPDK各种库文件已经安装,模块已经安装到了内核,
现在我们要分析一下入口函数。

进入目录:/mnt/vdb1/vpp/build-root/build-vpp_debug-native/vpp

nm -al bin/vpp 生成符号表,带源文件地址。
objdump -j .text -Sl bin/vpp --prefix-addresses > debug.info 反汇编,汇编和C语言混合。

上面生成以备后用。
调试使用cgdb.

[root@devel-ng-exporter-225 vpp]# pwd
/mnt/vdb1/vpp/build-root/build-vpp_debug-native/vpp
[root@devel-ng-exporter-225 vpp]# cgdb bin/vpp

/usr/bin/vpp -c /etc/vpp/startup.conf
我们先看一下用户态程序的参数传递规则:

int
main (int argc, char *argv[])
{
00000000004066b5 <main> push   %rbp    #上一个调用函数的执行指针压栈
00000000004066b6 <main+0x1> mov    %rsp,%rbp #rbp本帧的栈开始 
00000000004066b9 <main+0x4> sub    $0x1160,%rsp #本帧栈结束
00000000004066c0 <main+0xb> mov    %edi,-0x1154(%rbp) #第一个参数入栈
00000000004066c6 <main+0x11> mov    %rsi,-0x1160(%rbp)#第二个参数入栈
00000000004066cd <main+0x18> mov    %fs:0x28,%rax
00000000004066d6 <main+0x21> mov    %rax,-0x8(%rbp)
00000000004066da <main+0x25> xor    %eax,%eax

tips:
C语言x86_64的整形和指针型的参数传递是rdi,rsi,rdx,rcx,r8,r9中,多于这些寄存器的参数会被保存在栈上。并且要注意的是断点不会指向函数的开头,而是执行地址偏后一些的源码级别的开头。
182│ static inline int
183│ clib_get_cpuid (const u32 lev, u32 * eax, u32 * ebx, u32 * ecx, u32 * edx)
184│ {
185├> if ((u32) __get_cpuid_max (0x80000000 & lev, 0) < lev)
186│ return 0;
187│ if (lev == 7)
188│ __cpuid_count (lev, 0, *eax, *ebx, *ecx, *edx);
189│ else
190│ __cpuid (lev, *eax, *ebx, *ecx, *edx);
191│ return 1;
192│ }

断点位置不在函数开头

注意:从上图可以看到他把传递的参数都压栈了(rdi,rsi,rdx,rcx,r8)
栈布局

当前帧的结束地址
(gdb) info r rsp
rsp 0x7fffffffd070 0x7fffffffd070

1 解析文件:/etc/vpp/startup.conf

    while (1)
    {
      if (fgets (inbuf, 4096, fp) == 0)
        break;
      p = strtok (inbuf, " \t\n");
      while (p != NULL)
        {
          if (*p == '#')
        break;
          argc_++;
          char **tmp = realloc (argv_, argc_ * sizeof (char *));
          if (tmp == NULL)
        return 1;
          argv_ = tmp;
          arg = strndup (p, 1024);
          if (arg == NULL)
        return 1;
          argv_[argc_ - 1] = arg;
          p = strtok (NULL, " \t\n");
        }
    }

上面程序很精简,并不复杂得到下面的结果:

(gdb) p argv_[0]
$24 = 0x6ff2f0 "/mnt/vdb1/vpp/build-root/build-vpp_debug-native/vpp/bin/vpp"
(gdb) p argv_[1]
$25 = 0x6ff340 "unix"
(gdb) p argv_[2]
$26 = 0x6ff360 "{"
(gdb) p argv_[3]
$27 = 0x6ff2d0 "nodaemon"
(gdb) p argv_[4]
$28 = 0x6ff3b0 "log"
(gdb) p argv_[5]
$29 = 0x6ff410 "/var/log/vpp/vpp.log"

设置main程序亲和性,main_core默认为1,可在文件中配置。

# https://fdio-vpp.readthedocs.io/en/latest/gettingstarted/users/configuring/startup.html

#heapsize 2G

#Alternate syntax to choose plugin path. Plugin_path configuration
#controls the set of directories searched for vlib plugins. Supply
# a colon-separated list of (absolute) directory
#names: plugin_path dir1:dir2:…:dirN
#plugin_path /home/bms/vpp/build-root/install-vpp-native/vpp/lib/vpp_plugins

#test_plugin_path

#main-core <n>
#Assign main thread to a specific core.
main-core 1

unix {
  nodaemon
  log /var/log/vpp/vpp.log
  full-coredump
  cli-listen localhost:5002
}

api-trace {
  on
}

dpdk {
  dev 0000:00:08.0
}

关于/etc/vpp/startup.conf中参数和使用配置参考:https://fdio-vpp.readthedocs.io/en/latest/gettingstarted/users/configuring/startup.html

设置main程序的亲和性:

  /* set process affinity for main thread */
  CPU_ZERO (&cpuset);
  CPU_SET (main_core, &cpuset);
  pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);

272│ /* Set up the plugin message ID allocator right now... */
273├> vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);

上面完成:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342