如果像这样启动怎么办:
通过GRUB命令行或类似方式将参数传递INIT=/bin/sh(or /bin/bash)
给内核,然后启动;
一旦 shell 加载完毕,立即退出。然后电脑对按下的任何键都没有反应。
我很好奇地位此刻的系统。据我所知,这init
是加载内核后将执行的第一个进程,并且其他进程都fork
从中执行,似乎当/bin/sh
按照上述方式执行而不是init
使用正常的引导过程时,系统就不再有任何进程了。去做。
是不是像跑步一样闲着
while (1) {
sleep(1);
}
或者还有什么?
感谢大家的建议。也许更多的信息有帮助,我曾经认为这是不必要的。
我最近在一台CentOS 7.2服务器上工作,有一个XFS磁盘分区不正常,在系统启动时花费了无尽的时间进行检查和恢复。我计划编辑/etc/fstab
以关闭该分区的自动安装。由于正常的启动过程被卡住,我曾经init=/bin/bash
使系统启动到bash。编辑后fstab
,我exit
不小心执行了shell,然后屏幕上对按下的任何键(包括 )都没有响应Ctrl-Alt-Del
,并且没有任何信息提示内核恐慌(我无法判断CPU是否正在努力工作,因为那个房间很吵)。我认为这是闲着,无事可做。这个现象让我思考了我一开始写下的问题。
今晚我在我自己的装有 Debian 8 的笔记本电脑上做了一些测试。内核恐慌明显。
答案1
我很惊讶。我的理解是终止PID 1导致内核恐慌。我可以告诉你那件事发生了什么。
恐慌行为是可配置的。使用默认选项,您将达到环形看起来和你说的一模一样。
使用的延迟函数是有记录的作为“忙等待”。这是不是预计会进入操作系统正常空闲时使用的省电 CPU 睡眠状态。
如果您查看恐慌打印的回溯,我想您会看到这一切都发生在sys_exit()
.我认为从技术上讲,PID 1 不会被破坏,它只是永远不会从系统调用中返回。首先停止任何其他 CPU。
(有一种东西叫做“启动空闲线程”。我没有看到它参与这个过程。 AFAICT 你永远看不到这个线程。如果您想将其理解为空闲线程,您还必须询问一旦其他 cpu 上线后,是什么为它们提供空闲线程)。
答案2
如果没有用户级进程运行,系统就无事可做,这是不正确的。系统有一堆内核线程,内核本身已经启动了。他们大部分时间都在睡觉,但会定期醒来执行任务。内核线程仅执行内核空间代码,即它们没有任何用户级内存映射。它们是独立的进程,因为它们是独立调度的并且具有唯一的进程 ID。
如果运行ps aux
,您可以通过线程名称周围的方括号来识别内核线程。
答案3
系统没有任何进程在运行。因此,没有像您所写的那样的繁忙循环(CPU 利用率为 100%)。中断仍然可以由内核处理,但没有进程。 CPU 将处于空闲状态。
详细信息可以在此处找到kernel_init() 的来源,程序的执行方式与 类似execve()
。这也意味着执行不会返回(请参阅 参考资料execve(3p)
)。