I believe in standards. Everyone should have one.
- George Morrow
UEFI System table
- UEFI Boot Services
- UEFI Runtime Services
- Protocol Services
Handle Database
由Handle 與Protocol 組成,Handle 是Protocol 的集合,而Protocol 則是以GUID 識別的資料結構,用來提供系統的資訊及服務。
在UEFI系統初始階段,由UEFI Driver 建立Handle 並且安裝一個或多個Protocol 在其上,而
這些Handle會被記錄在由系統韌體所管理的Handle database 中。
Protocol
- Driver 在系統初始階段會根據系統的需求來建立相關的Protocol。
- Protocol 以GUID 為識別,為包含function pointer 與data 的結構。
- Working with Protocols Handle database 在ExitBootServices() 之後就無法使用。
- Multiple Protocol Instances Driver 會安裝特定Protocol 的多個instance在不同的handle 上。例如PCI bus driver
- Tag GUID Protocol可以不包含任何東西,僅用Protcol GUID作識別用,可以方便系統找到特定的Handle。
會負責安裝PCI I/O Protocol在不同的Device Handle上,這些instance 包含PCI
Device獨有的數值,像是Option ROM的位置及Size。
UEFI Images
UEFI image by processor type
- UEFI applications 在Application exit之後,image其使用的記憶體將會被系統回收。
- UEFI Boot Service drivers 在ExitBootServices ()之後,image其使用的記憶體將會被系統回收。
- UEFI Runtime drivers 在ExitBootServices ()之後依然存在,可以被UEFI OS執行。
Start an UEFI image
- gBS->LoadImage() gBS->LoadImage() 的流程
- Allocate image所要被加載的記憶體位置
- Relocation fix-up
- 在Handle database建立一個image handle,並且安裝
EFI_LOADED_IMAGE_PROTOCOL 的Instance。 - gBS->StartImage()
Image entry point
Image 的entry point會接收到兩個參數- Image 所在的Hangle 讓 Image能知道從哪裡被加載及加載後的記憶體位置。
- 指向 UEFI System Table的指標 讓Image 可以調用UEFI 系統服務。
OS Loader
在OS Kernel取得控制權之前,由OS Loader負責去呼叫ExitBootServices()。Event and Task Priority Levels
一個Event可以被create或者destroy,且只能是signaled state或waitiing state其中一種狀態。最常見的應用是讓UEFI driver使用timer event來輪詢(polling)需要服務的device。
Elements associated with Event
- Notification function Wait Event在waited upon及Signal event從waiting state變成signaled state時所執
- Notification context 傳入Notification function的參數。
- Task Priority Level(TPL) Notification function的優先執行順序(priority)
- TPL_APPLICATION
- TPL_CALLBACK
- TPL_NOTIFY
- TPL_HIGH_LEVEL
行的function。
Driver在可以暫時提高TPL來避免其他的event衝出造成使用相同的data structure而衝突。
沒有留言:
張貼留言