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