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

这涉及到: https : //stackoverflow.com/a/13413099/1284631

现在的问题是:

为什么在使用LINUX_REBOOT_CMD_HALT参数(请参阅http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480 )调用reboot()系统调用之后,已经调用了do_exit(0)称为kernel_halt() ,因为调用kernel_halt()归结为调用stop_this_cpu() (请参阅: http : stop_this_cpu() ),作为native_machine_halt()一部分(请参阅: http : native_machine_halt() )。

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

那么,为了do_exit(0) kernel_halt()没有完成它的工作并返回,就调用了do_exit(0) 为什么不直接panic()呢?

一些想法:

  • 可能是因为kernel_halt()拒绝实际停止的合法原因,尽管我想不出来。
  • kernel_halt()可能被设计成也可以被一个管理程序所调用,或者与内核相比更高或者更高的级别(自定义的SMI代码可能?)。
  • 也许kernel_halt()函数返回的时间早,“调度”暂停,实际暂停发生一段时间后,在某些硬件上。 我记得有关在DOS中执行ATX电源关闭的阅读,你会发出outb指令来关闭电源,但是你必须有一些nops ,一个无限循环,或者之后的权限,作为实际的电源之后可能会发生一些周期。
  • 调用进程可能希望处理失败重启一些其他方式比内核恐慌。