5

これは以下に関連しています: 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)すでに呼び出された後に呼び出されます(ここを参照: http : //lxr.linux .no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680 )。kernel_halt()kernel_halt()stop_this_cpu()native_machine_halt()

または、それstop_this_cpu()が戻ってこないように思えます(無限ループで終了します)。

それで、それが仕事をせずに戻ってきdo_exit(0)た場合に備えて呼び出されますか?では、代わりに直接しkernel_halt()ないのはなぜですか?panic()

4

1 に答える 1

2

いくつかのアイデア:

  • kernel_halt()正当な理由で実際に停止することを拒否している可能性がありますが、私には思いつきません.
  • kernel_halt()ハイパーバイザーまたはカーネルよりも上位または同等のレベルで呼び出されるように設計されている場合もあります (カスタム SMI コードでしょうか?)
  • おそらく、kernel_halt()関数は停止を「スケジューリング」して早期に戻り、実際の停止はハードウェアによってはしばらく後に行われます。アセンブリで DOS のATX電源オフを実行することについて読んだことを覚えていoutbます。数サイクル後。nopshlt
  • 呼び出しプロセスは、カーネル パニック以外の方法で再起動の失敗を処理したい場合があります。
于 2013-07-15T14:10:50.850 に答える