UDK / EDK2构建的UEFI应用程序挂起真实系统

时间:2015-07-21 14:50:48

标签: uefi

我已经设置了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测试环境相比,我是否需要针对真实系统进行特殊构建?

2 个答案:

答案 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下正常工作有几个原因,而在真实系统中失败,即

  1. 不同的初始化条件。使用显示例程时,必须正确设置显示。即可能需要调用类似的东西:

    {
      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;
    }
    
  2. 部分UEFI实施。如果您的真实系统部分实现EFI SIMPLE TEXT OUTPUT PROTOCOL,即 FirmwareVendor 指针可能未定义;如果发生这种情况,您将取消引用导致崩溃的错误指针。

      SystemTable->ConOut->OutputString(SystemTable->ConOut, SystemTable->FirmwareVendor);