EFI基本概念之Event

2021-07-10 08:05:58 字數 3447 閱讀 7180

1

基本概念及函式

最近在幫公司弄乙個alpha架構的efi bios,在調dxe_core的時候,發現必須要裝幾個cpu架構相關的協議。如果這幾個協議不去安裝,**就不會執行bds階段。**偵測協議有沒有安裝,是通過coreregisterprotocolnotify()函式實現的,這個函式在未安裝協議之前,便先建立protocol_entry變數,然後將其鏈結到mprotocoldatabase鍊錶中,並將已經有的event鏈結到自己的notify鍊錶中。等到**真正安裝protocol例項後,這個event便會被呼叫,**有event notifyfunction中便知道某個cpu架構類協議有沒有建立起來。開始時**中沒加裝載這幾個協議的驅動,所以**跑不到bds階段,只是列印出架構協議未安裝的除錯資訊。這個設計很巧妙,也展現了efievent強大的一角。

新聞聯播上總是說,北京時間xx點,發生了xx事件。這句話有兩個重點,時間和事情。efi的event同樣也有這兩個特性:一,event是個可發生(執行)的函式;二,event需要在某個時間點發生。在efi裡,實現第乙個特性是用createevent()或createeventex(),實現第二個特性需要使用signalevent()。event除了這幾個函式外,也包括關閉事件函式closeevent(),等待事件函式waitforevent(),檢查事件函式checkevent()。下面分別介紹一下他們的基本用法。

1.1

建立事件

efi_status

efiapi

corecreateevent (

in uint32                   type,

in efi_tpl                  notifytpl,

inefi_event_notify         notifyfunction,optional

in void                     *notifycontext, optional

outefi_event               *event

)這個函式建立了乙個type類別的,notifytpl級別的,擁有notifyfunction函式的event事件。notifyfunction是可選的,如果notifytpl擁有evt_notify_signal或evt_notify_wait級別,則其作為有效引數被使用。

efi_status

efiapi

corecreateeventex (

in uint32                   type,

in efi_tpl                  notifytpl,

inefi_event_notify         notifyfunction,optional

in constvoid               *notifycontext,optional

in constefi_guid           *eventgroup,    optional

outefi_event               *event

)此函式比createevent()多了乙個eventgroup函式,與createevent創造的事件不同的是,bootservcies函式無法單獨觸發。

1.2

銷毀事件

efi_status

efiapi

corecloseevent (

in efi_event    userevent

)此函式將userevent銷毀,從鍊錶中摘除,並釋放占有的記憶體空間。

1.3

觸發事件

efi_status

efiapi

coresignalevent (

in efi_event    userevent

)觸發userevent事件。

1.4

等待事件

efi_status

efiapi

corewaitforevent (

in uintn        numberofevents,

in efi_event    *userevents,

out uintn       *userindex

)此函式停止當前的任務,等待numberofevents個事件發生,若其中乙個事件發生,則退出並反饋給使用者這個資訊:第userindex個事件發生了。

1.5

檢查事件

efi_status

efiapi

corecheckevent (

in efi_event        userevent

)此函式檢查userevent的現在狀態。

1.6

其它事件相關函式

1.6.1 coresettimer()

為timer事件設定型別和觸發時間,timer那一章介紹過了,此處略過。

1.6.2 coreraisetpl ()

為當前任務公升權。

1.6.3 corerestoretpl ()

恢復任務許可權級別,所有event級別比新的任務許可權級別高的,都會得到執行。

2 event

相關結構

2.1 event真身

typedef struct ievent;

createevent()函式最後乙個引數是輸出引數event,它的真身就是ievent結構體。其它輸入引數,都被賦於了這個結構體的成員。

2.2 geficurrenttpl

當前任務級別。可以將其看為legacy bios中的當前中斷優先順序。

2.3 geventqueue 。

event事件被signalevent()後,便會將其塞入到geventqueue[event-> notifytpl]

煉表裡。當corerestoretpl()函式執行時,如果event-> notifytpl

大於恢復後的任務許可權級別,geventqueue [event->

notifytpl]

所鏈結的所有event都會被執行,執行完後,event從geventqueue [event-> notifytpl]

中移除。

2.4 geventpending

該全域性變數為一指示型變數。其每一位指示geventqueue的每乙個元素是否鏈結有相應的event,若有則為1,沒有值為0。因其型別為uintn,但是gevent的元素有32個。所以如果某一型別cpu的資料寬度小於32位,我們要強制將其型別設為大於或等於32位的。

2.5 geventsignalqueue

這是乙個雙向鍊錶。當我們創造乙個event時,要將event鏈入該鍊錶中。當closeevent()時,從該鍊錶中移除。

2.6 meventtable

有效的event型別。event型別不在此陣列元素內,建立event時不會成功。

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

WF之基本概念

本文知識點 工作流的基本概念 wf的概念及特點 wf工作流的型別及特點 wf工作流的建立模式及特點 wf的架構 什麼是工作流?工作流,是對工作流程及其各操作步驟之間業務規則的抽象 概括 描述。wf是什麼?它有什麼特點?wf的全稱是windows workflow foundation,它是微軟在.n...

Storm系列之 基本概念

寫在前面的話 請允許我廢話幾句。這個系列的文章發布的時間是在我完成了storm的專案開發之後才找出來時間寫的,在研究storm過程中,國內較好的參考文章實在有限,大多是入門和概念剖析。storm的googlegroup對於新手來說實在不友好。有經驗人士都不願意回答新手的一些 愚蠢 的問題。現在因為s...