我开始用 edk2 编写一个小而简单的应用程序。
因此,要编写一个简单的 edk2 UEFI 应用程序,我是这样开始的:
#git 克隆https://github.com/tianocore/edk2.git
#. edksetup.sh BaseTools
Loading previous configuration from /media/ledoux/Data/osdev/devos/edk2/edk2/Conf/BuildEnv.sh
WORKSPACE: /media/ledoux/Data/osdev/devos/edk2/edk2
EDK_TOOLS_PATH: /media/ledoux/Data/osdev/devos/edk2/edk2/BaseTools
CONF_PATH: /media/ledoux/Data/osdev/devos/edk2/edk2/Conf
#vi Conf/target.txt
Run Code Online (Sandbox Code Playgroud)
(在那里,我输入了:TARGET_ARCH = IA32 X64 TOOL_CHAIN_TAG = VS2017)
# BUILD -a X64
Build environment: Linux-5.7.0-kali1-amd64-x86_64-with-glibc2.29
Build start time: 08:32:11, Sep.03 2020
WORKSPACE = /media/ledoux/Data/osdev/devos/edk2/edk2
EDK_TOOLS_PATH = /media/ledoux/Data/osdev/devos/edk2/edk2/BaseTools
CONF_PATH = /media/ledoux/Data/osdev/devos/edk2/edk2/Conf
PYTHON_COMMAND = /usr/bin/python3.8
Processing meta-data
Architecture(s) = X64
Build target = DEBUG
Toolchain = VS2017
Active Platform = /media/ledoux/Data/osdev/devos/edk2/edk2/EmulatorPkg/EmulatorPkg.dsc
..................
- Failed -
Build end …Run Code Online (Sandbox Code Playgroud) 如果这不符合 StackOverflow 格式,我们深表歉意。我目前正在学习编写 UEFI 应用程序。我一直在阅读 UEFI 标准以及大量在线教程,但我似乎无法弄清楚加载 UEFI 协议的正确方法是什么。所有教程似乎都在使用的方法上有所不同。
在许多情况下,教程遵循定位句柄然后遍历句柄缓冲区以打开协议的方法。示例如下所示:
EFI_HANDLE *handle_buffer;
UINTN handle_count;
EFI_GRAPHICS_OUTPUT_PROTOCOL *protocol;
// GNU-EFI wrapper.
status = uefi_call_wrapper(gBS->LocateHandleBuffer,
5,
ByProtocol,
&gEfiGraphicsOutputProtocolGuid,
NULL,
&handle_count,
&handle_buffer);
UINTN i = 0;
for(i = 0; i < handle_count; i++) {
status = uefi_call_wrapper(gBS->OpenProtocol, 6,
handle_buffer[i],
&gEfiGraphicsOutputProtocolGuid,
(VOID **)&protocol,
ImageHandle, // from `efi_main`
NULL,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
if(status == EFI_SUCCESS) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您似乎可以直接使用该LocateProtocol功能加载协议。例子:
status = uefi_call_wrapper(gBS->LocateProtocol,
3,
&gEfiGraphicsOutputProtocolGuid,
NULL,
&graphics_service.protocol);
Run Code Online (Sandbox Code Playgroud)
以上两个例子都有效。我不确定我是否理解在加载协议之前获取句柄缓冲区的重要性,如一些教程和在线材料中所见。通过在 Github 上搜索示例,看起来两者可以互换使用,到目前为止我发现两者都可以正常工作。我知道在前一种方法中我需要释放缓冲区,因为它是从池中分配的,而在后一种方法中对此没有责任。
谁能指出哪种是加载 UEFI 协议的理想方法?这两种方法都有问题吗?任何帮助在这里将不胜感激。
我正在使用 EDK2 和 Visual Studio 2019。我按照说明在 Windows 系统上设置 EDKII 构建环境。在 Windows 命令行上发送以下命令“edksetup.bat Rebuild”后,我收到以下消息。
\nsubprocess not exit successfully\nError while execute command 'nmake all' in direcotry C:\\edk2\\BaseTools\\Source\\C\\BrotliCompress\nRun Code Online (Sandbox Code Playgroud)\n...
\nLINK : fatal error LNK1181: Eingabedatei "brotli\\c\\tools\\brotli.obj" kann nicht geffnet werden.\nNMAKE : fatal error U1077: ""C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.26.28801\\bin\\HostX86\\x86\\link.exe"": Rckgabe-Code "0x49d"\nStop.\nNMAKE : fatal error U1077: "if": R\xc3\xbcckgabe-Code "0x1"\nStop.\nNMAKE : fatal error U1077: "if": R\xc3\xbcckgabe-Code "0x1"\nStop.\nRun Code Online (Sandbox Code Playgroud)\n是因为 Visual Studio 2019 兼容性还是“BrotliCompress”有问题?我将标签更改为 TOOL_CHAIN_TAG = VS2019x86。但这没有用。为了兼容 VS2019,我还应该更改哪些内容?和NMAKE文件有什么关系吗?
\n我测试了旧版本的 EDK2,它可以工作。但问题是我使用的是VS2019,我想使用edk2-stable201911。旧版本(edk2-stable201908)最多只能支持VS2017。在tools_de.txt中,没有VS2019的“通用路径宏”。上述错误是使用edk2-stable201911的结果
\n我是 EDK2 的新手。
为了将 ekd2 固件移植到新的 ARM64 平台,最好先获得一个至少可以运行 UEFI Shell 的最小 edk2 端口,在此基础上逐步添加改进。
看起来第一步相当陡峭,例如,如何确定平台的最小“项目”集.dsc和文件?.fdf就我而言,我想.fd为我的平台构建 并将其视为 TF-A 的 BL33,实际上我想构建一个 edk2 固件来替换 u-boot。
网上好像很难找到这样的指南。我发现了一个旧版本的 edk2,其中包含一些指令,但显然它们已过时(最新master分支中不存在,而可以在 UDK 分支中找到,例如UDK2014),并且我不确定为什么这些文档从master分支中删除。
目前我可以构建.fdFVP ( edk2-platforms/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc),并且构建输出似乎FVP_AARCH64_EFI.fd应该被视为 BL33。理论上,这可能是我的新 ARM64 平台的原型,但对我来说,它太复杂了,无法开始:固件大小约为 2.5MiB(与 500K 的 u-boot 相比),所以我猜它远非“最小” “ 版本。但很难弄清楚要删除哪些功能(以及如何删除)。
我想知道是否有关于此类主题的详细指南...