问题描述
我使用gnu-efi开发UEFI应用程序。我在使协议(EFI_SHELL_PROTOCOL)在gnu-efi下工作时遇到了一些麻烦。我的编译器说它是未定义的。我应该包括一些东西吗?我已经包含了efi.h
和efilib.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.h
和efishellparm.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源代码。