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