2010年6月23日 星期三

EFI Image 初探

左邊就是 EFI Image 分類和依存關係表,spec 上有,可是很多人選擇跳過,這邊就自己了解,獻一下醜。

Image 分兩大類:applicationdriver









Application 就沒什麼懸念,只要 return 個值或是去呼叫  
BS->Exit()
即自動 unload。 Application 中的異類是  OS Loader,它的運作機制比較奇特,不 return 也不 exit,它會去叫
gBS->ExitBootServices()
將控制權從 EFI 轉到 OS,從此 EFI 任務即算完成,接下來 EFI 就從事潛伏等待 OS 呼叫的功能。不過基本上它們兩個執行完後會從記憶體中載出。

Driver 大體上分為 Non Driver-Model Driver Driver-Model Driver 兩種。如果就工作階段的不同,分為 Boot Service Driver 和 Runtime Driver 兩種,這兩者的差異請自己看 spec,最大的差別就是存活期限。

Driver 和 Application 有個最大的差異,就是 Application 只要回傳 EFI_SUCCESS 就能 unload,而 Driver 剛好相反,後面會有利用這種特性的 Driver。

Non Driver-Model Driver 以下介紹:

Service Driver: 故名思義,提供服務 (一個或以上的 protocol 或是 handle),實作完回傳 EFI_SUCCESS 常駐進記憶體等待呼叫。

Initializing Driver: 它不出 protocol 也不出 handle,單純做初始化動作,做完故意 return Error Code 強迫自己退出記憶體。

Root Bridge Driver: 這類型的 driver 專門建立實體 controller handle,每個 controller handle 又有包 Device Path Protocol,Chipset 產生的 root bus I/O 硬體抽象化的 protocol 也是包在這 driver 裡面。較常見的為 PCI_ROOT_BRIDGE_IO_PROTOCOL。

EFI 1.02 Driver:  其餘非 Driver-Model Driver 的統稱 EFI 1.02 Driver。這類型 Driver 和 Driver-Model Driver 最大的不同處,就是在它 Entry Point 直接就做 Start 了。這種行為代表著它一載入,所有硬體所有 protocol 都必須處理好,挫著等它下手做另外的事,沒有延後呼叫的可能性



Driver-Model Driver 以下介紹:

EFI Driver-Model Driver: 任何遵循 EFI 1.10 spec 製作的 driver 都是 Driver-Model Driver。它和上述 Non Driver-Model Driver 最決定性的差別,就是在它的進入點,絕不會去碰硬體或是produce 跟硬體有關的任何服務。它會去包一個 Driver Binding Protocol,在進入點只做 Support、Start、Stop 這三種動作,而不像 Non Driver-Model Driver 一進入就直接 Start。這樣有個好處,可以等到條件符合再執行。

Device Driver: 這類型的 driver 就是藉由 Driver Binding Protocol produce 一個或以上的  driver handle (或 driver image handle) 進 handle database。它的特性是在
EFI_DRIVER_BINDING_PROTOCOL.Start ()
呼叫的時候,不會去生成 child handle,只會在目前系統裡有的 controller handle 上裝 I/O protocol。

Bus Driver: 它和 Device Driver 行為模式一樣,兩者差別只在
EFI_DRIVER_BINDING_PROTOCOL.Start () 
呼叫的時候,它會生成 child handle 然後把 I/O protocol 附加在這些新創的 handle 上面。

Hybrid Driver: 和上述兩者行為模式一模一樣,一樣是在
EFI_DRIVER_BINDING_PROTOCOL.Start ()
呼叫的時候,它不但會生成 child handle,同時會把 I/O protocol 裝在 child handle 和既有的 handle 上。

沒有留言:

張貼留言