基于Linux与Busybox的Reboot命令流程分析

本文详细分析了Busybox中reboot命令的执行流程,从Busybox层的restart_handler函数开始,讲解如何调用Linux内核的mach_reset,并深入探讨不同ARM芯片的处理方式。文章通过源码解析,展示了如何从用户空间的reboot命令触发,最终到内核的arch_reset函数,实现系统的重启。
***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.01.26

类别:Linux 内核系统源码分析                                                             声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:Busyobx层的分析

        这段时间,在忙到一个项目时,需要在busybox中用到reboot命令,开始在busybox中的shell中输入reboot命令,始终如下的信息,然后就停止在那里了,无法重启...为了彻底的弄明白这个问题,我在网络上找了很久,终于有个人写的一个reboot流程分析,我就借花献佛.在这里重新分析下busybox是如何运行这个命令,同时又是如何调用到Linux内核中的mach_reset中的arch_reset,当针对不同的ARM芯片时,作为Linux内核开发和驱动开发的朋友,对于这个流程还是一定要了解的。要不,出现问题,又如何找出问题呢。忘记了reboot的打印信息了,如下:

The system is going down NOW !!
Sending SIGTERM to all processes.
Sending SIGKILL to all processes.
Please stand by while rebooting the system.
Restarting system.
.


通过分析busybox1.20.0的代码可以看出在init.c中有这样一行的代码,如下:

int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int init_main(int argc UNUSED_PARAM, char **argv)
{
	static const int magic[] = {
		RB_HALT_SYSTEM,
		RB_POWER_OFF,
		RB_AUTOBOOT
	};
	static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };
	......
	/* struct sysinfo is linux-specific */
#ifdef __linux__
	/* Make sure there is enough memory to do something useful. */
	if (ENABLE_SWAPONOFF) { //是否配置了swapoff命令
		struct sysinfo info;

		if (sysinfo(&info) == 0
		 && (info.mem_unit ? info.mem_unit : 1) * (long long)info.totalram < 1024*1024
		) {
			message(L_CONSOLE, "Low memory, forcing swapon");
			/* swapon -a requires /pr
### OpenWRT 系统的重启流程 在 OpenWRT 中,`reboot` 命令用于重新启动系统。其具体实现涉及多个阶段和组件交互,以下是详细的描述: #### 1. **BusyBox 的 `init/halt.c` 文件** 当用户执行 `reboot` 命令时,实际调用的是 BusyBox 提供的功能[^1]。此功能位于 `init/halt.c` 文件中,负责处理关机和重启的核心逻辑。 - 如果未指定 `-f` 参数,则通过 init 进程完成关机操作。 - 参数选项解释如下: - `-w`: 仅记录当前用户的使用情况至 `/var/log/wtmp` 或类似的日志文件,不执行任何硬件级别的操作。 - `-n`: 不同步磁盘缓存(即跳过 `sync()` 函数),这可能导致数据丢失。 - `-f`: 强制重启而不经过正常的关闭路径。 #### 2. **Procd 处理机制** `reboot` 命令会触发 Procd 守护程序进入特定的状态序列[^2]。这一过程类似于系统的初始化 (`sysinit`) 流程,但入参设置为 `shutdown` 而不是 `start`。 - 首先,Procd 执行 `/etc/rc.d/K* shutdown` 脚本集合来停止服务和其他必要的清理工作。 - 接着,状态从 `STATE_SHUTDOWN` 切换到 `STATE_HALT`,标志着即将进行最终的硬件重置或断电动作。 #### 3. **Kernel 层面的行为** 一旦到达 `STATE_HALT`,控制权交还给 Linux 内核以完成最后的操作[^3]。内核内部定义了一个名为 `kernel_init` 的函数,在这里可以观察到具体的停机指令被传递到底层驱动器或者 BIOS/UEFI 固件接口处。 #### 4. **Hotplug Event 和网络环境调整** 值得注意的是,在某些情况下,如果存在动态 IP 地址分配或其他类型的联网变动事件发生之前可能已经激活了相应的 hotplug handler 来响应这些改变[^4]。尽管这部分主要关注于正常运行期间而非重启过程中发生的活动,但它仍然构成了整个生态系统的一部分值得提及一下。 #### 5. **Preinit 及后续引导链路恢复** 对于那些基于自定义镜像构建出来的设备而言,预初始(pre-init)阶段扮演重要角色因为它包含了加载根文件系统之前的准备工作[^5]。虽然严格来说这不是标准意义上的 rebootscope ,但在讨论完整的生命周期管理时还是有必要提一句。 ```bash exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd ``` 上述代码片段展示了如何切换到真正的 init 程序并继续常规开机步骤。 --- ###
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值