web-dev-qa-db-ja.com

Linuxカーネルのシステムシャットダウンは内部的にどのように機能しますか?

ユーザースペースとinit-system(古典的なinit sysV/upstart/systemd)がシステムのシャットダウン時にどのように機能するかについて、どういうわけか大まかな考えがあります。 (基本的に、「Stop!」、「本当に今すぐ停止してください」、「Stopを殺すためにプロセスを停止する必要があります」という順番の続きがあり、待機しています...

私はとにかく、カーネルでシステムシャットダウンがどのように機能するかをまったく知りません(確かに、やるべきことがたくさんあります)。

カーネルのドキュメント https://www.kernel.org/doc/htmldocs/ を調べてみました-- NSAのpal検索ツール を使ってさえもそれがどのように機能するかを見つけることに。

また、SE U + Lを検索しても何も見つかりませんでした(見落としましたか?)

とにかく、質問は、少し難しいかもしれませんが、シャットダウン時にLinuxカーネルで何が発生するかについてのスケッチを取得することに関心があると思うので、このQ&Aネットワークで回答する価値があります。

可能性としては、いくつかのより詳細な説明へのリンクへの変更もあります。

回答には、使用されるシステムコールと使用されるカーネルシグナルが含まれる場合があります。

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/Arch/x86/kernel/reboot.c 再起動に関連するx86で使用されているファイルのようです(すでにシャットダウンの近くです、え? )

多分ここにあるスニペット http://lxr.free-electrons.com/source/kernel/reboot.c#L176 を使用して説明することができます

 176 void kernel_power_off(void)
 177 {
 178 kernel_shutdown_prepare(SYSTEM_POWER_OFF); 
 179 if(pm_power_off_prepare)
 180 pm_power_off_prepare(); 
 181 migrate_to_reboot_cpu(); 
 182 syscore_shutdown(); 
 183 pr_emerg( "Power down\n"); 
 184 kmsg_dump(KMSG_DUMP_POWEROFF); 
 185 machine_power_off(); 
 186} 
 187 EXPORT_SYMBOL_GPL(kernel_power_off); 
29

これは部分的な回答にすぎませんが、他の回答を招待することをお勧めします。

この回答の内容は、3.13 Linuxカーネルの_kernel/reboot.c_ファイルから取得されます(名前がshutdown.cではなく、reboot.cであるため、これは最初の推測ではない可能性があります)

とにかくそこに私たちは基本的にシステムをシャットダウンするプロセスをスケッチする3つの機能を持っています

  • void kernel_halt(void) //停止状態のシステムで終了します
  • void kernel_power_off(void) //システムの電源がオフになると終了します
  • void kernel_restart(char *cmd) //システムを終了して再起動します

これらの機能は非常に簡単なので、ここに完全に貼り付けることができます。彼らのコードは、カーネルでシャットダウンする方法がどのように取られているかを最もよく示しています。 (コメントは私が作成したものであり、100%理想的で正しいものではない可能性があります。確認するために自分自身を確認してください。簡単に試すことができます。

void kernel_halt(void)

 void kernel_halt(void)
 {
 //最初のステップは次のことを行います:
 // a)再起動/シャットダウン時に実行するように登録された関数/コールバックを呼び出します
 // b)system_sateをSYSTEM_HALTに設定します
 // c)ユーザースペースツールの相互作用を停止します
 // d)device_shutdown()関数を呼び出します
 kernel_shutdown_prepare(SYSTEM_HALT); 
 
 // 2番目のステップ:これは主にマルチCPUシステムに必要だと思います
 migrate_to_reboot_cpu(); 
 
 // 3番目のステップ:
 // syscore_shutdown-登録されたすべてのシステムコアシャットダウンコールバックを実行します
 syscore_shutdown(); 
 
 // 4番目のメッセージ
 pr_emerg( "System halted\n "); 
 kmsg_dump(KMSG_DUMP_HALT); 
 
 // 5番目の呼び出しArch固有のcpu-halt-code 
 machine_halt(); 
} 

すべてが_sys_reboot_システムコールで開始されます。これは、再起動だけでなくシャットダウンも行うので、シャットダウンプロセスに直接接続するものではありません。

2