Linuxカーネルのどの機能がシャットダウン操作を実行しますか?

Linuxカーネルのどの機能がシャットダウン操作を実行しますか?

閉じる方法を尋ねることではありません。電源遮断方法を聞きたいです。

Linuxカーネルコードのどのような機能が電源オフ操作を実行しますか?そしてコードを説明してください。

答え1

実際のカーネルコードはシステムアーキテクチャによって異なります。 x86システムの場合は、次の場所にあります。アーチ/x86/kernel/reboot.c

停止は機械を停止し、電源を入れたままにします。したがって、コアのみを停止するだけで、通常は電源を切ることはありません。

static void native_machine_halt(void)
{
  /* Stop other cpus and apics */
  machine_shutdown();

  tboot_shutdown(TB_SHUTDOWN_HALT);

  stop_this_cpu(NULL);
}

同時に power_off は APM/ACPI の電源供給も遮断します。pm_power_off()

static void native_machine_power_off(void)
{
  if (pm_power_off) {
    if (!reboot_force)
      machine_shutdown();
    pm_power_off();
  }
  /* A fallback in case there is no PM info available */
  tboot_shutdown(TB_SHUTDOWN_HALT);
}

machine_shutdown()無限ループです

tboot_shutdown()アーチ/x86/kernel/tboot.c)

このCPUの停止(null)アーチ/x86/kernel/process.c) CPU の IRQ を無効にし、CPU をオフラインに設定します。

pm_power_off()アーチ/x86/kernel/apm_32.c) は関数ポインタです。apm_power_off()

ご覧のとおり、すべての作業はアーチに依存します。すべての場合で、これはASM呼び出しを介して行われます。

~のためapm_power_off()、コードAPT_STATE_OFF(0x0003)を使用してBiosを呼び出します。

apm_bios_call_simple(APM_FUNC_SET_STATE, APM_DEVICE_ALL, APM_STATE_OFF, eax, err);

~のためNative_halt()(arch/x86/include/asm/irqflags.h) この呼び出しは、次の目的で使用されます。

asm volatile("hlt": : :"memory");

あなたの毒を選択してください:)

答え2

伝統的に、ソフトウェアはシェルまたはサブシェルにコマンドを渡して電力レベルを制御できます。この方法を使用するときは、ユーザーにうまく対処し、ユーザーが適切に反応できる時間を与える必要があります。初期化システムによっては、初期化システムを1レベル上げることができます。以下はレベルテーブルです。

+---------+--------------- ----- ------------ ------- ------+------ ---- ------------- ------- ------- ------ ------- ----+
| Sysvinitランレベルターゲット|
+---------+--------------- ----- ------------ ------- ------+------ ---- ------------- ------- ------- ------ ------- ----+
| 0 | runlevel0.target、poweroff.target | |
| 1、s、シングルrunlevel1.target、Rescue.target |シングルユーザーモード。 |
| 2、4 | runlevel2.target、runlevel4.target、multiuser.target |基本的には3と同じです。
| 3 | runlevel3.target、multi-user.targetマルチユーザー、非グラフィック|ユーザーは通常、複数のコンソールまたはネットワークを介してログインできます。 |
| 5 | runlevel5.target、グラフィック。通常、すべてのサービスとグラフィックログインにランレベル3があります。 |
| 6 | runlevel6.target、再起動。ターゲット|再起動|
|緊急|緊急対象|緊急シェル|
+---------+--------------- ----- ------------ ------- ------+------ ---- ------------- ------- ------- ------ ------- ----+

私が親切だと言うのは、警告なしにそれを行うことができないからです。あるユーザーがマルチユーザーシステムで作業していて、適切な権限を持つ別のユーザーがあなたのソフトウェアを使用している場合、そのユーザーは再起動するまでシステムからすぐに追い出されます(したがって、すべての作業が失われます)。

Goldilocksが言ったように、これはユーザースペースメソッドを使用して取得できる最も近い結果です。他のすべてのコードはカーネルに保存されていますが、現在は見つかりませんが、これはドライブ電源管理に関するドキュメント、存在するLinuxカーネルのアーカイブ

関連情報