日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UEFI原理与编程实践-PROTOCOL

發(fā)布時間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UEFI原理与编程实践-PROTOCOL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

搭建EDK編譯環(huán)境由于家里頭的電腦罷工,只能貼代碼,實踐的話可自行實踐

?

什么是protocol?

不想說的那么復(fù)雜,什么是protocol,它就是個結(jié)構(gòu)體,只是這個結(jié)構(gòu)體中的成員有的比較復(fù)雜而已,看一個:

?瞅一下,EFI_BLOCK_IO_PROTOCOL就是個結(jié)構(gòu)體,看一下這一句:

?看我函數(shù)指針的筆記就能清楚理解,EFI_BLOCK_IO_PROTOCOL結(jié)構(gòu)體中什么EFI_BLOCK_RESET/READ這些就是函數(shù)指針,它的函數(shù)第一參數(shù)必須是指向Protocol的指針,用來模擬this指針,好,看一下:

?typedef EFI_STATUS(EFIAPI *EFI_BLOCK_READ)(arg...);這不就是函數(shù)指針?看下它的第一個參數(shù),是不是上面說的呢?

所以什么是protocol,中文叫協(xié)議,實際就是一個結(jié)構(gòu)體,這個結(jié)構(gòu)體里面有很多工具或者重要的數(shù)據(jù),有需要就拿來用就行,protocol在哪呢

EFI_HANDLE

理解這一段話,對設(shè)備驅(qū)動的加載有一個認識基礎(chǔ)?,然后再重點理解這一段:

?在本節(jié)中,咱們需要創(chuàng)建我們自己的protocol,并且使用它,在實踐中進行理解

創(chuàng)建protocol

一般做項目每家公司都會有自己的一個PKG,那么這個自己創(chuàng)建的protocol就可以放在這個PKG里面,在這個PKG里面找到dec文件,看到[Protocols]這一列表沒,咱們新建一個:

gCsdnGoodProtocolGuid = {0xf8dec080, 0x22a3, 0x4d51, {0x90, 0x1a, 0x81, 0x2a, 0xae, 0x79, 0x59, 0xf8}}

創(chuàng)建好GUID后,找到include/protocol(放其他地方也行,但是為了規(guī)范),咱們再新建一個CsdnGood.h文件,內(nèi)容如下:

#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

?到時候你要調(diào)用,直接#include <protocol/CsdnGood.h>,這個protocol包含了兩個成員,一個version,一個是number,創(chuàng)建好了之后咱們就可以進行安裝

安裝Protocol

怎么安裝,第8章的開頭寫的很明白,在模塊入口函數(shù)進行安裝,啥是模塊化入口函數(shù)?

?上面的就是,函數(shù)名字可以不一樣,但是這個參數(shù)是一樣滴,具體看你的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);}

?代碼中咱們初始化了成員的值,后面的你可以自己修改,當(dāng)然放哪個入口函數(shù)自己看放哪合適就行。

安裝完了,咱們就可以使用了,怎么使用呢

使用protocol

使用需要明白一點,肯定是在你安裝之后,別安裝的代碼都還沒跑,你就用上了,這種能不能編譯通過還是個問號

?第三步可用可不用

?

?反正一通看完發(fā)現(xiàn)使用LocateProtocol最簡單方便,那就經(jīng)常使用它打開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的創(chuàng)建和使用就說到這里,使用protocol記得inf文件添加相應(yīng)的內(nèi)容即可,怎么去傳值啥的相信看完這些也能輕易理解

總結(jié)

以上是生活随笔為你收集整理的UEFI原理与编程实践-PROTOCOL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。