boot命令的调用flow如下:
grub_enter_normal_mode ->grub_normal_execute->grub_show_menu->show_menu->grub_menu_execute_entry
grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
{
   if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ())
    /* Implicit execution of boot, only if something is loaded.  */
    grub_command_execute ("boot", 0, 0);

}
如果前面执行没有错误,且kennel已经被装载到dram中,这个是通过grub_loader_is_loaded来判断的
grub_loader_is_loaded (void)
{
  return grub_loader_loaded;
}
既判断是否为1,而是在执行linux命令的时候调用grub_loader_set来设定的
grub_loader_set (grub_err_t (*boot) (void),
grub_err_t (*unload) (void),
int flags)
{
  grub_loader_loaded = 1;
}
如果都ok就调用grub_command_execute来执行boot命令
GRUB_MOD_INIT(boot)
{
  cmd_boot =
    grub_register_command ("boot", grub_cmd_boot,
  0, N_("Boot an operating system."));
}
可见boot的回调函数是grub_cmd_boot
grub_cmd_boot (struct grub_command *cmd __attribute__ ((unused)),
   int argc __attribute__ ((unused)),
   char *argv[] __attribute__ ((unused)))
{
  return grub_loader_boot ();
}
grub_loader_boot (void)
{
    err = (grub_loader_boot_func) ();

for (cur = preboots_tail; cur; cur = cur->prev)
    if (! err)
      err = cur->preboot_rest_func ();
    else
      cur->preboot_rest_func ();

return err;
}
grub_loader_boot 最重要是调用grub_loader_boot_func来boot kernel,如果failed的话,就会执行preboots_tail
list中注册的函数,但是正常的flow是调用grub_loader_boot_func后就不会再返回了
grub_loader_boot_func函数也是在linux 命令中通过grub_loader_set来指定的
grub_loader_boot_func = grub_linux_boot
static grub_err_t
grub_linux_boot (void)
{
  if (finalize_params_linux () != GRUB_ERR_NONE)
    return grub_errno;

return (grub_arm64_uefi_boot_image((grub_addr_t)kernel_addr,
                                     kernel_size, linux_args));
}
直接调用grub_arm64_uefi_boot_image起形参就是kernel在dram中的地址和size,以及要传给kernel的cmdline
grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args)
{
  grub_efi_memory_mapped_device_path_t *mempath;
  grub_efi_handle_t image_handle;
  grub_efi_boot_services_t *b;
  grub_efi_status_t status;
  grub_efi_loaded_image_t *loaded_image;
  int len;

b = grub_efi_system_table->boot_services;
  status = b->load_image (0, grub_efi_image_handle,
 (grub_efi_device_path_t *) mempath,
 (void *) addr, size, &image_handle);
  
  grub_dprintf ("linux", "linux command line: '%s'\n", args);

/* Convert command line to UCS-2 */
  loaded_image = grub_efi_get_loaded_image (image_handle);
  loaded_image->load_options_size = len =
    (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t);
  loaded_image->load_options =
    grub_efi_allocate_pages (0,
    GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size));
  if (!loaded_image->load_options)
    return grub_errno;

loaded_image->load_options_size =
    2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
   (grub_uint8_t *) args, len, NULL);

grub_dprintf ("linux", "starting image %p\n", image_handle);
  status = b->start_image (image_handle, 0, NULL);
}
这个函数首先通过uefi的system_table找到boot_services
然后通过load_image来讲kernel image装载到dram中,在linux命令中其实病没有
真正将kernel image从flash等中copy到dram,而这里是真正调用bios的 boot_services
来做这件事情。
最后还是调用boot_services的start_image返回到bios中继续执行启动kernel的工作.

