我已经设置了UDK2014和EDK2源代码,并且正在成功构建一个EFI应用程序,该应用程序可以在SecMain模拟器中正常运行。但是,当我将应用程序转移到实际的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;
}它是我正在测试的UEFI32位系统,我的UDK/EDK2版本的目标是32位。
相对于UDK/EDK2附带的SecMain测试环境,我是否需要做一些特殊的工作来构建一个真正的系统呢?
发布于 2015-07-23 08:22:25
您不需要做任何特殊的事情,使用标准UEFI和协议的应用程序在真实系统中的工作方式应该与在仿真环境中相同。我没有32位平台可以尝试,但我做了相反的事情-为64位构建,并在64位系统上测试了您的代码-所有工作都可以。
您确定您的32位系统具有32位UEFI BIOS吗?您的症状看起来确实像是在64位UEFI BIOS下运行的,而且大多数商业系统都是64位的,其中包含64位的UEFI BIOSes。
我会尝试注释掉SystemTable->ConOut->OutputString这两行代码,看看应用程序是否仍然挂起。如果应用程序正确加载并退出,那么问题可能与使用不同库构建仿真环境有关。我确实注意到我的64位应用程序的长度约为1K,而在模拟环境中构建的32位应用程序的长度约为24K。
发布于 2015-08-10 16:45:59
UEFI应用程序在SecMain下正常工作,而在真实系统中失败,有几个原因。
{ SystemTable->ConOut->Reset(SystemTable->ConOut,FALSE);SystemTable->ConOut->OutputString(SystemTable->ConOut,(CHAR16*)L"Hello World22\r\n");SystemTable->ConOut->OutputString(SystemTable->ConOut,系统表->固件供应商);return EFI_SUCCESS;}
SystemTable->ConOut->OutputString(SystemTable->ConOut,SystemTable->FirmwareVendor);
https://stackoverflow.com/questions/31542486
复制相似问题