如何在GNU-EFI下工作的协议?

问题描述

我使用gnu-efi开发UEFI应用程序。我在使协议(EFI_SHELL_PROTOCOL)在gnu-efi下工作时遇到了一些麻烦。我的编译器说它是未定义的。我应该包括一些东西吗?我已经包含了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只是一个可选的扩展名(可能不存在,我认为只有在使用并提供外壳程序时才可能存在),它具有自己的独立标准和单独的头文件。

假设您正在使用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源代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...