我正在为Intel X86平台的基于UEFI的管理程序工作。GRUB被用于加载VMM和OS图像,以降低我目前仅通过grub和VMM加载一个GPO的复杂性。但是,由于某些设计问题,我不想在管理程序中使用EFI服务。在有关此主题的研究中,我遇到了一篇文章或评论,该帖子指出,GRUB可以称呼ExitbootService,这将解决我的问题。但是,没有关于如何通过glub拨打Exitbootservice的正确文件。如果有人可以指导我通过grub致电ExitbootService。
for MultiBoot2;UEFI系统上的默认行为是启动加载程序(例如GRUB(调用ExitBootServices()
,而OS无需执行任何操作。要更改您需要在Multiboot标头中使用特殊标签(请参阅Multiboot2 Spec中的3.1.12 EFI boot services tag
(,以告知启动加载程序您不希望它致电ExitBootServices()
。
用于MultiBoot1;没有支持欧盟。在这种情况下;如果引导加载程序支持从UEFI启动,则必须在启动符合MultiBoot1的操作系统之前调用ExitBootServices()
。请注意,从技术上讲,这违反了Multiboot1规格,该规范说启动加载程序必须将固件留在可用的状态,但这是不可能的(例如,启动加载程序无法告诉OS OS,而不是可用的EFI系统表(实际上(例如,为MultiBoot1设计的操作系统可能会假设" BIOS"并崩溃,因为OS无法猜测它是什么样的固件(。
对于GRUB支持的其他" OS特定"方法;有些根本无法在UEFI系统上使用(例如,BIOS的旧"链加载" DECACTO标准(,而另一些则(如果它们工作(将符合任何OS发明的要求(例如," Linux Boot(协议" Linux开发人员为Linux创建的" NetBSD启动协议",该协议由NetBSD和FreeBSD使用等(。我不知道任何特定操作系统的情况会发生什么(除非您正在使用它使用它的操作系统,否则这是相当不重要的(。
注意:随时用" hyper-visor"(或"内核"或其他任何grub可能传递控制(随意替换" OS"的每次出现(。
我同意评论,说最好在管理程序中自己执行此操作。主要原因是如果您在grub中进行:
- 您最终为您的管理程序编写自定义图像加载程序(这与在管理程序中添加此支持同样努力(
- 您在该装载机和管理器之间创建一个ABI(您需要为将来的任何更改进行管理(
e820 May 在某些平台上工作了一段时间,但这是来自旧式BIOS的遗产,而不是保证在UEFI系统中可用的东西。
这就是为什么Linux如今嵌入了内核图像中的一个小"存根装载器"以进行过渡。
因此,您需要将UEFI内存映射和图形输出协议转到您的管理程序中。
如果您仍然想沿着自定义加载程序的路线下去,请查看i386/bsd
或i386/xnu
加载程序以及它们对grub_efi_finish_boot_services
/grub_autoefi_finish_boot_services
的使用。