C 将UEFI兼容软件加载到USB并运行

C 将UEFI兼容软件加载到USB并运行,c,operating-system,kernel,bootable,C,Operating System,Kernel,Bootable,我有一个经过编译和链接的C文件,可以由UEFI系统作为内核运行,我注意到使用qemu来运行它是乏味的 是否有任何方法可以像BIOS引导加载程序一样运行此代码(将原始二进制文件(可能是EFI或IMG文件)插入USB记忆棒,并打开它所连接的计算机)?要让UEFI在USB闪存上引导可执行文件,您需要: USB闪存上的“MBR分区”或GPT;一个分区格式化为FAT文件系统。这个分区可能还需要在分区表中标记为“EFI系统分区”(UEFI规范不是很清楚,但对我来说很有意义) 要执行的文件必须位于特定目录

我有一个经过编译和链接的C文件,可以由UEFI系统作为内核运行,我注意到使用qemu来运行它是乏味的


是否有任何方法可以像BIOS引导加载程序一样运行此代码(将原始二进制文件(可能是EFI或IMG文件)插入USB记忆棒,并打开它所连接的计算机)?

要让UEFI在USB闪存上引导可执行文件,您需要:

  • USB闪存上的“MBR分区”或GPT;一个分区格式化为FAT文件系统。这个分区可能还需要在分区表中标记为“EFI系统分区”(UEFI规范不是很清楚,但对我来说很有意义)

  • 要执行的文件必须位于特定目录中,并且具有特定名称,具体名称取决于平台(例如,对于64位80x86,为“
    \EFI\BOOT\BOOTx64.EFI
    ”)

  • 可执行文件的PE头中的“机器类型”字段必须与给定的名称匹配(例如,对于64位80x86,
    0x8664

另一个限制是,您需要确保在UEFI的设置中关闭SecureBoot;或者了解如何使用固件接受的密钥对可执行文件进行数字签名


请注意,可移动介质(如USB闪存)的规则与固定介质(如内部SATA驱动器)的规则不同。

您可以从USB启动UEFI系统(假设您符合“安全启动”规范)。或者,与其使用
qemu
,不如在
vmware
xen
virtualbox
下作为虚拟机运行?问题是,我应该运行什么?我有一个EFI和一个IMG文件,它们都不起作用。VMWare直接进入internet操作系统我只使用了virtualbox,但是如果您有一个可引导映像,您可以将其复制到vbox的一个虚拟磁盘上进行引导。或者,在vbox的设备管理器IIRC中,您可以将真实设备映射为可引导设备。或者,您可以创建一个
.iso
(CD映像文件),并让vbox从中引导VM。这就是在VM中安装linux的方式。因此,有一些程序/指南可以创建这样一个image@CraigEstey,我刚刚注意到,由于使用了一些IMG到ISO转换器但没有成功,我的文件可能已损坏或格式不正确。谢谢,这个问题将被存档,直到获得新的信息。是否必须只有您提到的目录,或者允许我在EFI文件夹中查找其他任意内容?@Vyber90:您只需要为引导加载程序提供正确的名称/位置(以便UEFI可以找到它)。对于其他一切,您可以随心所欲,但我建议不要使用UEFI系统分区,因为FAT非常糟糕(对于限制/限制、功能、安全性等)。