Adding manpower to a late software project makes it later.
- Brook's Law
UEFI 提供兩種主要的 service來操作及控制系統資源:
- Boot Services
- Runtime Services
提供開機期間相關的系統服務,在 ExitBootServices()被呼叫之後就無法使用。
在 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
- UEFI Configuration Table
提供所有 Runtime Services的指標。
由 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的時候也可以保存資料。
VariableName及 VariableGuid 用來命名不同的 Variable。VariableName通常是人讀得懂的文字
,也不用擔心其重複,還有 VariableGuid可以用來分別。
有三個主要的 Attributes需要注意:
- Nonvoliatile
- BootService
- RuntimeService
在 System Reset之後 Variable依然可以保留。
代表只有在 ExitBootService()之前可以使用,之後的 GetVariable()及 GetNextVariable()都會無法找到。
有這個代表 BootService也要同時被設定, ExitBootServices()之後也能存取。
只有同時擁有 Nonvoliatile和 RuntimeService的 Variable可以在 ExitBootServices()之後使用 SetVariable()來寫入。而只有 RuntimeService的則是 read-only,原因是記憶體的控制權已經交 給了 OS。
Miscellaneous Services
- GetNextHighMonotonicCounter
- ResetSystem
- UpdateCapsule
- QueryCapsuleCapabilities
沒什麼想寫的,有想法再回來補充。
沒有留言:
張貼留言