init进程,是一个由内核启动的用户级进程,内核自行启动后,就通过启动 init来完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
代码[2]: 如果bootloader里设置传给内核的参数init=/linuxrc,execute_command就等于/linuxrc,如果定义了,就会run_init_process(execute_command);执行这个应用程序,如果没有定义这个参数,就会往下走。
代码[3]: 如果bootloader中没有设置传给内核的参数init=,那么就依次执行这四个,如果进入其中一个之后,就不会再返回了。
代码[4]:如果bootloader没有传递参数,上面[3]中指定运行的四个文件都不在的话,系统就陷入暂停,等待用户输入init=?的正确地址。
init进程是所有其他进程的父进程,它根据文件的内容运行一系列程序和脚本文件,完成系统的各项配置,最终达到启动用户应用程序的目的。
在这里我们分析两种init初始化模式:
1.标准的system V
init 进程首先进行一系列的硬件初始化,并挂载根文件系统。最后 init 进程会执行用 户传递过来的“init=”启动参数执行用户指定的命令,或者执行以下几个进程之一,由内核态变为用户态:
<span style="font-size:18px;">static noinline int init_post(void)
__releases(kernel_lock)
{
......
[1]if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
......
[2]if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
[3]run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
[4]panic("No init found. Try passing init= option to kernel.");
}
</span>
代码[1]:在启动第一个程序前,首先打开控制台设备sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0),这样init进程就拥有一个控制台,并可以从中读取输入信息在串口终端显示,也可以向其中写入信息。代码[2]: 如果bootloader里设置传给内核的参数init=/linuxrc,execute_command就等于/linuxrc,如果定义了,就会run_init_process(execute_command);执行这个应用程序,如果没有定义这个参数,就会往下走。
代码[3]: 如果bootloader中没有设置传给内核的参数init=,那么就依次执行这四个,如果进入其中一个之后,就不会再返回了。
代码[4]:如果bootloader没有传递参数,上面[3]中指定运行的四个文件都不在的话,系统就陷入暂停,等待用户输入init=?的正确地址。
init进程是所有其他进程的父进程,它根据文件的内容运行一系列程序和脚本文件,完成系统的各项配置,最终达到启动用户应用程序的目的。
在这里我们分析两种init初始化模式:
1.标准的system V