UEFI Images 转载

来源:互联网 发布:arm 模拟器 windows 编辑:程序博客网 时间:2024/06/16 03:41
 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