【openwrt】【procd】Openwrt系统启动流程分析

文章详细解释了OpenWrt系统启动时,从内核调用init进程,到init进程如何引导后续的preinit和procd,以及procd如何接替init成为系统主进程的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知否,知否

来一杯冰美式把

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值