现在的位置: 首页 > 综合 > 正文

根文件系统启动的第一个应用程序init

2018年04月17日 ⁄ 综合 ⁄ 共 1323字 ⁄ 字号 评论关闭

一、内核如何启动应用程序init:

内核在挂载完根文件系统之后,会执行init_post:

/*打开/dev/console,让标准输入、标准输出和标准错误都指向这个设备*/

if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
(void) sys_dup(0);
(void) sys_dup(0);

       

/*uboot传人init=xxx,则执行init传人的参数,否则,执行以下几个应用程序的一个*/

if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s.  Attempting "
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

panic("No init found.  Try passing init= option to kernel. ");

总结:通过ls /sbin/init可以知道,该程序指向busybox,所以执行的第一个应用程序就是:busybox代码里面的init.c的init_main函数。

二、busybox /init/init.c代码分析:

console_init();

parse_inittab();

    new_init_action(uint8_t action_type, const char *command, const char *cons)//新建init_action结构体变量,填充

 
     //添加到init_action_list链表

run_actions(SYSINIT);

run_actions(WAIT);

run_actions(ONCE);

while(1)

{

run_actions(RESPAWN | ASKFIRST);

}

通过分析代码,可以知道init主要的工作是读取配置文件、解析配置文件、并执行配置文件里面的命令。

三、配置文件/etc/inittab:

配置文件的作用:1.指定应用程序;2.执行时机

配置文件的格式:identifier : run_level : action : process

         idenifier:控制台     run_level:忽略   action:执行时机    process:程序或脚本

   action可以分为三种:

        启动前期,Init首先启动action为sysinit,wait,once的3类子进程
        运行期间,Init 进程首先启动action为respawn,askfirst的两类子进程。
        退出时,执行action为shutdown,restart,ctraltdel的3类子进程的任何一个

抱歉!评论已关闭.