【问题标题】:Linux reboot() system call: why it calls do_exit(0) after kernel_halt()?Linux reboot() 系统调用:为什么它在 kernel_halt() 之后调用 do_exit(0)?
【发布时间】:2012-11-07 06:26:58
【问题描述】:

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

现在的问题是:

为什么 reboot() 系统调用,当使用 LINUX_REBOOT_CMD_HALT 参数调用时(参见此处:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480)在已经调用 kernel_halt() 之后调用 do_exit(0),因为调用 kernel_halt() 归结为调用 @987654329 @(参见此处: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()呢?

【问题讨论】:

  • panic 使内核停止,退出,可能重新启动
  • @eicto:是的,我同意这一点,我在帖子的结尾处说了同样的话。真正的问题是:为什么在panic()之前调用do_exit(0)?如果要让内核停顿、退出或重启,为什么不直接调用panic()呢?

标签: linux kernel system-calls reboot halt


【解决方案1】:

一些想法:

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

【讨论】:

  • 谢谢。我很感激。
猜你喜欢
  • 2011-06-16
  • 2014-01-23
  • 2018-11-10
  • 2014-09-28
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2019-10-14
  • 2012-06-30
相关资源
最近更新 更多