2015-07-21 72 views
0

我已經設置了UDK2014和EDK2源,並且正在成功構建可在SecMain模擬器中正常運行的EFI應用程序。但是,當我將應用程序轉移到真正的UEFI系統並運行時,系統掛起。我已經嘗試只是一個簡單的應用程序,打印Hello World:UDK/EDK2構建的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; 
} 

這是我測試在UEFI 32位系統,而我在我的UDK/EDK2構建針對32位。

我需要做什麼特別的事情來構建一個真正的系統與UDK/EDK2附帶的SecMain測試環境嗎?

回答

1

您不需要做任何特殊的事情,使用標準UEFI API和協議的應用程序應該在真實系統中工作,與模擬環境中相同。我沒有32位平臺試用,但我做了相反的事 - 爲64位構建並在64位系統上試用您的代碼 - 所有這些都可行。

您確定您擁有32位UEFI BIOS的32位系統嗎?您的症狀確實看起來像在64位UEFI BIOS下運行,其中大多數商用系統都是64位UEFI BIOS。

我會嘗試註釋掉兩個SystemTable-> ConOut-> OutputString行來查看應用程序是否仍然掛起。如果應用程序正確加載並退出,則問題可能與使用不同庫的模擬環境構建有關。我確實注意到我的64位應用程序的長度約爲1K,在仿真環境中構建的32位應用程序的長度約爲24K。

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,即指針可能未定義;如果發生這種情況,您將會引用導致崩潰的錯誤指針。

    ​​