06_DXE_InstallProtocolInterface
来源:互联网 发布:什么是java工厂模式 编辑:程序博客网 时间:2024/06/15 01:10
转自:http://blog.yam.com/wttmama/article/33768917
這是一個本來看不懂的東東
後來去追了裡面的 code 。m,真的很特別,但~我要強調,它不能讓你瞭解BIOS
但可以讓你對 程式更有 sense 。
要看懂 InstallProtocolInterface 這個 function ,說真的,順便讓我學會了幾樣東西。
在這之前必須先知道 link List 。
這是 EDK 裡面常用的 資料結構。
再來,如果你瞭解之前 Pei Phase 的 Ppi 的話,那會理解的更快,因為 Ppi 感覺上,是 Protocol 的精簡版
在 InstallProtocol 的過程中,會產生三個 Entry
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b1c69ee9eb.jpg)
IHandle : 代表 某個 Handle
Protocol Entry : 可以想像成是 Guid 加強版
IHandle 其實就是前面一直提到的 Handle 。
Protocol Entry 可以想像成是之前 PPI 中的 GUID 加強版( GUID 被包起來了 )=
而 Protocol Interface 是關聯 IHandle , Protocol Entry, 並擁有 Interface。
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b1e3925f54.jpg)
1. 透過 Handle 連至 IHandle
2. 透過 Protocol 連至 Protocol Entry
這是很直覺的使用法
但實際上在 Install一個 Protocol 時,會多出以下的管理結構
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b1f01a181f.jpg)
產生的新的 Protocol Entry 會被加到 mProtocolDatabase中。
為什麼呢?
因為在 Locate 的時候,其實是透過 gHandleList 及 mProtocolDatabase 進行查詢的。
這後續會提到,但要先知道這個概念。
而實際上透過它們進行查詢,則還是需要相當的資訊。
看下圖
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b209b7d527.jpg)
Protocol Entry 透過 AllEntries 與 mProtocolDatabase 做連結。
IHandle 透過 AllHandles 與 gHandleList 做連結。
像 LocateProtocol 其實就是在查詢的時候,
透過 mProtocolDatabase 找到 需要的 Protocol ( GUID )
再透過 Protocol Entry 的 Protocols 參考至 Protocol Interface 的 byProtocol。
並取得 Interface 。
而更複雜而更接近真實使用的結構則是如下圖
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b22203a1d8.jpg)
一個 gProtocolDatabase 也可以透過 AllEntries 串多個 Protocols
而查詢查念就如中間的連結進行查詢。
所以,用一張圖表示 LocateProtocolInterface 。
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b23888c36b.jpg)
對 mProtocolDatabase 查合適的 Protocol ( GUID ),並透過 Protocols 連至 Protocol Interface
取得 Interface。( 當然還有一些檢查,就省略了 )
下圖是針對 LocateHandle 的
![](http://pics9.yamedia.tw/29/userfile/w/wttmama/blog/14d1b23c8aeab8.jpg)
若代入的參數是 ByProtocol 的話,就從 mProtocolDatabase 。
m..... 一段落了。
其實, source code 裡面還包含了很多檢查的東西,但我只描述基本的精神。
剩下的就描述一些特別的東東
1. Handle 代 null 那就會自己產生新的。
2. 同一個 Handle 下不可以掛同個 Protocol 的 Interface (沒意義,會找到先找到那個 )
3. 同一個 Protocol 可以掛到不同的 Handle 下。( 自己畫畫圖囉!)
4. 新版本 spec 建議使用 InstallMultipleProtocolInterfaces 。( 基於一個 Handle 掛多組 Protocol )
唔,熊熊想不到更多的了,暫時是這樣子。
- 06_DXE_InstallProtocolInterface
- 06
- 06
- 06
- 06
- 06 ???
- 06-06-06
- 06-06-06
- 2011-06-06 21:06:06
- 2005-06-06工作计划
- 06/02/06
- 06/03/06
- 06/06/01
- 06/06/08
- 06/06/14
- 06/06/15
- 06/06/21
- 預覽Solaris 06/06
- C#判断操作系统类型总结
- Solaris 网络安装 操作系统
- 用Java实现FTP批量大文件上传下载
- 实现类似手机QQ的可折叠固定标题列表
- architecture of kernel
- 06_DXE_InstallProtocolInterface
- 提供Magento上一个和下一个产品的简单帮助(Helper)类
- 今天学了个定时执行任务
- jrtplib学习
- 07_Events
- DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
- 在struts中使用checkbox实现批量删除
- 量子编程详解之一: QP-nano代码大餐之状态机函数详细注释
- “Visual C++范例大全”详细目录