EFI System Table 里面有两个Services:Runtime Services和Boot Services,其中Runtime Services 是在UEFI 兼容系统上面几乎全时可用的Services,区别于Boot Services只能在EFI_BOOT_SERVICES.ExitBootServices()之前可用的特性。Runtime Services提供了几组有限的Services:Variable Services;Time Services;Virtual Memory Services;Miscellaneous Runtime Services。

Variable Services提供了用于读写Variable的函数,具体用法比较简单,所以就不再提了。我们只看一下这些Services是怎么运作的好了。在VariableServiceInitialize这个函数里面有下面的定义:

SystemTable->RuntimeServices->GetVariable = VariableServiceGetVariable;
SystemTable->RuntimeServices->GetNextVariableName = VariableServiceGetNextVariableName;
SystemTable->RuntimeServices->SetVariable = VariableServiceSetVariable;
SystemTable->RuntimeServices->QueryVariableInfo = VariableServiceQueryVariableInfo;
可以看出来GetVariable和SetVariable的instance是在函数VariableServiceInitialize里面定义的。EDK默认是从0: Volatile, 1: HOB, 2: Non-Volatile.这几个区域里面搜索。当然,根据平台或者其他原因的要求,也可以在后面用自己的instance去override VariableServiceInitialize里面的定义。

Time Services的功能就比较单一,提供了GetTime()/SetTime()/GetWakeupTime()/SetWakeupTime()这四个Services。它们的Instance如下:

gRT->GetTime = PcRtcEfiGetTime;
gRT->SetTime = PcRtcEfiSetTime;
gRT->GetWakeupTime = PcRtcEfiGetWakeupTime;
gRT->SetWakeupTime = PcRtcEfiSetWakeupTime;
看一下Code就知道,这几个函数只是在操作CMOS的几个RTC 寄存器而已,所以实际中用处不是太大。或许我们可以自己加一个外部定时器,可以取代CMOS的RTC,这样或者这四个Services更加有意义一点。

Virtual Memory Services这个提供下面两个Service,可以看出是给OS loader使用的,具体用法我们稍后研究:
Miscellaneous Runtime Services里面是一些其他Services,后面用到的话再一一介绍。