[轉] 06_DXE_InstallProtocolInterface

出處:http://blog.yam.com/wttmama/article/33768917

這是一個本來看不懂的東東
後來去追了裡面的 code 。
m,真的很特別,但~我要強調,它不能讓你瞭解BIOS 
但可以讓你對 程式更有 sense 。

要看懂 InstallProtocolInterface 這個 function ,說真的,順便讓我學會了幾樣東西。


在這之前必須先知道 link List 。
這是 EDK 裡面常用的 資料結構。


再來,如果你瞭解之前 Pei Phase 的 Ppi 的話,那會理解的更快,因為 Ppi 感覺上,是 Protocol 的精簡版


在 InstallProtocol 的過程中,會產生三個 Entry 

Protocol Interface : 連接 IHandle 及 Protocol Entry , 及 Interface ( 內含結構 Function  )
IHandle : 代表 某個 Handle
Protocol Entry : 可以想像成是 Guid 加強版


IHandle 其實就是前面一直提到的 Handle 。
Protocol Entry 可以想像成是之前 PPI 中的 GUID 加強版( GUID 被包起來了 )=
而 Protocol Interface 是關聯 IHandle , Protocol Entry, 並擁有 Interface。

透過圖可以知道, Protocol Interface  可以
1. 透過 Handle 連至 IHandle
2. 透過 Protocol 連至 Protocol Entry 
這是很直覺的使用法


但實際上在 Install一個 Protocol 時,會多出以下的管理結構

實際上在 InstallProtocol 時,產生新的 Handle 會被加到 gHandleList中
產生的新的 Protocol Entry 會被加到 mProtocolDatabase中。
為什麼呢?
因為在 Locate 的時候,其實是透過 gHandleList 及 mProtocolDatabase 進行查詢的。
這後續會提到,但要先知道這個概念。


而實際上透過它們進行查詢,則還是需要相當的資訊。
看下圖

這是完整的連結。
Protocol Entry 透過 AllEntries 與 mProtocolDatabase 做連結。
IHandle 透過 AllHandles 與 gHandleList  做連結。


像 LocateProtocol 其實就是在查詢的時候,
透過 mProtocolDatabase 找到 需要的 Protocol ( GUID )
再透過 Protocol Entry 的 Protocols 參考至 Protocol Interface 的 byProtocol。
並取得 Interface 。


而更複雜而更接近真實使用的結構則是如下圖

一個 gHandleList 可以透過 AllHandles串多個 IHandle。
一個 gProtocolDatabase 也可以透過 AllEntries 串多個 Protocols


而查詢查念就如中間的連結進行查詢。


所以,用一張圖表示 LocateProtocolInterface 。



對 mProtocolDatabase 查合適的 Protocol ( GUID ),並透過 Protocols 連至 Protocol Interface
取得 Interface。( 當然還有一些檢查,就省略了 )


下圖是針對 LocateHandle 的

若代入的參數是 AllHandles 就會從 gHandleList 全挖出來
若代入的參數是 ByProtocol 的話,就從 mProtocolDatabase 。






m….. 一段落了。
其實, source code 裡面還包含了很多檢查的東西,但我只描述基本的精神。


剩下的就描述一些特別的東東


1. Handle 代 null 那就會自己產生新的。
2. 同一個 Handle 下不可以掛同個 Protocol 的 Interface (沒意義,會找到先找到那個 )
3. 同一個 Protocol 可以掛到不同的 Handle 下。( 自己畫畫圖囉!)
4. 新版本 spec 建議使用 InstallMultipleProtocolInterfaces 。( 基於一個 Handle 掛多組 Protocol )


唔,熊熊想不到更多的了,暫時是這樣子。

未經允許不得轉載:GoMCU » [轉] 06_DXE_InstallProtocolInterface