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 アプリが 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 に答える