grub2 中的boot命令相关推荐

  1. [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了

    原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...

  2. Linux学习笔记---boot命令的使用

    boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量!其名字分为"boot&quo ...

  3. bat中rar压缩命令

    [语法] RAR <命令> [ -<开关> ] <压缩文件> [ <@列表文件-> ] RAR [ <文件-> ] [ <解压路径/& ...

  4. uboot环境下mmc操作_android uboot中的mmc命令

    一:mmc的命令如下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc erase ...

  5. linux boot引导修复工具,修复linux的grub2引导(单独/boot,lvm-root)

    root@ubuntu:/home/ubuntu# pwd /home/ubuntu root@ubuntu:/home/ubuntu# lsblk NAME MAJ:MIN RM  SIZE RO ...

  6. 嵌入式Linux--U-Boot(三)Boot命令使用

    目录 介绍 1 .bootz 命令 bootz启动Linux 1.tft启动 1.设置开发板网络设置 2.ping虚拟机(tft服务器) 3.tft下载zImage 4.tft下载设备树 2.emmc ...

  7. MTK平台Android 安全中secure boot机制

    一.相关名词解释 1.公钥:通俗来说,公钥就是公开的密钥,是私钥拥有者公开的,公钥通常用于加密会话密钥.验证数字签名,或加密可以用相应的私钥解密的数据. 2.私钥:私有的钥匙,不会公开,私钥加密又称为 ...

  8. linux中的ubiq命令用途,学习Linux命令(一)

    Linux下的命令到底有多少,没人清楚.但是有一些命令是大多数系统都包含的,这些命令基本上都包含在GNU Coreutils包中.当然也有一些不包含在Coreutils包中,但是也很基本,很实用的软件 ...

  9. Linux中常用的命令都是哪些单词的缩写

    作者:蓬岸 Dr.Quest 链接:https://www.zhihu.com/question/49073893/answer/114986798 来源:知乎 著作权归作者所有.商业转载请联系作者获 ...

  10. 昊鼎王五:Windows运行中的所有命令_Windows快捷命令_运行中的所有命令

    昊鼎王五:Windows运行中的所有命令_Windows快捷命令_"运行"中的所有命令 winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构 ...

最新文章

  1. Unix环境高级编程(二十一)数据库函数库
  2. CentOS 下安装编译安装MeMcached
  3. python安装在什么系统下最好-windows系统下Python环境的搭建
  4. 容联雷辉:视频系统由标清进入到移动高清时代
  5. graal java_如何在CircleCI上构建支持Graal的JDK8?
  6. php如果能编译就完美了,centos7 完美编译PHP7 php-7.2.10.tar.gz
  7. MySQL 5.7.18 解压版安装
  8. ViT (Vision Transformer) ---- RNN
  9. WPF:window设置单一开启
  10. iOS Crash文件的解析
  11. 在 visual studio 中添加 ILDASM 工具
  12. 桥接模式与路由模式有什么不同
  13. Flink从1.7到1.14版本升级汇总
  14. B站探索日历-推荐几个UP主
  15. 学计算机学体育生闺女,适合女孩学的体育项目
  16. java-net-php-python-4java个人博客系统计算机毕业设计程序
  17. Emlog主题:秒拍网主题模板源码
  18. matlab bsxfun memory,matlab之bsxfun函数
  19. FileOutputStream文件写入类
  20. python文件读取下一个字符_python文件的读写总结

热门文章

  1. c#位图转换未矢量图_c# 图形图像 | 学步园
  2. GPS数据格式:NMEA-0183协议
  3. visio2013剪除_Visio 2003 图形剪切合并 高级技巧
  4. Word2003中Visio2003图打印错误的解决方法
  5. vs2015开发activex控件资料
  6. 软件工程毕业论文mysql英文翻译_软件工程毕业论文文献翻译中英文对照
  7. 毕业设计源码——旅游打卡小程序
  8. php微信页面缓存数据,微信页面入口文件被缓存解决方案
  9. 5y计算机应用2010综合测评答案,计算机二级习题答案
  10. PHP导出excel文件的多种方式