这与: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()
呢?
答案 0 :(得分:2)
一些想法:
kernel_halt()
因合法原因拒绝实际停止,但我想不出任何原因。kernel_halt()
可能被设计为也可以由虚拟机管理程序或比内核更高或同等级别的东西调用(可能是自定义SMI代码?)kernel_halt()
函数提前返回,“调度”暂停,实际停止一段时间后会在某些硬件上发生。我记得读过关于在汇编中在DOS中执行ATX电源关闭 - 你会发出outb
指令来启动电源关闭,但是你必须有一些nops
,无限循环,或者hlt
之后,因为实际断电可能会在一段时间后发生。