UDK/EDK2 Встроенные приложения UEFI зависают в реальной системе

Я настроил исходный код UDK2014 и EDK2 и успешно создаю приложение EFI, которое отлично работает в эмуляторе SecMain. Однако, когда я переношу приложение в реальную систему UEFI и запускаю его, система зависает. Я пробовал простое приложение, которое печатает привет, мир:

#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;
}

Это 32-битная система UEFI, которую я тестирую, и я ориентируюсь на 32-битную систему в своей сборке UDK/EDK2.

Нужно ли делать что-то особенное для сборки реальной системы по сравнению с тестовой средой SecMain, поставляемой с UDK/EDK2?


person Without Me It Just Aweso    schedule 21.07.2015    source источник


Ответы (2)


Вам не нужно делать ничего особенного, приложения, использующие стандартные API и протоколы UEFI, должны работать в реальных системах так же, как и в эмулируемой среде. У меня нет 32-битной платформы, чтобы попробовать, но я сделал наоборот - собрал для 64-битной и попробовал ваш код на 64-битной системе - все работает.

Вы уверены, что у вас 32-разрядная система с 32-разрядным UEFI BIOS? Ваши симптомы выглядят так, как будто вы работаете в 64-разрядной версии UEFI BIOS, и большинство коммерческих систем являются 64-разрядными с 64-разрядной версией UEFI BIOS.

Я бы попытался закомментировать две строки SystemTable->ConOut->OutputString, чтобы увидеть, зависает ли приложение. Если приложение загружается правильно и закрывается, проблема может быть связана со сборкой эмулируемой среды с другими библиотеками. Я заметил, что мое 64-битное приложение имеет длину ~ 1 КБ, а 32-битное приложение, созданное в эмулируемой среде, имеет длину ~ 24 КБ.

person sun2sirius    schedule 23.07.2015

Есть несколько причин, по которым приложение 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);
    
person Pat    schedule 10.08.2015