我已经设置了UDK2014和EDK2源,并成功构建了一个在SecMain仿真器中运行良好的EFI应用程序。但是,当我将应用程序转移到真正的UEFI系统并运行它时系统挂起。我试过一个打印hello world的简单应用程序:
#include <Uefi.h>
#include <Library/PcdLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut, (CHAR16*)L"Hello World22\r\n");
SystemTable->ConOut->OutputString(SystemTable->ConOut, SystemTable->FirmwareVendor);
return EFI_SUCCESS;
}
这是我正在测试的UEFI 32位系统,我的UDK / EDK2版本中的目标是32位。
与UDK / EDK2附带的SecMain测试环境相比,我是否需要针对真实系统进行特殊构建?
答案 0 :(得分:1)
您不需要做任何特殊的事情,使用标准UEFI API和协议的应用程序应该在与模拟环境相同的实际系统中工作。我没有尝试使用32位平台,但我做了相反的操作 - 为64位构建并在64位系统上尝试了代码 - 一切正常。
您确定拥有32位UEFI BIOS的32位系统吗?您的症状看起来像在64位UEFI BIOS下运行,并且大多数商业系统都是64位,其中包含64位UEFI BIOS。
我会尝试注释掉两个SystemTable-&gt; ConOut-&gt; OutputString行,看看应用程序是否仍然挂起。如果应用程序正确加载并退出,那么问题可能与使用不同库的模拟环境构建有关。我注意到我的64位应用程序长约1K,在仿真环境中构建的32位应用程序长约24K。
答案 1 :(得分:1)
UEFI应用程序在SecMain下正常工作有几个原因,而在真实系统中失败,即
不同的初始化条件。使用显示例程时,必须正确设置显示。即可能需要调用类似的东西:
{
SystemTable->ConOut->Reset(SystemTable->ConOut, FALSE);
SystemTable->ConOut->OutputString(SystemTable->ConOut, (CHAR16*)L"Hello World22\r\n");
SystemTable->ConOut->OutputString(SystemTable->ConOut, SystemTable->FirmwareVendor);
return EFI_SUCCESS;
}
部分UEFI实施。如果您的真实系统部分实现EFI SIMPLE TEXT OUTPUT PROTOCOL,即 FirmwareVendor 指针可能未定义;如果发生这种情况,您将取消引用导致崩溃的错误指针。
SystemTable->ConOut->OutputString(SystemTable->ConOut, SystemTable->FirmwareVendor);