grub的reboot 命令如下:其路径在grub-core/commands/reboot.c 中
static grub_err_t __attribute__ ((noreturn))
grub_cmd_reboot (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
grub_reboot ();
}
static grub_command_t cmd;
GRUB_MOD_INIT(reboot)
{
cmd = grub_register_command ("reboot", grub_cmd_reboot,
0, N_("Reboot the computer."));
}
GRUB_MOD_FINI(reboot)
{
grub_unregister_command (cmd);
}
可以看到如果在grub.cfg 中调用reboot 命令最终调用grub_cmd_reboot->grub_reboot
如果这个系统是通过uefi+grub方式启动的话,则grub_reboot 在grub-core/lib/efi 中实现
void
grub_reboot (void)
{
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
for (;;) ;
}
这个函数首先调用grub_machine_fini
enum
{
GRUB_LOADER_FLAG_NORETURN = 1,
GRUB_LOADER_FLAG_PXE_NOT_UNLOAD = 2,
};
这里的GRUB_LOADER_FLAG_NORETURN为1
void
grub_machine_fini (int flags)
{
if (!(flags & GRUB_LOADER_FLAG_NORETURN))
return;
grub_efi_fini ();
}
在grub_machine_fini 中if 条件不成立,所以会调用grub_efi_fini
void
grub_efi_fini (void)
{
grub_efidisk_fini ();
grub_console_fini ();
}
来释放disk和console
回到grub_reboot 中,释放disk和console占用的资源后,就通过efi_call_4调用runtime_services来reboot的系统
static grub_err_t __attribute__ ((noreturn))
grub_cmd_reboot (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
char **args __attribute__ ((unused)))
{
grub_reboot ();
}
static grub_command_t cmd;
GRUB_MOD_INIT(reboot)
{
cmd = grub_register_command ("reboot", grub_cmd_reboot,
0, N_("Reboot the computer."));
}
GRUB_MOD_FINI(reboot)
{
grub_unregister_command (cmd);
}
可以看到如果在grub.cfg 中调用reboot 命令最终调用grub_cmd_reboot->grub_reboot
如果这个系统是通过uefi+grub方式启动的话,则grub_reboot 在grub-core/lib/efi 中实现
void
grub_reboot (void)
{
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
for (;;) ;
}
这个函数首先调用grub_machine_fini
enum
{
GRUB_LOADER_FLAG_NORETURN = 1,
GRUB_LOADER_FLAG_PXE_NOT_UNLOAD = 2,
};
这里的GRUB_LOADER_FLAG_NORETURN为1
void
grub_machine_fini (int flags)
{
if (!(flags & GRUB_LOADER_FLAG_NORETURN))
return;
grub_efi_fini ();
}
在grub_machine_fini 中if 条件不成立,所以会调用grub_efi_fini
void
grub_efi_fini (void)
{
grub_efidisk_fini ();
grub_console_fini ();
}
来释放disk和console
回到grub_reboot 中,释放disk和console占用的资源后,就通过efi_call_4调用runtime_services来reboot的系统