【问题标题】:Jumping back to Grub from the kernel in UEFI systemUEFI系统中从内核跳回Grub
【发布时间】:2020-10-11 11:42:30
【问题描述】:

我正在开发一个兼容 multiboot2 的微型 x86 64 位内核,内核由 Grub 加载和启动。要求是,一旦内核完成其活动,它需要重新启动 Grub。在非基于 UEFI 的系统中,我们过去常常通过将处理器带回实模式跳转到地址 0x7c00 来实现这一点。

对于 UEFI 系统,我试图了解类似的方法是否可行,我认为一种可能的方法是使用 EFI 引导服务表中的 EFI_IMAGE_LOAD 和 EFI_IMAGE_START 例程从内核重新加载 Grub。我对 UEFI 内部的了解非常有限,如果有人能确认这种方法是否有效,将会非常有帮助。

【问题讨论】:

    标签: kernel uefi grub


    【解决方案1】:

    是的,假设您可以找到 Grub 映像,这将起作用。 (例如,如果 Grub 是通过网络加载的,这将更加困难。)

    您无需了解 UEFI 内部原理即可执行此操作。了解 UEFI 接口规范就足够了。

    您不能从您的内核调用 ExitBootServices,因此您的操作系统可以执行的操作在一定程度上受到限制。 例如,您必须使用 UEFI 进行内存分配。 您必须维护虚拟地址空间到物理地址空间的一对一映射。 您使用多处理的能力可能会受到一些限制。 请参阅UEFI spec 的第 2.3.4 节。

    【讨论】:

    • 感谢您的回复,确实有助于更好地了解需要做什么。将确保按照 UEFI 规范 2.3.4 中的详细说明完成处理器模式、寄存器和其他设置。
    • 一个后续问题,关于调用 EFI_BOOT_SERVICES.LoadImage() 以加载 Grub,此例程预期的输入参数之一是“EFI_HANDLE ParentImageHandle”,规范指出,这应该是调用者的图像句柄。现在由于调用者是我的内核,它没有任何“图像句柄”,我想知道我是否可以在这里传递 Grub 本身的图像句柄,它作为多重引导标记 MULTIBOOT_TAG_EFI64_IH 的一部分传递给内核?
    • 是的,没错,如果我理解正确的话。 UEFI 启动 Grub,然后启动您的代码并将图像句柄传递给它。您想继续使用该图像句柄。您也将需要它来进行各种其他呼叫。
    • 您可以使您的代码成为 UEFI 程序而不是多引导程序。
    • 是的,到目前为止,启动顺序正是您在之前的评论中所说的。现在,将尝试使用 Grub 的图像句柄。再次感谢您的澄清。
    猜你喜欢
    • 2015-03-03
    • 2010-09-17
    • 2016-08-27
    • 2021-08-15
    • 1970-01-01
    • 2021-02-06
    • 2023-04-09
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多