如何通过 GRUB 调用 ExitBootService

Posted

技术标签:

【中文标题】如何通过 GRUB 调用 ExitBootService【英文标题】:How To Call ExitBootService through GRUB 【发布时间】:2019-10-10 17:35:39 【问题描述】:

我正在为 Intel x86 平台开发基于 UEFI 的 Hypervisor。 GRUB 用于加载 VMM 和 OS 映像,以降低复杂性,我目前仅通过 GRUB 加载一个 GPOS,显然是 VMM。但是由于一些设计问题,我不想在 Hypervisor 中使用 EFI 服务。在我研究这个主题的过程中,我看到一篇帖子或评论说 GRUB 可以调用 ExitBootService 来解决我的问题。但是没有关于如何通过 GRUB 实际调用 ExitBootService 的适当文档。如果有人可以指导我通过 GRUB 调用 ExitBootService,那将非常有帮助。

【问题讨论】:

我认为在管理程序启动之前调用 ExitBootServices 是错误的。通常管理程序需要在初始化期间调用 EFI。例如,它需要获取内存映射。 在任何情况下,从管理程序的启动代码中调用 ExitBootServices 可能是最简单的,而不是试图让 Grub 去做。 哦,我刚刚意识到也许您可以从 Grub 获取内存映射,所以您可能是对的,您根本不需要调用 EFI。 @prl 是的。我想从 GRUB 获取 E820 内存映射和图形帧缓冲区 HOB,实际上我正在实现由 Hypervisor 加载的虚拟化 UEFI 固件。由于我正在进行的设计变得非常复杂,因此从 GRUB 调用 ExitBootService 是我的首要任务。你知道,GRUB 是如何调用 ExitBootService 的吗? 不,我不知道如何从 Grub 执行此操作。我会从管理程序中完成。 【参考方案1】:

我同意 cmets 的说法,最好自己在管理程序中执行此操作。主要原因是如果你在 GRUB 中这样做:

    您最终会为您的虚拟机管理程序编写一个自定义映像加载器(这不亚于在您的虚拟机管理程序中添加此支持) 您在该加载程序和您的虚拟机管理程序之间创建一个 ABI(您需要对其进行管理以应对未来的任何变化)

E820 可能在某些平台上工作一段时间,但它是旧式 Bios 的遗留物,不能保证在 UEFI 系统中可用。

这就是为什么如今的 Linux 在内核映像中嵌入了一个小型“存根加载程序”来进行转换。

因此,您需要将 UEFI 内存映射和图形输出协议传递到您的管理程序。

如果您仍想沿用自定义加载器的路线,请查看i386/bsdi386/xnu 加载器以及它们对grub_efi_finish_boot_services/grub_autoefi_finish_boot_services 的使用。

【讨论】:

【参考方案2】:

对于 Multiboot2; UEFI 系统上的默认行为是引导加载程序(例如可能是 GRUB)调用 ExitBootServices() 而操作系统什么也不做。要更改这一点,您需要在多重引导标头中使用特殊标记(请参阅 Multiboot2 规范中的 3.1.12 EFI boot services tag)来通知引导加载程序您不希望它调用 ExitBootServices()

对于 Multiboot1;不支持 UEFI。在这种情况下;如果引导加载程序支持从 UEFI 启动,它必须在启动符合 Multiboot1 的操作系统之前调用 ExitBootServices()。请注意,从技术上讲,这违反了 Multiboot1 规范,该规范规定引导加载程序必须使固件处于可用状态,但这是不可能的(例如,引导加载程序无法告诉操作系统 EFI 系统表在哪里)并且不可用在实践中(例如,为 Multiboot1 设计的操作系统很可能假定为“BIOS”并且无论如何都会崩溃,因为操作系统无法猜测它是哪种固件)。

对于 GRUB 支持的其他“特定于操作系统”的方法;有些根本无法在 UEFI 系统上使用(例如 BIOS 中旧的“链式加载”事实上的标准),而其他的(如果它们有效)将符合发明它的任何操作系统的要求(例如“Linux 启动Linux 开发人员为 Linux 创建的协议”,NetBSD 和 FreeBSD 使用的“NetBSD 启动协议”等)。我不知道任何操作系统特定情况会发生什么(除非您正在使用它的操作系统,否则它相当不重要)。

注意:请随意将每次出现的“OS”替换为“hyper-visor”(或“内核”或任何其他 GRUB 可能将控制权传递给的内容)。

【讨论】:

以上是关于如何通过 GRUB 调用 ExitBootService的主要内容,如果未能解决你的问题,请参考以下文章

为啥 u-boot 在 rpi3 中调用 grub?

如何删除grub引导

Linux中如何修复GRUB引导故障

一分钟掌握Linux系统grub.conf配置核心知识

一分钟掌握Linux系统grub.conf配置核心知识

一分钟掌握Linux系统grub.conf配置核心知识