系统表描述了通往UEFI Image 的入口。有三种UEFI Image可以被固件加载和执行,分别为UEFI Application,UEFIboot service drivers和UEFI runtime drivers。UEFI Application包括操作系统加载器。这三种Image types的entry point是一样的。

UEFI Image Entry Point

系统表包含指针,这些指针指向active console devices、Boot Services Table、Runtime Services Table、the list of system configuration tables(ACPI, SMBIOS, SAL System Table)。

EFI_IMAGE_ENTRY_POINT

This is the main entry point for a UEFI Image. This entry point is the same for UEFI applications and UEFI drivers.

函数是EFI Image的入口点。EFI Image通过EFI Boot ServiceEFI_BOOT_SERVICES.LoadImage()被加载或重置到系统内存中,通过EFI Boot Service EFI_BOOT_SERVICES.StartImage()被调用。

系统表包含output and input handles, 以及指向 EFI_BOOT_SERVICES 和EFI_RUNTIME_SERVICES 表的指针。系统表中包含固件中用于访问核心EFI系统功能的入口点。系统表中的Handle用于获取对控制台的基本访问权限。系统表包含指向其他标准表的指针,如果关联的指针初始化为非零值,则加载的图像可以使用这些指针。此类表的示例包括 ACPI、SMBIOS、SAL SYSTEM TABLE 等。

ImageHandle是固件可分配的Handle,用于标示各种函数的Image。ImageHandle支持一个或多个Image可使用的protocol。所有的Image支持EFI_LOADED_IMAGE_PROTOCOL和EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL,这两个Protocol用来返回Image的资源位置、内存位置以及load options for the Image,等等。

如果UEFI Image是一个UEFI Application而不是一个UEFI OS Loader,那么应用程序将执行并返回或者调用EFI Boot Service——EFI_BOOT_SERVICES.Exit()。UEFI 应用程序在退出时始终从内存中卸载,其返回状态将返回到启动 UEFI 应用程序的组件中。

如果UEFI Image是一个UEFI OS Loader,那么UEFI OS Loader将执行并返回或者调用EFI Boot Service——Exit(),或者调用UEFI Boot Service——EFI_BOOT_SERVICES.ExitBootServices()。如果EFI OS UEFI OS Loader。如果ExitBootServices()被调用,那么操作系统加载器获得了平台的控制权,同时EFI失去了对平台的控制。只有当平台重置时,EFI才可以重新获得平台的控制权,通过EFIRuntime Service ——ResetSystem()可以重置平台。

如果UEFI Image是一个UEFI Driver,那么UEFI Driver执行并返回或者调用Boot Service——Exit()。如果UEFI Driver返回一个error,那么表示驱动没有从内存中加载。如果返回EFI_SUCCESS,则表述驱动驻留在内存中。如果 UEFI 驱动程序不遵循 UEFI 驱动程序模型,则它会执行任何所需的初始化工作并在返回之前安装其协议服务。如果驱动遵行UEFI驱动模型,则不允许入口点接触任何设备硬件。相反,需要入口点来创建和安装EFI_DRIVER_BINDING_PROTOCOL(在UEFI驱动的ImageHandle上)。如果初始化成功则返回EFI_SUCCESS;如果资源不可用于完成 UEFI 驱动程序初始化,则返回EFI_OUT_OF_RESOURCES。

EFI Table Header

数据类型EFI_TABLE_HEADER是所有标准 EFI 表类型之前的数据结构。它包含了每个表类型的唯一的signature、表的修订版(随着扩展添加到 EFI 表类型时可能会更新)以及 32 位 CRC(便于EFI 表类型的使用者可以验证 EFI 表的内容)。

EFI 系统表、运行时表和引导服务表中的功能可能会随时间而变化。每个表中的第一个字段是EFI_TABLE_HEADER。当新的功能和函数被添加到表中的函数中时,头部的Revision字段递增。

除非另有说明,否则UEFI 使用标准 CCITT32 CRC 算法,其 CRC 计算的种子多项式值为 0x04c11db7。

系统表、运行时服务表和引导服务表的大小可能会随着时间的推移而增加。必须使用EFI_TABLE_HEADER的 HeaderSize 字段来确定这些表的大小。

EFI System Table

EFI System Table包含指向runtime和boot services 表的指针。在调用EFI_BOOT_SERVICES.ExitBootServices()之前,EFI 系统表的所有字段均有效;在OS调用ExitBootServices()获得平台的控制权之后,只有Hdr、FirmwareVendor、FirmwareRevision、RuntimeServices、NumberOfTableEntries 以及ConfigurationTable 字段是有效的。

EFI Boot Services Table

EFI Boot Services Table包含一个表头和指向所有Boot Service 的指针。表中的函数指针在操作系统调用EFI_BOOT_SERVICES.ExitBootServices()获得平台控制权之后无效。

EFI Runtime Services Table

EFI Runtime Services Table包含一个表头和指向所有Runtime Service的指针。与EFI Boot Services Table不同,该表的函数指针在操作系统加载器和OS调用EFI_BOOT_SERVICES.ExitBootServices()获得平台控制权之后依然有效。如果操作系统调用了 SetVirtualAddressMap(),则此表中的函数指针将固定为指向新的虚拟映射入口点。

EFI Configuration Table & Properties Table

EFI Configuration Table 是EFI System Table的ConfigurationTable字段。此表包含一组 GUID/指针对。此表的每个元素由下面的EFI_CONFIGURATION_TABLE结构描述。配置表的类型数量预计将随着时间的推移而增长。这就是使用 GUID 来标识配置表类型的原因。EFI Configuration Table最多可以包含每个表类型的一次实例。