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

时间:2012-11-19 10:34:13

标签: linux kernel system-calls reboot halt

这与: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(),因为调用{ {1}}归结为调用kernel_halt()(请参阅此处:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/process.c#L519),作为stop_this_cpu()的一部分(请参阅此处:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680)。

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

所以,stop_this_cpu()只是在do_exit(0)无法完成工作并返回的情况下被调用kernel_halt()?那么为什么不直接panic()呢?

1 个答案:

答案 0 :(得分:2)

一些想法:

  • 可能kernel_halt()因合法原因拒绝实际停止,但我想不出任何原因。
  • kernel_halt()可能被设计为也可以由虚拟机管理程序或比内核更高或同等级别的东西调用(可能是自定义SMI代码?)
  • 也许kernel_halt()函数提前返回,“调度”暂停,实际停止一段时间后会在某些硬件上发生。我记得读过关于在汇编中在DOS中执行ATX电源关闭 - 你会发出outb指令来启动电源关闭,但是你必须有一些nops,无限循环,或者hlt之后,因为实际断电可能会在一段时间后发生。
  • 调用进程可能希望处理无法以内核崩溃之外的其他方式重新启动。