在 UEFI 系统中从内核跳回 Grub
Jumping back to Grub from the kernel in UEFI system
我正在开发一个兼容 multiboot2 的小型 x86 64 位内核,该内核由 Grub 加载和启动。要求是,一旦内核完成其 activity 它需要重新启动 Grub。在非基于 UEFI 的系统中,我们过去常常通过将处理器带回实模式跳转至地址 0x7c00 来实现此目的。
对于 UEFI 系统,我试图了解类似的事情是否可行,我认为一种可能的方法是使用 EFI 中的 EFI_IMAGE_LOAD 和 EFI_IMAGE_START 例程从内核重新加载 Grub引导服务 table。我对 UEFI 内部的理解非常有限,如果有人能确认这种方法是否有效,那将是非常有帮助的。
是的,这会起作用,前提是您可以找到 Grub 映像。 (例如,如果通过网络加载 Grub 会更加困难。)
您无需了解 UEFI 内部原理即可执行此操作。了解UEFI接口规范就足够了。
您不能从您的内核中调用 ExitBootServices,因此您的 OS 可以做的事情会受到一些限制。
例如,您必须使用 UEFI 进行内存分配。
您必须维护虚拟地址到物理地址的 1 对 1 映射 space。
您使用多处理的能力可能会受到一定程度的限制。
请参阅 UEFI spec.
的第 2.3.4 节
我正在开发一个兼容 multiboot2 的小型 x86 64 位内核,该内核由 Grub 加载和启动。要求是,一旦内核完成其 activity 它需要重新启动 Grub。在非基于 UEFI 的系统中,我们过去常常通过将处理器带回实模式跳转至地址 0x7c00 来实现此目的。
对于 UEFI 系统,我试图了解类似的事情是否可行,我认为一种可能的方法是使用 EFI 中的 EFI_IMAGE_LOAD 和 EFI_IMAGE_START 例程从内核重新加载 Grub引导服务 table。我对 UEFI 内部的理解非常有限,如果有人能确认这种方法是否有效,那将是非常有帮助的。
是的,这会起作用,前提是您可以找到 Grub 映像。 (例如,如果通过网络加载 Grub 会更加困难。)
您无需了解 UEFI 内部原理即可执行此操作。了解UEFI接口规范就足够了。
您不能从您的内核中调用 ExitBootServices,因此您的 OS 可以做的事情会受到一些限制。 例如,您必须使用 UEFI 进行内存分配。 您必须维护虚拟地址到物理地址的 1 对 1 映射 space。 您使用多处理的能力可能会受到一定程度的限制。 请参阅 UEFI spec.
的第 2.3.4 节