2019年3月30日 星期六

Beyond BIOS Note - CH2 Basic UEFI Architecture


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
    會負責安裝PCI I/O Protocol在不同的Device Handle上,這些instance 包含PCI
    Device獨有的數值,像是Option ROM的位置及Size。

  • Tag GUID
  • Protocol可以不包含任何東西,僅用Protcol GUID作識別用,可以方便系統找到特定的Handle。

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

  1. gBS->LoadImage()
  2. gBS->LoadImage() 的流程
    1. Allocate image所要被加載的記憶體位置
    2. Relocation fix-up
    3. 在Handle database建立一個image handle,並且安裝
      EFI_LOADED_IMAGE_PROTOCOL 的Instance。

  3. 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時所執
    行的function。

  • Notification context
  • 傳入Notification function的參數。

  • Task Priority Level(TPL)
  • Notification function的優先執行順序(priority)
    • TPL_APPLICATION
    • TPL_CALLBACK
    • TPL_NOTIFY
    • TPL_HIGH_LEVEL
    當多個event都在signaled stated時,會依TPL來執行notification function。而TPL 較高的event會中斷TPL較低的event。

    Driver在可以暫時提高TPL來避免其他的event衝出造成使用相同的data structure而衝突。


沒有留言:

張貼留言