O código real do kernel depende do arco do seu sistema. Para sistemas x86, eles estão localizados em arch / x86 / kernel / reboot.c
A parada interromperá a máquina e a deixará no estado ligado. Então ele simplesmente pára o kernel, mas normalmente não liga.
static void native_machine_halt(void)
{
/* Stop other cpus and apics */
machine_shutdown();
tboot_shutdown(TB_SHUTDOWN_HALT);
stop_this_cpu(NULL);
}
Enquanto o power_off também cortará a fonte elétrica do 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 () é um loop infinito
tboot_shutdown () ( arch / x86 / kernel / tboot.c )
stop_this_cpu (NULL) ( arch / x86 / kernel /process.c desativa os IRQs da CPU, configure a CPU offline,
pm_power_off () ( arch / x86 / kernel / apm_32.c ) é um ponteiro de função para apm_power_off ()
Como você pode ver, todo o trabalho depende do arco. Em todos os casos, é feito com chamadas ASM.
Para apm_power_off () , o BIOS é chamado com o código APT_STATE_OFF (0x0003).
apm_bios_call_simple(APM_FUNC_SET_STATE, APM_DEVICE_ALL, APM_STATE_OFF, eax, err);
Para native_halt () (arch / x86 / include / asm / irqflags.h), esta chamada é usada:
asm volatile("hlt": : :"memory");
Escolha seu veneno:)