我怎样才能让协议在 GNU-EFI 下工作?

How can I get a protocol working under GNU-EFI?

我使用 GNU-EFI 开发 UEFI 应用程序。我在获取在 GNU-EFI 下工作的协议 (EFI_SHELL_PROTOCOL) 时遇到了一些麻烦。我的编译器说它是未定义的。我应该包括一些东西吗?我已经包含了 efi.hefilib.h。我还需要更多吗?

我试过的代码:

EFI_SHELL_PROTOCOL shell;

我得到的错误:

error: unknown type name ‘EFI_SHELL_PROTOCOL’; did you mean ‘EFI_OPEN_PROTOCOL’?
  161 |  EFI_SHELL_PROTOCOL shell;

EFI_SHELL_PROTOCOL 不是主 UEFI 接口的一部分,因此不包含在主头文件中(例如 efi.h),也不包含在主 UEFI 标准中。

相反,EFI_SHELL_PROTOCOL 只是一个可选的扩展(可能不存在,我认为只有在使用并提供 shell 时才可能存在),其拥有独立的标准和独立的头文件。

假设您使用的是 GNU 的工具;要包含的正确文件可能是 efishellintf.hefishellparm.h.

目前,GNU-EFI 不支持 EFI_SHELL_PROTOCOL。它不包含任何关于它的相关定义。

如果你想和GNU-EFI一起使用,你可以使用this header file from edk2(放在inc文件夹中,例如inc/efishell.h)。然后在 inc/efi.h 中包含此头文件并添加以下行:

lib/data.c:

EFI_GUID ShellProtocol = EFI_SHELL_PROTOCOL_GUID;

inc/efilib.h:

extern EFI_GUID ShellProtocol;

重建您的 GNU-EFI,现在您可以通过先找到它来使用 EFI_SHELL_PROTOCOL。

EFI_SHELL_PROTOCOL *SP;

uefi_call_wrapper(BS->LocateProtocol, 3, &ShellProtocol, NULL, &SP);

EFI_SHELL_PROTOCOL 完整记录在 UEFI Shell 规范(当前为 v2.2)中,可在 https://uefi.org/specifications

下载

GNU EFI 当前未实现 EFI_SHELL_PROTOCOL,或者实际上,当前的所有 UEFI 规范。有关 UEFI Shell 规范的参考实现,请查看 EDK11 ShellPkg 源代码。