grub2的exit命令

在grub-core/commands/minicmd.c 中有实现cat/help/dump/rmmod/lsmod/exit 命令
GRUB_MOD_INIT(minicmd)
{
  cmd_cat =
    grub_register_command ("cat", grub_mini_cmd_cat,
               N_("FILE"), N_("Show the contents of a file."));
  cmd_help =
    grub_register_command ("help", grub_mini_cmd_help,
               0, N_("Show this message."));
  cmd_dump =
    grub_register_command ("dump", grub_mini_cmd_dump,
               N_("ADDR [SIZE]"), N_("Show memory contents."));
  cmd_rmmod =
    grub_register_command ("rmmod", grub_mini_cmd_rmmod,
               N_("MODULE"), N_("Remove a module."));
  cmd_lsmod =
    grub_register_command ("lsmod", grub_mini_cmd_lsmod,
               0, N_("Show loaded modules."));
  cmd_exit =
    grub_register_command ("exit", grub_mini_cmd_exit,
               0, N_("Exit from GRUB."));
}
这里以exit命令为例
static grub_err_t __attribute__ ((noreturn))
grub_mini_cmd_exit (struct grub_command *cmd __attribute__ ((unused)),
            int argc __attribute__ ((unused)),
            char *argv[] __attribute__ ((unused)))
{
  grub_exit ();
  /* Not reached.  */
}
调用grub_exit
void
grub_exit (void)
{
  grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
  efi_call_4 (grub_efi_system_table->boot_services->exit,
              grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
  for (;;) ;
}
最终调用bios的boot_service->exit
void
grub_machine_fini (int flags)
{
  if (!(flags & GRUB_LOADER_FLAG_NORETURN))
    return;

  grub_efi_fini ();
}
这里的flags等于GRUB_LOADER_FLAG_NORETURN,因此会执行grub_efi_fini ();
void
grub_efi_fini (void)
{
  grub_efidisk_fini ();
  grub_console_fini ();
}
在grub_efi_fini 中会释放disk和console
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值