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...