我正在为Intel x86平台开发基于UEFI的虚拟机管理程序。 GRUB用于加载VMM和OS映像,为降低复杂性,我目前仅通过GRUB加载一个GPOS,显然是通过VMM加载。但是由于某些设计问题,我不想在Hypervisor中使用EFI服务。在研究此主题期间,我遇到了一篇帖子或评论,其中指出GRUB可以调用ExitBootService,这将解决我的问题。但是,没有有关如何通过GRUB实际调用ExitBootService的适当文档。如果有人可以指导我一些有关通过GRUB调用ExitBootService的问题,那将真的很有帮助。
答案 0 :(得分:3)
对于Multiboot2; UEFI系统上的默认行为是引导加载程序(例如GRUB)调用ExitBootServices()
,而OS则不执行任何操作。要进行更改,您需要在multiboot标头中使用特殊标签(请参见Multiboot2规范中的3.1.12 EFI boot services tag
)来通知引导加载程序您不希望它调用ExitBootServices()
。
对于Multiboot1;不支持UEFI。在这种情况下;如果引导加载程序支持从UEFI启动,则必须在启动符合Multiboot1的操作系统之前调用ExitBootServices()
。请注意,从技术上讲,这违反了Multiboot1规范,该规范指出引导加载程序必须将固件保持在可用状态,但这是不可能的(例如,引导加载程序无法告诉OS EFI系统表在哪里)并且不可用在实践中(例如,为Multiboot1设计的操作系统很可能会采用“ BIOS”并因此崩溃,因为该操作系统无法猜测它是哪种固件)。
对于GRUB支持的其他“特定于操作系统”的方法;有些根本无法在UEFI系统上使用(例如,BIOS中的旧“事实上的链式装载”事实上的标准),而另一些(如果它们起作用的话)将符合发明它的任何OS的要求(例如,“ Linux启动” Linux开发人员为Linux创建的协议”,NetBSD和FreeBSD使用的“ NetBSD引导协议”等)。我不知道在任何特定于操作系统的情况下会发生什么(除非您正在使用它的操作系统上工作,否则这并不重要)。
注意:可以将每次出现的“ OS”替换为“超级管理员”(或“内核”或任何其他GRUB可能会将控制权传递给)。
答案 1 :(得分:2)
我同意以下意见,即最好在虚拟机管理程序中自行执行此操作。主要原因是,如果您在GRUB中这样做:
E820 可能会在某些平台上运行一段时间,但是它是旧式BIOS的遗留物,不能保证在UEFI系统中可用。
这就是为什么这些天Linux在内核映像中嵌入一个小的“存根加载器”来进行过渡的原因。
因此,您需要将UEFI内存映射和图形输出协议传递到管理程序。
如果您仍然想遵循自定义加载程序的路线,请查看i386/bsd
或i386/xnu
加载程序及其对grub_efi_finish_boot_services
/ grub_autoefi_finish_boot_services
的使用。