2022年7月21日 星期四

Beyond BIOS Note - CH5 UEFI Runtime


Adding manpower to a late software project makes it later.
- Brook's Law

UEFI 提供兩種主要的 service來操作及控制系統資源:

  • Boot Services
  • 提供開機期間相關的系統服務,在 ExitBootServices()被呼叫之後就無法使用。

  • Runtime Services
  • ExitBootServices()之後還可以使用,OS 需要其來完成一些系統資源的操作。


Memory Type

UEFI在 allocate記憶體的時候,會需要指定這段記憶體的 EFI_MEMORY_TYPE,來代表其使用目 的。EFI_MEMORY_TYPE也分成只在 ExitBootServices()前可以使用及在 ExitBootService ()後也 能使用。詳細 EFI_MEMORY_TYPE使用可參考 UEFI Specification。


EFI System Table

EFI System Table 中主要有兩個服務會在 Runtime使用:

  • Runtime Services Table
  • 提供所有 Runtime Services的指標。

  • UEFI Configuration Table
  • 由 GUID/Pointer 配對組成,可以是提供給系統的 function pointer、data或 table, 像是 SMBIOS及 ACPI table的 entry point。


Time Services

Runtime Services其中還有包含 Time Services的部分,讓 OS可以不用透過直接讀取硬體的方式 來取得系統的時間資訊。相關的 function有 GetTime()、SetTime()、GetWakeupTime()和 SetWakeupTime()。


Virtual Memory Services

ExitBootServices()之後,OS會透過 SetVirtualAddressMap()提供其虛擬記憶體的資訊 來將 Runtime Services從實體記憶體定址到虛擬記憶體。ConvertPointer()提供 UEFI的程式本身來轉 換虛擬記憶體。在 SetVirtualAddressMap()轉址前,會先執行註冊EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE的 Event。


Variable Services

Variable的主要作用在於 OS Loader與 firmware之間傳遞資料,對於不同的 platform可能有不同 的實作,但其要能在 reset的時候也可以保存資料。

VariableNameVariableGuid 用來命名不同的 Variable。VariableName通常是人讀得懂的文字 ,也不用擔心其重複,還有 VariableGuid可以用來分別。

有三個主要的 Attributes需要注意:

  • Nonvoliatile
  • 在 System Reset之後 Variable依然可以保留。

  • BootService
  • 代表只有在 ExitBootService()之前可以使用,之後的 GetVariable()及 GetNextVariable()都會無法找到。

  • RuntimeService
  • 有這個代表 BootService也要同時被設定, ExitBootServices()之後也能存取。

只有同時擁有 Nonvoliatile和 RuntimeService的 Variable可以在 ExitBootServices()之後使用 SetVariable()來寫入。而只有 RuntimeService的則是 read-only,原因是記憶體的控制權已經交 給了 OS。


Miscellaneous Services

  • GetNextHighMonotonicCounter
  • ResetSystem
  • UpdateCapsule
  • QueryCapsuleCapabilities

沒什麼想寫的,有想法再回來補充。


沒有留言:

張貼留言