Linux reboot()系统调用:为什么在kernel_halt()之后调用do_exit(0)?

use*_*631 5 linux kernel reboot halt system-calls

这与以下内容有关:https://stackoverflow.com/a/13413099/1284631

现在,问题是:

为什么使用LINUX_REBOOT_CMD_HALT参数调用reboot()系统调用(参见此处:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480)在调用do_exit(0)之后调用kernel_halt(),如调用kernel_halt()boils向下调用stop_this_cpu()(在这里看到:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/process.c#L519),为的一部分native_machine_halt()(在这里看到:HTTP://lxr.linux .no/linux + v3.6.6/arch/x86/kernel/reboot.c#L680).

或者,在我看来,它stop_this_cpu()永远不会返回(它以无限循环结束).

所以,它被do_exit(0)调用以防万一kernel_halt()它不能完成它的工作并返回?那么为什么不panic()直接呢?

小智 2

一些想法:

  • 可能是kernel_halt()因为合理的原因而拒绝真正停止,尽管我想不出任何理由。
  • kernel_halt()也可以设计为由虚拟机管理程序或比内核更高或同等级别的东西调用(也许是自定义 SMI 代码?)
  • 也许该kernel_halt()函数提前返回,“安排”暂停,并且在某些硬件上实际暂停发生在一段时间后。我记得读过有关在汇编中在 DOS 中执行 ATX 电源关闭的信息 - 您将发出outb启动电源关闭的指令,但您必须有一些nops,无限循环,或hlt之后立即执行,因为实际的电源关闭可能会发生一些周期之后。
  • 调用进程可能希望以除内核恐慌之外的其他方式处理重新启动失败。