这涉及到: 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
,一个无限循环,或者之后的权限,作为实际的电源之后可能会发生一些周期。