在Openwrt系统中执行ps
命令可以看到 1号进程就是procd
.
root@OpenWrt:/# ps -w
PID USER VSZ STAT COMMAND
1 root 1856 S /sbin/procd
但实际上内核启动完成后,运行的第一个用户进程并不是procd
,在运行procd
之前还执行了其他准备工作,换句话说,procd
并不一开始就是“老大”,它只是最终接替了老大的位置。
下面就从内核即将启动用户空间第一个进程开始介绍Openwrt系统的启动流程。
kernel_init
在kernel启动的尾声,内核会去查找并调用 用户空间的init进程,从而进行内核态到用户态的切换,init
进程就是用户空间的第一个进程,它的进程号为1 。
init
进程路径可以通过如下方式指定:
如下2种方式是通过cmdline或者设备树获取init进程路径
- ramdisk_execute_command
- execute_command
如下方式是通过内核配置指定init进程路径
- CONFIG_DEFAULT_INIT
如下4种方式是直接运行指定的程序作为init进程(按顺序查找,如果同时存在也只会运行第一个):
- /sbin/init
- /etc/init
- /bin/init
- /bin/sh
static int __ref kernel_init(void *unused)
{
/*
省略部分初始化
*/
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
if (!ret)
return 0;
pr_err("Failed to execute %s (error %d)\n",
ramdisk_execute_command, ret);
}
if (execute_command) {
ret = run_init_process(execute_command);
if (!ret)
return 0;
panic("Requested init %s failed (error %d).",
execute_command, ret);
}
if