主题 : 【分享】分析busybox中init程序的运行过程 复制链接 | 浏览器收藏 | 打印
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
贡献值: 5 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
楼主  发表于: 2011-11-07 14:54

 【分享】分析busybox中init程序的运行过程

管理提醒: 本帖被 kasim 执行置顶操作(2011-11-07)
移植uboot的目的是启动内核,启动内核的目的是运行应用程序,从内核的启动流程中可以知道内核启动的第一个应用程序就是busybox里的/sbin/init进程!

但是我们的最终目的不是启动init进程,而是运行客户的程序!
那么init进程是如何选择性的运行客户的程序呢?我们猜测init进程肯定需要:
(1) 读取一个配置文件
(2) 解析该配置文件
(3) 根据配置文件执行客户的程序

下面我们来阅读busybox中init程序的源码,在init.c中的init_main()中:
1.首先是设置信号
     signal(SIGHUP, exec_signal);
    signal(SIGQUIT, exec_signal);
    signal(SIGUSR1, shutdown_signal);
    signal(SIGUSR2, shutdown_signal);
    signal(SIGINT, ctrlaltdel_signal);
    signal(SIGTERM, shutdown_signal);
    signal(SIGCONT, cont_handler);
    signal(SIGSTOP, stop_handler);
    signal(SIGTSTP, stop_handler);
2.初始化/dev/console
console_init();
3.解析配置文件
if (argc > 1
     && (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1'))
    ) {
    } else {
        parse_inittab();
    }
内核启动/sbin/init是没有传如何参数,所以进入parse_inittab()函数,
我们进入到该函数:
file = fopen(INITTAB, "r");
#define INITTAB      "/etc/inittab"
由此可以知道init进程读取的配置文件就是/etc/inittab,busybox中的inittab文件中规定了/etc/inittab内容的填写格式如下:
<id>:<runlevel>:<action>:<process>
Id:id会加上一个/dev前缀作为一个控制终端(stdin,stdout,stderr)
Runlevel:忽略
Action:执行的时机,包括SYSINIT,WAIT,ONCE, RESPAWN,ASKFIRST等
Process:要执行的应用程序或者脚本
继续分析parse_inittab():
    if (file == NULL)
{
    new_init_action(CTRLALTDEL, "reboot", "");                new_init_action(SHUTDOWN, "umount -a -r", "");
    new_init_action(RESTART, "init", "");
    new_init_action(ASKFIRST, bb_default_login_shell, "");        new_init_action(ASKFIRST,bb_default_login_shell,VC_2);        new_init_action(ASKFIRST,bb_default_login_shell,VC_3);        new_init_action(ASKFIRST,bb_default_login_shell,VC_4);
    new_init_action(SYSINIT, INIT_SCRIPT, "");
    return;
#if ENABLE_FEATURE_USE_INITTAB
}
如果配置文件/etc/inittab不存在的话则执行if语句,也就是说如果没/etc/inittab的话init进程会直接调用new_init_action来构造默认配置项,根据if语句里的内容,我们可以反推出等效的/etc/inittab的内容如下:
::CTRLALTDEL:reboot
::SHUTDOWN:umount -a –r
::RESTART:init
::ASKFIRST:-/bin/ah
tty2:: ASKFIRST:-/bin/sh
tty3:: ASKFIRST:-/bin/sh
tty4:: ASKFIRST:-/bin/sh
::SYSINIT:/etc/init.d/rcS

继续分析parse_inittab():
后面就是对配置文件/etc/inittab里的内容里的解析了,如#则视作注释等等,最后就调用new_init_action(a->action, command, id);将/etc/inittab里的每一条配置项做成一个init_action结构体并添加到具有相同执行时机的init_action_list中去。说到底解析/etc/inittab这个配置文件就是为了把各配置项添加到对应的init_action_list中去。
这样parse_inittab()这个函数就结束了,我们继续看init_main()这个函数:
4.开始运行parse_inittab()帮我们添加到init_action_list中的程序或脚本:
    run_actions(SYSINIT);
    run_actions(WAIT);
    run_actions(ONCE);
while (1)
{
run_actions(RESPAWN);
run_actions(ASKFIRST);
}
run_actions为运行一类程序或脚本,这里的一类就是按照执行时机来分类的。由上面这段代码我们就可以看出执行时机的优先级了:SYSINIT> WAIT> ONCE> RESPAWN> ASKFIRST,具体的可以继续分析源码
好好学习,天天鲁管
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2011-11-07 15:24
好。谢谢分享!
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2011-11-08 10:11
楼主的另外一个帖子, 【补充】关于内核是如何启动第一个应用程序的 http://www.aiothome.net/read.php?tid-16095.html
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
贡献值: 5 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
3楼  发表于: 2011-11-08 10:16
  
好好学习,天天鲁管
级别: 侠客
UID: 47357
精华: 0
发帖: 76
金钱: 390 两
威望: 78 点
贡献值: 0 点
综合积分: 152 分
注册时间: 2011-05-21
最后登录: 2017-09-13
4楼  发表于: 2011-11-09 19:29
谢谢,学习了
新手上路
级别: 侠客
UID: 69243
精华: 0
发帖: 80
金钱: 400 两
威望: 80 点
贡献值: 0 点
综合积分: 160 分
注册时间: 2012-05-03
最后登录: 2016-03-19
5楼  发表于: 2012-05-17 23:08
菜鸟表示还有好长一段路要走