2.init进程分析以及分析Busybox源码

1.终端命令由来

在linux终端,各种命令(如,ls,cp,mkdir等)的定义,是在busybox中定义

我们执行这些命令,实际上是执行busybox

ls = busybox ls 

2.init进程分析以及分析Busybox源码

所以我们想知道/sbin/init这个程序做什么事情,就要去分析busybox的源码

 

2.分析busybox的源码

我们在source insight 建立busybox的工程

随便搜索一个命令cp,找到cp.c看到有cp_main(),于是我们知道我们执行cp指令时,会去调用cp_main()

2.init进程分析以及分析Busybox源码

 

同样init.c里也有init_main()

我们先回顾一下,u-boot的目的是启动内核

内核的目的是启动应用程序,它启动了第一个应用程序叫init进程还有其他,但是我们还想启动的是用户程序(如,手机程序,监控程序等)

 

用户程序各有不同,于是我们猜测init进程是要实现的是

  1. 1.读取配置文件

  2. 2.解析配置文件

  3. 3.执行(用户程序)

 

 

3.阅读init.c文件

(1)分析配置文件

2.init进程分析以及分析Busybox源码

这里我们知道init会去打开配置文化/ect/inittab,

我们在busybox目录下打开inittab(在busybox-1.7.0\examples)

 

知道配置文件的inittab的格式

# <id>: WARNING: This field has a non-traditional meaning for BusyBox init!

 

用户程序各有不同,我们猜想inittab会1.根据不同的应用程序而执行,2.以及何时执行

分析inittab就会得出下面结论

2.init进程分析以及分析Busybox源码

 

继续 分析init.c,

这里是说如果没有配置文件,就按默认配置

2.init进程分析以及分析Busybox源码

然后下面是解析配置文件

2.init进程分析以及分析Busybox源码

解析完后最后调用2.init进程分析以及分析Busybox源码

上面没有找到配置文件也有帮我们执行new_init_action

我们以其中一个为例

            new_init_action(ASKFIRST, bb_default_login_shell, VC_2);

——》 new_init_action(ASKFIRST, -/bin/sh,/dev/tty2);

比较:static void new_init_action(int action, const char *command, const char *cons)

由inittab图得出

action对应执行时机

command对应应用程序

cons:id

 

我们看static void new_init_action(int action, const char *command, const char *cons)函数

2.init进程分析以及分析Busybox源码

有一个init_action结构

2.init进程分析以及分析Busybox源码

以及一个链表

2.init进程分析以及分析Busybox源码

于是我们知道new_init_action要做的事情是:

2.init进程分析以及分析Busybox源码

 

假设我们没有设置配置文件,按照默认配置,我们推出默认配置为:

2.init进程分析以及分析Busybox源码

(2)启动配置文件——run_actions()——执行应用程序

2.init进程分析以及分析Busybox源码

(1)run_actions(SYSINIT);  //之前的配置文件还有其他程序在这里被执行

    waitfor(a, 0); //执行应用程序,等待执行完毕

              run(a); //创建process进程

              waitpid(runpid, &status, 0);  //等待结束

    delete_init_action(a);                     //在init_action_list链表里删除

(2)run_actions(WAIT);    

    waitfor(a, 0); //执行应用程序,等待执行完毕

              run(a); //创建process进程

              waitpid(runpid, &status, 0);  //等待结束

    delete_init_action(a);                     //在init_action_list链表里删除

(3)run_actions(ONCE);

         run(a); //创建process进程

    delete_init_action(a);                     //在init_action_list链表里删除

(4)while (1) {

        run_actions(RESPAWN);

                if(a->pid==0){   

                     a->pid=run(a);

                }

        run_actions(ASKFIRST);

                if(a->pid==0){   

                     a->pid=run(a);

                                    run(a):打印:"\nPlease press Enter to activate this console. ";

                                                     等待回车

                                                     创建子进程

                }

        while (wpid > 0) {        //等待子进程退出

                    a->pid=0;        //退出后,设置pid=0

                }

            }

除了上面那几个run_actions,还有这几个由信号来执行的run_actions

2.init进程分析以及分析Busybox源码

这样我们就执行了应用程序

4.总结最小根文件系统所需东西

  1. 终端/dev/console  设置/dev/null (如果没有设置标准输入,输出,错误——>无底洞,输出看不到)

  2. 设置配置文化inittab(配置文件里指定的应用程序或默认配置)

  3. 需要库(我们想我们自己建立的.c文件里的各种fopen,fread都是c库)

  4. init本身,即busybox

下一节我们就来构建最小根文件系统

 

相关文章:

  • 2021-05-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-09
  • 2022-01-09
  • 2022-02-28
  • 2021-04-05
猜你喜欢
  • 2021-09-20
  • 2021-10-11
  • 2021-10-01
  • 2021-08-26
  • 2021-08-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案