UEFI Images

UEFI Images


1. 什麼是UEFI Images?

UEFI Images是UEFI定義的、包含可執行代碼的一類文件,最顯著的特徵是包含一個用來定義這段可執行代碼格式的PE/COFF header,這個header定義了Processor Type和Image Type。(Microsoft Portable Executable and Common Object File Format Specification (Microsoft 2008)) 

 // PE32+ Subsystem type for EFI images
#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION                          10
#define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER   11
#define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER               12


// PE32+ Machine type for EFI images
#define EFI_IMAGE_MACHINE_IA32                                    0x014c
#define EFI_IMAGE_MACHINE_IA64                                    0x0200
#define EFI_IMAGE_MACHINE_EBC                                   0x0EBC
#define EFI_IMAGE_MACHINE_x64                                     0x8664
#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED       0x01C2

2. UEFI Images的分類

UEFI Images依據駐留內存的能力可分成兩大類:

1>, UEFI Applications   其中,UEFI OS Loader是一種特殊類型的Application

2>, UEFI Drivers      又分爲:UEFI Boot Service Drivers和UEFI Runtime Drivers

各個類別的區別,主要有兩點:一、各Image被加載到的Memory Type不同,二、退出或返回時的Action不同。

一、各Image被加載到的Memory Type不同:

二、退出或返回時的Action不同:

a>. UEFI Applications:當Image退出或返回時,這種Image會被自動卸載,其內存資源和狀態會被釋放。

b>. UEFI OS Loader:這是一種特殊類型的Application,通常不會退出或返回,相反的,它會調用gBS->ExitBootService()來把平臺的控制權從固件交給OS。

c>. UEFI Boot Service Drivers:這種Image的內存資源和狀態在進入操作系統之前都被保存,當OS Loader調用gBS->ExitBootService()時被釋放。

d>. UEFI Runtime Drivers:這種Image的內存資源和狀態會一直存在。這些Images和UEFI OS並存,並且能夠被支持UEFI的OS調用。

3. UEFI Image Entry Point

Prototype
    typedef
    EFI_STATUS
    (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
        IN     EFI_HANDLE                   ImageHandle,
        IN     EFI_SYSTEM_TABLE     *SystemTable
    );      

Parameters
    ImageHandle:  The firmware allocated handle for the UEFI image.   該UEFI Image的ImageHandle
    SystemTable:    A pointer to the EFI System Table.                                 指向EFI System Table的指針

有了這兩個參數,EFI Image可以做到:

1>. 訪問平臺上可用的所有EFI服務程序。

2>. 知道EFI Image從哪裏被裝載以及放在內存的什麼位置。

 

Note:

UEFI Images不是被編譯和鏈接在一個固定的位置,相反的,UEFI Images可以被relocation,所以UEFI Images能被放系統內存的任何地方。

一個UEFI Image是通過EFI Boot Service gBS->LoadImage()被加載(Load)並重定位(Relocation)到系統內存中的;通過gBS->StartImage()被調用。

EFI Boot Service gBS->LoadImage()會做以下動作:

1>. 爲加載的 Image分配內存(Allocate Memory)。

2>. 自動爲Image申請Relocation fix-up。

3>. 在Handle database中創建一個新的Image handle. 在這個新的Image handle中,創建了一個EFI_LOADED_IMAGE_PROTOCOL的instance, 它包含了被加載的Image的信息。

 

 

Refer:

Unified Extensible Firmware Interface Specification, Version 2.3.1

Beyond BIOS, Second Edition

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章