UEFI原理与编程实践-PROTOCOL
搭建EDK編譯環境由于家里頭的電腦罷工,只能貼代碼,實踐的話可自行實踐
?
什么是protocol?
不想說的那么復雜,什么是protocol,它就是個結構體,只是這個結構體中的成員有的比較復雜而已,看一個:
?瞅一下,EFI_BLOCK_IO_PROTOCOL就是個結構體,看一下這一句:
?看我函數指針的筆記就能清楚理解,EFI_BLOCK_IO_PROTOCOL結構體中什么EFI_BLOCK_RESET/READ這些就是函數指針,它的函數第一參數必須是指向Protocol的指針,用來模擬this指針,好,看一下:
?typedef EFI_STATUS(EFIAPI *EFI_BLOCK_READ)(arg...);這不就是函數指針?看下它的第一個參數,是不是上面說的呢?
所以什么是protocol,中文叫協議,實際就是一個結構體,這個結構體里面有很多工具或者重要的數據,有需要就拿來用就行,protocol在哪呢
EFI_HANDLE
理解這一段話,對設備驅動的加載有一個認識基礎?,然后再重點理解這一段:
?在本節中,咱們需要創建我們自己的protocol,并且使用它,在實踐中進行理解
創建protocol
一般做項目每家公司都會有自己的一個PKG,那么這個自己創建的protocol就可以放在這個PKG里面,在這個PKG里面找到dec文件,看到[Protocols]這一列表沒,咱們新建一個:
gCsdnGoodProtocolGuid = {0xf8dec080, 0x22a3, 0x4d51, {0x90, 0x1a, 0x81, 0x2a, 0xae, 0x79, 0x59, 0xf8}}創建好GUID后,找到include/protocol(放其他地方也行,但是為了規范),咱們再新建一個CsdnGood.h文件,內容如下:
#ifndef _CSDN_GOOD_ #define _CSDN_GOOD_ #include <Uefi.h>typedef struct _CSDN_GOOD_PROTOCOL CSDN_GOOD_PROTOCOL;extern EFI_GUID gCsdnGoodProtocolGuid;struct _CSDN_GOOD_PROTOCOL {UINT8 version;UINT8 number; };#endif?到時候你要調用,直接#include <protocol/CsdnGood.h>,這個protocol包含了兩個成員,一個version,一個是number,創建好了之后咱們就可以進行安裝
安裝Protocol
怎么安裝,第8章的開頭寫的很明白,在模塊入口函數進行安裝,啥是模塊化入口函數?
?上面的就是,函數名字可以不一樣,但是這個參數是一樣滴,具體看你的ENTRY_POINT怎么寫的了
直接上需要的代碼:
#include <protocol/CsdnGood.h>EFI_STATUS EFIAPI UefiMain (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable) { CSDN_GOOD_PROTOCOL mCsdnGoodProtocol;mCsdnGoodProtocol.version = 0;mCsdnGoodProtocol.number =1;Status = gBS->InstallProtocolInterface(&ImageHandle,&gCsdnGoodProtocolGuid,EFI_NATIVE_INTERFACE,&mCsdnGoodProtocol);ASSERT_EFI_ERROR (Status);}?代碼中咱們初始化了成員的值,后面的你可以自己修改,當然放哪個入口函數自己看放哪合適就行。
安裝完了,咱們就可以使用了,怎么使用呢
使用protocol
使用需要明白一點,肯定是在你安裝之后,別安裝的代碼都還沒跑,你就用上了,這種能不能編譯通過還是個問號
?第三步可用可不用
?
?反正一通看完發現使用LocateProtocol最簡單方便,那就經常使用它打開protocol了
#include <protocol/CsdnGood.h>CSDN_GOOD_PROTOCOL *gCsdnGoodProtocol;Status = gBS->LocateProtocol (&gCsdnGoodProtocolGuid, NULL, (VOID **) &gCsdnGoodProtocol);if (!EFI_ERROR (Status)){if(gCsdnGoodProtocol != NULL){gCsdnGoodProtocol->version = 1;}}?ok,Protocol的創建和使用就說到這里,使用protocol記得inf文件添加相應的內容即可,怎么去傳值啥的相信看完這些也能輕易理解
總結
以上是生活随笔為你收集整理的UEFI原理与编程实践-PROTOCOL的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 8产权界定_保护与限制
 - 下一篇: android串口调试源码,androi