
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.读取配置文件
-
2.解析配置文件
-
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.总结最小根文件系统所需东西
-
终端/dev/console 设置/dev/null (如果没有设置标准输入,输出,错误——>无底洞,输出看不到)
-
设置配置文化inittab(配置文件里指定的应用程序或默认配置)
-
需要库(我们想我们自己建立的.c文件里的各种fopen,fread都是c库)
-
init本身,即busybox
下一节我们就来构建最小根文件系统
本文介绍了Linux终端命令如何通过busybox实现,并详细分析了init进程的工作原理,包括读取配置文件inittab、解析配置文件及执行用户程序的过程。
20

被折叠的 条评论
为什么被折叠?



