gpt4 book ai didi

c - 加载 UEFI 协议(protocol)的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 22:05:35 27 4
gpt4 key购买 nike

如果这不符合 StackOverflow 格式,我们深表歉意。我目前正在学习编写 UEFI 应用程序。我一直在阅读 UEFI 标准以及大量在线教程,但我似乎无法弄清楚加载 UEFI 协议(protocol)的正确方法是什么。所有教程的使用方法似乎都不同。

在许多情况下,教程遵循定位句柄然后遍历句柄缓冲区以打开协议(protocol)的方法。示例如下所示:

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;
}
}

或者,您似乎可以直接使用 LocateProtocol 加载协议(protocol)。功能。例子:

status = uefi_call_wrapper(gBS->LocateProtocol,
3,
&gEfiGraphicsOutputProtocolGuid,
NULL,
&graphics_service.protocol);

以上两个例子都有效。
我不确定我是否理解在加载协议(protocol)之前获取句柄缓冲区的重要性,如一些教程和在线 Material 中所见。通过在 Github 上搜索示例,看起来两者都可以互换使用,到目前为止,我发现两者都可以正常工作。我知道在前一种方法中,我需要释放缓冲区,因为它是从池中分配的,而在后一种方法中,对此不承担任何责任。

谁能指出加载 UEFI 协议(protocol)的理想方法是什么?两种方法都有问题吗?
这里的任何帮助将不胜感激。

最佳答案

对于这种特定情况(试图找到“EFI_GRAPHICS_OUTPUT_PROTOCOL”),如果只有一个,或者您只想要一个而不关心哪个;然后 gBS->LocateProtocol更容易(并且可能更快?),但您可以使用 gBS->LocateHandleBuffer如果你愿意,也可以。

然而;如果有 5 个显卡,每个显卡有 2 个显示器,并且有 10 个不同的“EFI_GRAPHICS_OUTPUT_PROTOCOL”实例,该怎么办?在这种情况下,您可能想要所有这些(因此您可以在所有 10 个监视器上设置一个不错的视频模式),并且您可能想要搜索正确的一个(例如,实际上可能是用户右侧的那个) 并跳过/避免其他 9 个错误的。为此,您必须使用 gBS->LocateHandleBuffer .

关于c - 加载 UEFI 协议(protocol)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com