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

本文介绍了Linux终端命令如何通过busybox实现,并详细分析了init进程的工作原理,包括读取配置文件inittab、解析配置文件及执行用户程序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.终端命令由来

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

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

ls = busybox ls 

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

 

2.分析busybox的源码

我们在source insight 建立busybox的工程

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

 

同样init.c里也有init_main()

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

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

 

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

  1. 1.读取配置文件

  2. 2.解析配置文件

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

 

 

3.阅读init.c文件

(1)分析配置文件

这里我们知道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就会得出下面结论

 

继续 分析init.c,

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

然后下面是解析配置文件

解析完后最后调用

上面没有找到配置文件也有帮我们执行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)函数

有一个init_action结构

以及一个链表

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

 

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

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

(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

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

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

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

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

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

  4. init本身,即busybox

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值