![종료할 때 마지막으로 수행되는 기능은 무엇입니까?](https://linux55.com/image/192292/%EC%A2%85%EB%A3%8C%ED%95%A0%20%EB%95%8C%20%EB%A7%88%EC%A7%80%EB%A7%89%EC%9C%BC%EB%A1%9C%20%EC%88%98%ED%96%89%EB%90%98%EB%8A%94%20%EA%B8%B0%EB%8A%A5%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 코드를 따르고 다음을 얻었습니다.
native_machine_shutdown()
https://elixir.bootlin.com/linux/latest/source/arch/x86/kernel/reboot.c#L682
하지만 전원을 끄거나 전원을 끄기 위해 어떤 CPU 레지스터를 트리거하는 코드가 표시되지 않습니까?
거기에서 나는 도착한다:
void kernel_power_off(void)
{
kernel_shutdown_prepare(SYSTEM_POWER_OFF);
if (pm_power_off_prepare)
pm_power_off_prepare();
migrate_to_reboot_cpu();
syscore_shutdown();
pr_emerg("Power down\n");
kmsg_dump(KMSG_DUMP_SHUTDOWN);
machine_power_off();
}
https://elixir.bootlin.com/linux/latest/source/kernel/reboot.c#L287
답변1
에 있으며 reboot.c
잘 검토되었습니다.
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);
}
그래서 pm_power_off
: 지금은진짜플랫폼에 따라 다릅니다. 콘솔을 사용하는지, 랙 서버를 사용하는지에 따라 다릅니다.
이 작업을 수행하는 EFI 드라이버를 찾고 있을 수 있습니다.
efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
drivers/firmware/efi/reboot.c에서