0

我已经设置了 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 测试环境,我是否需要做一些特别的事情来构建针对真实系统的目标?

4

2 回答 2

1

您不需要做任何特别的事情,使用标准 UEFI API 和协议的应用程序应该在真实系统中与在模拟环境中一样工作。我没有可以尝试的 32 位平台,但我做了相反的事情 - 为 64 位构建并在 64 位系统上尝试了您的代码 - 一切正常。

你确定你有一个带有 32 位 UEFI BIOS 的 32 位系统吗?您的症状确实看起来像是在 64 位 UEFI BIOS 下运行,并且大多数商业系统都是 64 位的,其中包含 64 位 UEFI BIOS。

我会尝试注释掉两条 SystemTable->ConOut->OutputString 行,以查看应用程序是否仍然挂起。如果应用程序正确加载并退出,则问题可能与使用不同库构建的模拟环境有关。我确实注意到我的 64 位应用程序的长度约为 1K,而内置在模拟环境中的 32 位应用程序的长度约为 24K。

于 2015-07-23T00:22:24.940 回答
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);
    
于 2015-08-10T08:45:58.950 回答