5

这与:https ://stackoverflow.com/a/13413099/1284631

现在,问题是:

为什么 reboot() 系统调用,当用LINUX_REBOOT_CMD_HALT参数调用时(见这里: http: //lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480do_exit(0)在已经调用之后调用kernel_halt(),因为调用kernel_halt()煮沸调用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()直接取而代之呢?

4

1 回答 1

2

一些想法:

  • 可能是kernel_halt()出于正当理由拒绝实际停止,尽管我想不出任何理由。
  • kernel_halt()可能被设计为也可以由管理程序或比内核更高或同等级别的东西调用(可能是自定义 SMI 代码?)
  • 也许该kernel_halt()函数提前返回,“调度”停止,而实际停止发生在某些硬件上的某个时间之后。我记得读过有关在 DOS 中在汇编中执行 ATX 电源关闭的信息 - 您会发出outb指令来启动电源关闭,但您必须有一些nops,一个无限循环,或者hlt之后,因为实际的电源关闭可能会发生一些周期后。
  • 调用进程可能希望以其他方式而不是内核恐慌来处理重启失败。
于 2013-07-15T14:10:50.850 回答