系统表描述了通往UEFI Image 的入口。有三种UEFI Image可以被固件加载和执行,分别为UEFI Application,UEFIboot service drivers和UEFI runtime drivers。UEFI Application包括操作系统加载器。这三种Image types的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 Service EFI_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才可以重新获得平台的控制权,通过EFI Runtime 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 表类型之前的数据结构。它包含了每个表类型的唯一的signature、表的修订版(随着扩展添加到 EFI 表类型时可能会更新)以及 32 位 CRC(便于 EFI 表类型的使用者可以验证 EFI 表的内容)。
EFI 系统表、运行时表和引导服务表中的功能可能会随时间而变化。每个表中的第一个字段是EFI_TABLE_HEADER。当新的功能和函数被添加到表中的函数中时,头部的Revision字段递增。
除非另有说明,否则UEFI 使用标准 CCITT32 CRC 算法,其 CRC 计算的种子多项式值为 0x04c11db7。
系统表、运行时服务表和引导服务表的大小可能会随着时间的推移而增加。必须使用EFI_TABLE_HEADER的 HeaderSize 字段来确定这些表的大小。
EFI System Table包含指向runtime和boot services 表的指针。在调用EFI_BOOT_SERVICES.ExitBootServices()之前,EFI 系统表的所有字段均有效;在OS调用ExitBootServices()获得平台的控制权之后,只有 Hdr、 FirmwareVendor、FirmwareRevision、RuntimeServices、NumberOfTableEntries 以及ConfigurationTable 字段是有效的。
EFI Boot Services Table包含一个表头和指向所有Boot Service 的指针。表中的函数指针在操作系统调用EFI_BOOT_SERVICES.ExitBootServices()获得平台控制权之后无效。
EFI Runtime Services Table包含一个表头和指向所有Runtime Service的指针。与EFI Boot Services Table不同,该表的函数指针在操作系统加载器和OS调用EFI_BOOT_SERVICES.ExitBootServices()获得平台控制权之后依然有效。如果操作系统调用了 SetVirtualAddressMap(),则此表中的函数指针将固定为指向新的虚拟映射入口点。
EFI Configuration Table 是 EFI System Table的ConfigurationTable字段。此表包含一组 GUID/指针对。此表的每个元素由下面的EFI_CONFIGURATION_TABLE结构描述。配置表的类型数量预计将随着时间的推移而增长。这就是使用 GUID 来标识配置表类型的原因。EFI Configuration Table最多可以包含每个表类型的一次实例。