一、内核如何启动应用程序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类子进程的任何一个