Linux内核启动应用程序分析(二)

来源:互联网 发布:linux打包压缩命令zip 编辑:程序博客网 时间:2024/05/05 23:36

在前面的分析中我们了解到,内核挂接到根文件系统之后,进入init_post这个函数,开始启动应用程序。在前一篇博文中,我们具体分析了init_post最终会调用run_init_process(“\sbin\init”)这个函数进入下一阶段的启动流程。请参考:http://blog.csdn.net/stephen_lu_fahai/article/details/70452434

在此之前,我们首先来了解一个新的概念:busybox。所谓的busybox,实际上是一些命令的集合,比如:cd ls cp等。之所以会有这个概念是因为如果把每个命令都单独编译和链接的话,会比较麻烦,倒不如把所有的命令都链接到busybox下,这样我们只要编译和链接busybox就相当于编译和链接这些命令。而在run_init_process(“\sbin\init”)这个函数中,init也是到busybox的链接。

所以我们要想知道run_init_process(“\sbin\init”)这个函数具体做了什么事情,我们就要找到busybox的源码来分析。

busybox源码目录下,我们可以看到各种指令的文件,然而我们要关心是init.c这个文件。进入这个文件,我们首先要看的当然是main函数:

在main函数中有这么一段:首先看954行的判断,由于挂接文件系统的时候,我们没有给它参数,所以argc=1(默认值),所以这一段函数会执行else的部分,也就是parse_inittab,从名字中我们就能看得出来,这个函数解析初始化的文件,进去看一下:


在这个函数中,764行,首先打开INITTAB这个文件,这个文件定义为:

#define INITTAB      "/etc/inittab"/* inittab file location */   显然是配置文件,那配置文件到底有什么内容,我们可以在bosybox源码目录下搜索,发现inittab在这个路径下:busybox-1.7.0\example,打开它:


首先我们看第10行选中的部分:Format for each entry: <id>:<runlevels>:<action>:<process>,说得很明白,它的格式为:

<id>:<runlevels>:<action>:<process>,并且随后对每一个部分都作出了解释:

id=>/dev/id,用作终端:(stdin stdout  stderr printf  scanf),还记得我们前一篇博文里面分析的首先打开一个文件吗?这里就是它的格式。

runlevels:可以完全忽略

action:执行时机

process:应用程序或者脚本

也就是我们知道了这个配置文件的格式是这个样子的。。。那么我们再回到parse_inittab这个函数。

parse_inittab函数下:

765行,判断这个文件是否存在,也就是说是否成功打开这个文件。

765到786行,如果这个文件不存在的话,就会处理默认的配置信息。

从786行开始,如果成功打开这个文件的话,就会对这个文件进行解析,再进行处理。

我们可以看到,无论是直接处理默认的信息还是解析文件后再处理,都是调用new_init_action进行的。

咱们下次接着分析吧。









0 0
原创粉丝点击