3.UEFI中的Protocol

1.UEFI中的Protocol引入了面向?qū)ο蟮乃枷耄?/b>

--用struct來(lái)模擬class

--用函數(shù)指針(Protocol的成員變量)模擬成員函數(shù),此種函數(shù)的第一個(gè)參數(shù)必須指向Protocol的指針,用來(lái)模擬this。

(通常,計(jì)算機(jī)中有很多的塊設(shè)備,每個(gè)塊設(shè)備都有一個(gè)EFI_BLOCK_IO_PROTOCOL的實(shí)例,This指針就是指向這個(gè)實(shí)例,用于告訴成員函數(shù)我們正在操作哪個(gè)設(shè)備。This指針是Protocol成員函數(shù)的一個(gè)重要特征。)

2.Protocol在UEFI內(nèi)核中的表示:

使用Protocol之前,我們需要知道Protocol位于什么地方。首先,我們要來(lái)認(rèn)識(shí)一下EFI_HANDLE

typedef VOID * EFI_HANDLE;

EFI_HANDLE是指向某種對(duì)象的指針,UEFI用它來(lái)指向某個(gè)對(duì)象。UEFI掃描總線(xiàn)后,會(huì)為總線(xiàn)上的每個(gè)設(shè)備創(chuàng)立一個(gè)Controller對(duì)象,用于控制設(shè)備,所有該設(shè)備的驅(qū)動(dòng)以protocol的形式安裝到這個(gè)Controller中,這個(gè)Controller就是一個(gè)EFI_HANDLE對(duì)象。當(dāng)我們將一個(gè).efi文件加載到內(nèi)存中時(shí),UEFI也會(huì)為該文件創(chuàng)建一個(gè)image對(duì)象。在UEFI內(nèi)部,EFI_HANDLE被理解為IHANDLE,IHANDLE的數(shù)據(jù)結(jié)構(gòu)代碼如下所示:

typedef struct{

UINTN Signature;//表明Handle的類(lèi)別

LIST_ENTRY AllHandles;//所有Handle組成的鏈表

LIST_ENTRY Protocols;//此Handle的Protocols鏈表

UINTN LocateRequest;

UINT64 Key;

}IHANDLE;

每個(gè)IHANDLE都有一個(gè)protocols鏈表(雙向鏈表),存放屬于自己的protocol。所有的IHANDLE通過(guò)AllHandles連接起來(lái)。

3.如何使用protocol

Boot Services提供了對(duì)Protocol進(jìn)行操作的services,如OpenProtocol()、HandleProtocol()、LocateProtocol()三種服務(wù)用于找出指定的protocol:OpenProtocol()用于打開(kāi)指定句柄上的Protocol;HandleProtocol()是OpenProtocol()的簡(jiǎn)化版;LocateProtocol()用于找出指定protocol在系統(tǒng)中的第一個(gè)實(shí)例。使用完P(guān)rotocol后還要通過(guò)CloseProtocol()關(guān)閉打開(kāi)的protocol,否則可能造成內(nèi)存泄露,由于HandleProtocol和OpenProtocol沒(méi)有指定AgentHandle,所以無(wú)法關(guān)閉,如果一定要關(guān)閉,需要調(diào)用OpenProtocolInformation()獲得AgentHandle和ControllerHandle,然后關(guān)閉它。

除了打開(kāi)和關(guān)閉protocol,有時(shí)候還有能找出支持某個(gè)Protocol的所有設(shè)備。例如要找出支持BlockIos的所有設(shè)備(即找出所有塊設(shè)備),這時(shí)候就要使用LocateHandleBuffer()服務(wù);如果想知道某個(gè)Protocol被哪些設(shè)備打開(kāi)了,那么可以使用OpenProtocolInformation()服務(wù);ProtocolPerHandle()用于獲得指定設(shè)備所支持的所有Protocol。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,598評(píng)論 0 6
  • 從我們按下開(kāi)機(jī)鍵到進(jìn)入到操作系統(tǒng)之前的系統(tǒng)初始化動(dòng)作,即是BIOS run的過(guò)程。如今操作系統(tǒng)已經(jīng)從枯燥的文本時(shí)代...
    NickHe閱讀 4,458評(píng)論 0 10
  • SEC--PEI--DXE--BDS 【SEC階段】 1.SEC的功能: SEC階段是平臺(tái)初始化的第一個(gè)階段,計(jì)算...
    NickHe閱讀 11,365評(píng)論 1 10
  • 理論部分 鏡像 一、鏡像的百科定義 1、維基百科 ISO映像是一種光盤(pán)的存檔文件(英語(yǔ):archive file)...
    幻影翔閱讀 2,118評(píng)論 4 3
  • 原本以為畫(huà)正方體很容易,但在纏繞畫(huà)的第二堂素描課里,發(fā)現(xiàn)以前畫(huà)的那么多正方體竟然都是錯(cuò)的,至少在素描領(lǐng)域是錯(cuò)的。實(shí)...
    好吃的芒果飯閱讀 900評(píng)論 0 0

友情鏈接更多精彩內(nèi)容