标签: edk2

在linux下构建edk2

我开始用 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)

qemu uefi edk2

6
推荐指数
2
解决办法
1万
查看次数

加载 UEFI 协议的正确方法是什么?

如果这不符合 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 协议的理想方法?这两种方法都有问题吗?任何帮助在这里将不胜感激。

c uefi gnu-efi edk2

4
推荐指数
1
解决办法
1008
查看次数

EDK2(UEFI 开发环境)在执行测试构建后失败

我正在使用 EDK2 和 Visual Studio 2019。我按照说明在 Windows 系统上设置 EDKII 构建环境。在 Windows 命令行上发送以下命令“edksetup.bat Rebuild”后,我收到以下消息。

\n
subprocess not exit successfully\nError while execute command 'nmake all' in direcotry C:\\edk2\\BaseTools\\Source\\C\\BrotliCompress\n
Run Code Online (Sandbox Code Playgroud)\n

...

\n
LINK : 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.\n
Run 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

c visual-studio uefi edk2

3
推荐指数
1
解决办法
9097
查看次数

有关于将 edk2 移植到新的 ARM64 平台的指南吗?

我是 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 相比),所以我猜它远非“最小” “ 版本。但很难弄清楚要删除哪些功能(以及如何删除)。

我想知道是否有关于此类主题的详细指南...

arm64 edk2

3
推荐指数
1
解决办法
2083
查看次数

标签 统计

edk2 ×4

uefi ×3

c ×2

arm64 ×1

gnu-efi ×1

qemu ×1

visual-studio ×1