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