UEFI系统组成
UEFI提供给操作系统的接口包括启动服务(Boot Services,BS)和运行时服务(RunTime Services,RT)以及隐藏在BS之后的丰富的Protocol。BS和RT是以表的形式(C语言中的结构体)存在。UEFI驱动好服务以Prtocol的形式通过BS提供给操作系统。
BS也就是Boot Services函数原型如下
EFI Boot Services Table.
typedef struct {
///
/// The table header for the EFI Boot Services Table.
///
EFI_TABLE_HEADER Hdr;
//
// ==Task Priority Services
//
EFI_RAISE_TPL RaiseTPL;
EFI_RESTORE_TPL RestoreTPL;
//
// Memory Services
//
EFI_ALLOCATE_PAGES AllocatePages;
EFI_FREE_PAGES FreePages;
EFI_GET_MEMORY_MAP GetMemoryMap;
EFI_ALLOCATE_POOL AllocatePool;
EFI_FREE_POOL FreePool;
//
// Event & Timer Services
//
EFI_CREATE_EVENT CreateEvent;
EFI_SET_TIMER SetTimer;
EFI_WAIT_FOR_EVENT WaitForEvent;
EFI_SIGNAL_EVENT SignalEvent;
EFI_CLOSE_EVENT CloseEvent;
EFI_CHECK_EVENT CheckEvent;
//
// Protocol Handler Services
//
EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
EFI_HANDLE_PROTOCOL HandleProtocol;
VOID *Reserved;
EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify;
EFI_LOCATE_HANDLE LocateHandle;
EFI_LOCATE_DEVICE_PATH LocateDevicePath;
EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
//
// Image Services
//
EFI_IMAGE_LOAD LoadImage;
EFI_IMAGE_START StartImage;
EFI_EXIT Exit;
EFI_IMAGE_UNLOAD UnloadImage;
EFI_EXIT_BOOT_SERVICES ExitBootServices;
//
// Miscellaneous Services
//
EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount;
EFI_STALL Stall;
EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
//
// DriverSupport Services
//
EFI_CONNECT_CONTROLLER ConnectController;
EFI_DISCONNECT_CONTROLLER DisconnectController;
//
// Open and Close Protocol Services
//
EFI_OPEN_PROTOCOL OpenProtocol;
EFI_CLOSE_PROTOCOL CloseProtocol;
EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation;
//
// Library Services
//
EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle;
EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer;
EFI_LOCATE_PROTOCOL LocateProtocol;
EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
//
// 32-bit CRC Services
//
EFI_CALCULATE_CRC32 CalculateCrc32;
//
// Miscellaneous Services
//
EFI_COPY_MEM CopyMem;
EFI_SET_MEM SetMem;
EFI_CREATE_EVENT_EX CreateEventEx;
} EFI_BOOT_SERVICES;
RT也就是RunTime Services函数原型如下
EFI Runtime Services Table
typedef struct {
///
/// The table header for the EFI Runtime Services Table.
///
EFI_TABLE_HEADER Hdr;
//
// Time Services
//
EFI_GET_TIME GetTime;
EFI_SET_TIME SetTime;
EFI_GET_WAKEUP_TIME GetWakeupTime;
EFI_SET_WAKEUP_TIME SetWakeupTime;
//
// Virtual Memory Services
//
EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
EFI_CONVERT_POINTER ConvertPointer;
//
// Variable Services
//
EFI_GET_VARIABLE GetVariable;
EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
EFI_SET_VARIABLE SetVariable;
//
// Miscellaneous Services
//
EFI_GET_NEXT_HIGH_
EFI_UPDATE_CAPSULEMONO_COUNT GetNextHighMonotonicCount;
EFI_RESET_SYSTEM ResetSystem;
//
// UEFI 2.0 Capsule Services
// UpdateCapsule;
EFI_QUERY_CAPSULE_CAPABILITIES QueryCapsuleCapabilities;
//
// Miscellaneous UEFI 2.0 Service
//
EFI_QUERY_VARIABLE_INFO QueryVariableInfo;
} EFI_RUNTIME_SERVICES;
下图展示了基于EFI的计算机系统的组成
从操作系统加载器(OS Loader)被加载,到OS Loader执行ExitBootServices()的这段时间,是从UEFI环境向操作系统过度的过程。在这个过程中,OS Loader可以通过BS和RT使用UEFI通过的服务,将计算机系统资源逐渐转移到自己手中,这个过程为TSL(Transient System Load).
当OS Loader完全掌握了计算机系统资源时,BS也就完成了它的使命。OS Loader调用ExitBootServices()结束BS并回收BS占用的资源,之后计算机系统进入UEFI Runtime阶段。
在Runtime阶段只有运行时服务继续为OS提供,BS已经从计算不及系统中销毁。
在TSL阶段,系统资源通过BS管理,BS提供的服务如下。
1.事件服务: 事件是异步操作的基础,有了事件的支持,才可以在UEFI系统内执行并发操作。
2.内存管理:主要提供内存的分配与释放服务,管理系统内存映射。
3.Protocol管理:提供了安装Protocol与卸载Protocol的服务,以及注册Protocol通知函数(该函数在Protocol安装时候调用)的服务。
4.Protocol使用类服务:包括Protocol的打开与关闭,查找支持protocol的控制器,例如要读写某个PCI设备读的寄存器,可以通过OpenProtocol服务打开这个设备上从PciIoProtocol,用PciIo->Io.Read()服务可以读取这个设备上的寄存器。
5.驱动管理:包括用于将驱动安装到控制器connect服务,以及将驱动从控制器上卸载的disconnect服务。例如,启动时,如果我们需要网络支持,则可以通过loadImage将驱动加载带内存,然后通过connect服务将驱动安装带设备。
6.Image管理:此类服务包括加载,卸载,启动和退出UEFI应用程序或驱动
7.ExitBootServices:用于结束启动服务。
RT提供的服务主要包括如下几个方面
1.时间服务:服务/设定时间。读取/设定系统从睡眠中唤醒的时间
2.读写UEFI系统变量:读取/设定系统变量。例如BootOrder用于指定启动项顺序,通过这些系统变量可以保存系统配置。
3.虚拟内存服务:将物理地址转换为虚拟地址。
4.其他服务:包括重启系统RestSystem,获取系统提供的下一个单调单增值等。