grub的reboot 命令实现

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的系统
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值