标签: gnu-efi

加载 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
查看次数

如何使用 gnu-efi 读取 EFI 分区的文件

我使用了 gnu-efi。
我不明白如何简单地读取文件。
我了解使用 BlockIOProtocol。

你能告诉我们一个简单的例子吗?

gnu uefi gnu-efi

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

如何使用gnu-efi编译uefi应用程序?

我尝试使用编译uefi代码gnu-efi。但是我不明白如何编译我的uefi应用程序代码。

我得到gnu-efi3.0.2,解压缩并输入make && make install。我写你好世界代码:

#include <efi.h>
#include <efilib.h>

EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
    InitializeLib(ImageHandle, SystemTable);
    Print(L"Hello, world!\n");

    return EFI_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我的操作系统是Ubuntu 15.04。

uefi gnu-efi

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

标签 统计

gnu-efi ×3

uefi ×3

c ×1

edk2 ×1

gnu ×1