问题标签 [gnu-efi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
752 浏览

c - 使用 gnu-efi 加载 EFI 映像

我正在编写 UEFI 'chainloader' 以了解有关它如何工作的更多信息。我正在使用 gnu-efi,并尝试加载和启动 EFI 映像。我希望我的 main.efi 加载并运行位于同一个 ESP 中的 hello.efi。我只是不明白该调用什么以及如何调用它。这是我的代码:

DisableTimeout() 是我制作的一个函数。

对不起,我对 UEFI 开发很陌生。

0 投票
1 回答
941 浏览

x86-64 - UEFI LocateHandleBuffer 总是返回“无效参数”

非常简单的 UEFI 程序,例如:

LocateHandleBuffer()总是返回8000000000000002“无效参数。EFI 文档说唯一的原因应该是如果我传递的两个指针之一是 NULL,它们显然不是。

没有比这更简单的了。我最初尝试使用ByProtocol特定的 GUID - 但它总是失败并出现相同的错误。

知道问题可能是什么吗?

0 投票
1 回答
1530 浏览

uefi - 大多数 UEFI 协议被报告为“不受支持”

我正在 SoC 设备(Up Board)上编写一个 EFI 可执行文件,以帮助我们自动化 BIOS 更新和 PXE 引导,以便在众多设备上安装我们的软件。

我遇到的问题是,规范中的大多数协议似乎在这个平台上都是“不受支持的”,甚至是基本的文件系统任务。我唯一成功使用的是 LOADED_IMAGE_PROTOCOL。我正在使用 gnu-efi 编译代码,将我的代码基于此示例https://mjg59.dreamwidth.org/18773.html。是不是我做错了什么,或者这仅仅是固件绝对没有实现任何协议?

American Megatrends 实用程序“AfuEfix64.efi”能够检索 BIOS 信息,并且 SoC BIOS 更新是使用 Intel 的 EFI 可执行文件完成的。不幸的是,两者都是封闭源代码。我最初的想法是编写一个脚本来解析这些可执行文件的输出,但我不认为 EFI shell 对这类任务有很多功能,所以我继续编写一个 EFI 可执行文件来执行此操作。

显示此的最小代码:

这是运行它的输出:

这是我用来编译它的 Makefile:

编辑:正确使用 LocateProtocol() 查找协议并使用它们打开和关闭文件的修改版本。

0 投票
1 回答
147 浏览

x86 - UEFI 引导加载程序中的 SPI 寄存器读写应用程序

我是 UEFI 系统的新手。我想通过 SPI 接口读/写寄存器,但在 UEFI 中没有找到任何 API 或应用程序。

如果任何人都可以建议相同的示例应用程序或 API,那将会很有帮助。

在此先感谢,哈迪克

0 投票
0 回答
398 浏览

c - 如何使用 GNU-EFI 简单网络等待网络数据包

我正在尝试使用 EFI 简单网络协议:

http://wiki.phoenix.com/wiki/index.php/EFI_SIMPLE_NETWORK_PROTOCOL

等待传入的以太网数据包。然而,使用 QEMU,WaitForPacket 事件即使有传入的数据包也不会触发,并且在真实硬件上,该事件总是会立即触发而没有任何数据包到达。我可以使用 tcpdump 看到我的示例数据包“在线”,所以我相当有信心我正在向它提供数据包。这是我的代码(归结为这个测试用例):

我尝试过/证明/线索的事情:

当它运行时,WaitForPacket 事件打印行打印一个非空值,所以我假设 EFI 系统已经创建了一个事件并在 EFI_SIMPLE_NETWORK 结构中将其准备好。

我尝试假设我需要创建一个事件并将其放入结构中,然后使用该事件等待,但它没有任何区别。

我有其他代码可以发送和接收数据包(差不多),所以我认为我对网络句柄和接口结构的理解是合理的,我的 EFI 硬件和 QEMU 能够进行网络通信。

关于如何使用 WaitForPacket 的文档是不存在的,以至于感觉这应该是那些可以工作的东西之一。我发现的文档位于 Phoenix wiki(上面链接)和 2899 页 UEFI 规范文档版本 2.7。

尽管我在谷歌上搜索得最好,但我找不到任何在 GNU-EFI 应用程序中使用 WaitForPacket 的例子。

我尝试过启动和初始化网络硬件,这对于 QEMU 来说似乎是必要的,但对于真正的硬件却不是。我还尝试使用 ReceiveFilters() 将硬件设置为混杂模式并对其进行广播,但这也没有什么区别。

有任何想法吗??

0 投票
1 回答
654 浏览

c - UEFI - malloc 调用不返回

我会尽量保持简短。

我创建了一个 UEFI 应用程序,它只使用了一个简单的 malloc,但它永远不会从调用中返回:

主.c:

输出:

系统是linux-ubuntu下的QEMU虚拟机:

bios.bin 是 UEFI 固件https://wiki.ubuntu.com/UEFI/OVMF

main.efi 被写入 app.disk

main.c 的构建过程几乎是完整的从https://www.rodsbooks.com/efi-programming/hello.html复制粘贴:

0 投票
1 回答
1274 浏览

uefi - 重定向 UEFI Shell I/O

我想重定向 UEFI Shell 标准输入/标准输出以从远程 PC 工作。我有/看到两个选项:

1) 通过 UART/COM 接口:是否有任何简单的解决方案可以在 shell 内运行?(我不想进入“BIOS”设置,而是通过 shell 脚本开始重定向)

我能够编写一个使用 UART 接口的 UEFI-Shell 应用程序。我发现在 edk2\MdeModulePkg\Universal\Console\TerminalDxe 有一个终端驱动程序。但我找不到任何关于如何使用它来重定向 ConIn 和 ConOut 的信息。

2)通过SSH:我发现的唯一信息是可以在EFI Shell中设置SSH服务器:

http://www.rodsbooks.com/efi-programming/why.html

但是,如果已经有任何可用的 UEFI 应用程序/文档,我无法找到有关如何或的任何信息。

0 投票
1 回答
116 浏览

xen - EDK 2 中 UEFI 引导服务的实际代码在哪里,或者在 EDK 2 源代码中填充系统表的位置在哪里

我正在研究虚拟化层,特别是虚拟化 UEFI 引导服务,以便即使在调用 ExitBootService() 并将控制权传递给 GPOS 内核(无论是 Windows/Linux)之后,也可以使用这些服务。我无法在EDK 2 源代码中找到启动服务的实际代码。引导服务被实现为函数指针。我找不到这些函数指针指向实际函数的位置,例如 AllocatePage() 引导服务。EDK 2 源代码中 AllocatePage() 引导服务的声明在哪里。或者在 EDK 2 源系统表和引导服务结构中填充的其他位置。我也有兴趣了解 XEN 如何处理这个特殊问题。任何 OVMF 来源也值得赞赏。非常感谢

0 投票
1 回答
1338 浏览

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

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

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

或者,您似乎可以直接使用该LocateProtocol函数加载协议。例子:

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

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

0 投票
2 回答
1014 浏览

uefi - 等待按键 GNU EFI

如何在 GNU EFI 中等待密钥?
我打算让它等待一个键,然后继续执行。
我的代码: