閉じる方法を尋ねることではありません。電源遮断方法を聞きたいです。
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");
あなたの毒を選択してください:)