首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDK/EDK2构建的UEFI应用程序挂起真实系统

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

Stack Overflow用户
提问于 2015-07-21 22:50:48
回答 2查看 494关注 0票数 0

我已经设置了UDK2014和EDK2源代码,并且正在成功构建一个EFI应用程序,该应用程序可以在SecMain模拟器中正常运行。但是,当我将应用程序转移到实际的UEFI系统并运行它时,系统挂起了。我只尝试了一个简单的打印hello world的应用程序:

代码语言:javascript
复制
#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测试环境,我是否需要做一些特殊的工作来构建一个真正的系统呢?

EN

回答 2

Stack Overflow用户

发布于 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。

票数 1
EN

Stack Overflow用户

发布于 2015-08-10 16:45:59

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,系统表->固件供应商);return EFI_SUCCESS;}

  • 部分UEFI实现。如果您的实际系统部分实现了EFI简单文本输出协议,即FirmwareVendor指针可能未定义;如果发生这种情况,您将取消引用导致崩溃的错误指针。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31542486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档