9

panic()カーネルの機能とその他の機能が、トリガーされると、マシンの完全なフリーズを保証することを確認したいと思いますkernel_halt()machine_halt()

では、すべてのカーネル プロセスとユーザー プロセスは凍結されていますか? panic()スケジューラによって中断可能ですか? 割り込みハンドラはまだ実行できますか?

使用例: 重大なエラーが発生した場合、ハードウェア ウォッチドッグがマシンをリセットすることを確認する必要があります。この目的のために、他のスレッド/プロセスがウォッチドッグを維持していないことを確認する必要があります。システムを完全に停止させる必要があります。現在、カーネル モジュール内では、単純panic()にすべてをフリーズするために呼び出しています。

また、ユーザー空間haltコマンドはシステムをフリーズさせることが保証されていますか?

ありがとう。

編集: http://linux.die.net/man/2/rebootによると、最善の方法は次を使用することだと思いますreboot(LINUX_REBOOT_CMD_HALT):「ROMモニターがあれば、制御が与えられます」

4

1 に答える 1

10

上記のコメントをありがとう。いくつかの調査の後、私は以下のより完全な答えを自分自身に与える準備ができています:

少なくとも x86 アーキテクチャの場合reboot(LINUX_REBOOT_CMD_HALT)は、これが道です。次に、これが syscall を呼び出しますreboot()( http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L433を参照)。次に、LINUX_REBOOT_CMD_HALTフラグ (参照: http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480 ) について、syscall 呼び出しkernel_halt()(ここで定義: http://lxr.linux.no/ linux+v3.6.6/kernel/sys.c#L394 )。この関数は syscore_shutdown() を呼び出して、登録されているすべてのシステム コア シャットダウン コールバックを実行し、「システムが停止しました」というメッセージを表示してから、カーネルをダンプし、最後に、 ( http://lxrを参照machine_halt()) のラッパーである を呼び出します。 .linux.no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680 )。他の CPU を停止するのはこの機能です (native_machine_halt()machine_shutdown())、次に呼び出しstop_this_cpu()て、最後に残っている作業中のプロセッサを無効にします。この関数が最初に行うことは、現在のプロセッサの割り込みを無効にすることです。つまり、スケジューラは制御できなくなります。

を呼び出した後、syscallreboot()がまだ を呼び出す理由がわかりません。私はそれを次のように解釈します。現在、すべてのプロセッサが無効としてマークされているため、syscallはそれ自体を呼び出して終了します。スケジューラが起動されたとしても、タスクをスケジュールしたり、中断したりできる有効なプロセッサはもうありません。システムは停止しています。が戻らないように見えるため(無限ループに入る)、この説明についてはよくわかりません。が失敗した場合 (およびリターンした場合) に備えて、単なるセーフガードである可能性があります。この場合、現在のタスクが正常に終了し、関数が呼び出されます。do_exit(0)kernel_halt()reboot()do_exit(0)stop_this_cpu()stop_this_cpu()do_exit()panic()

コード (ここでpanic()定義: http://lxr.linux.no/linux+v3.6.6/kernel/panic.c#L69 ) については、関数は最初にローカル割り込みを無効にし、次に他のすべてのプロセッサを無効にします。を呼び出して現在のものsmp_send_stop()。最後に、現在のプロセッサ (まだ生きている唯一のプロセッサ) で実行されている唯一のタスクとして、すべてのローカル割り込みを無効にします (つまり、プリエンプティブル スケジューラ (つまり、タイマー割り込み) にはチャンスがありません...)。 、その後、panic()関数はしばらくループするかemergency_restart()、プロセッサを再起動することになっている を呼び出します。

あなたがより良い洞察を持っているなら、貢献してください。

于 2012-11-16T08:43:15.607 に答える