转自:http://blog.yam.com/wttmama/article/33768917
這是一個本來看不懂的東東
後來去追了裡面的 code 。m,真的很特別,但~我要強調,它不能讓你瞭解BIOS
但可以讓你對 程式更有 sense 。
要看懂 InstallProtocolInterface 這個 function ,說真的,順便讓我學會了幾樣東西。
在這之前必須先知道 link List 。
這是 EDK 裡面常用的 資料結構。
再來,如果你瞭解之前 Pei Phase 的 Ppi 的話,那會理解的更快,因為 Ppi 感覺上,是 Protocol 的精簡版
在 InstallProtocol 的過程中,會產生三個 Entry
IHandle : 代表 某個 Handle
Protocol Entry : 可以想像成是 Guid 加強版
IHandle 其實就是前面一直提到的 Handle 。
Protocol Entry 可以想像成是之前 PPI 中的 GUID 加強版( GUID 被包起來了 )=
而 Protocol Interface 是關聯 IHandle , Protocol Entry, 並擁有 Interface。
1. 透過 Handle 連至 IHandle
2. 透過 Protocol 連至 Protocol Entry
這是很直覺的使用法
但實際上在 Install一個 Protocol 時,會多出以下的管理結構
產生的新的 Protocol Entry 會被加到 mProtocolDatabase中。
為什麼呢?
因為在 Locate 的時候,其實是透過 gHandleList 及 mProtocolDatabase 進行查詢的。
這後續會提到,但要先知道這個概念。
而實際上透過它們進行查詢,則還是需要相當的資訊。
看下圖
Protocol Entry 透過 AllEntries 與 mProtocolDatabase 做連結。
IHandle 透過 AllHandles 與 gHandleList 做連結。
像 LocateProtocol 其實就是在查詢的時候,
透過 mProtocolDatabase 找到 需要的 Protocol ( GUID )
再透過 Protocol Entry 的 Protocols 參考至 Protocol Interface 的 byProtocol。
並取得 Interface 。
而更複雜而更接近真實使用的結構則是如下圖
一個 gProtocolDatabase 也可以透過 AllEntries 串多個 Protocols
而查詢查念就如中間的連結進行查詢。
所以,用一張圖表示 LocateProtocolInterface 。
對 mProtocolDatabase 查合適的 Protocol ( GUID ),並透過 Protocols 連至 Protocol Interface
取得 Interface。( 當然還有一些檢查,就省略了 )
下圖是針對 LocateHandle 的
若代入的參數是 ByProtocol 的話,就從 mProtocolDatabase 。
m..... 一段落了。
其實, source code 裡面還包含了很多檢查的東西,但我只描述基本的精神。
剩下的就描述一些特別的東東
1. Handle 代 null 那就會自己產生新的。
2. 同一個 Handle 下不可以掛同個 Protocol 的 Interface (沒意義,會找到先找到那個 )
3. 同一個 Protocol 可以掛到不同的 Handle 下。( 自己畫畫圖囉!)
4. 新版本 spec 建議使用 InstallMultipleProtocolInterfaces 。( 基於一個 Handle 掛多組 Protocol )
唔,熊熊想不到更多的了,暫時是這樣子。