在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。
在驅動裡生成的執行緒一般是系統執行緒。pscreatesystemthread 函式預設情況下建立的卻是乙個系統程序,它屬於程序名為system,pid=4。同時pscreatesystemthread 也可以建立使用者執行緒,這取決於它的第四個引數processhandle,如果它為空,則建立系統執行緒;如果它是乙個程序控制代碼,則建立的是屬於該指定程序的使用者執行緒。
第六個引數startroutine是新執行緒的執行位址;第七個引數startcontext是新執行緒接收的引數。
執行緒函式是乙個非常重要的部分,它決定了該執行緒具有什麼樣的功能。執行緒函式必須按照如下規範宣告:
void threadproc(in pvoidcontext);
執行緒有個非常重要的問題:同步問題,雖然多執行緒並不是真正的併發執行,但由於 cpu分配的時間片很短,看起來它們就像是併發執行的一樣。所以我們要保證執行緒的同步。這裡我們使用簡單的kevent事件物件進行同步。在使用 kevent事件物件前,需要首先呼叫核心函式 keinitializeevent對其初始化
void keinitializeevent(
in prkevent event,
in event_type type,
in boolean state);
第乙個引數 event是初始化事件物件的指標;第二個引數type表明事件的型別。事件分兩種型別:一類是「通知事件」,對應引數為 notificationevent,另一類是「同步事件」,對應引數為 synchronizationevent;第三個引數state 如果為true,則事件物件的初始化狀態為激發狀態,否則為未激發狀態。如果建立的事件物件是「通知事件」,當事件物件變為激發態時,需要我們手動將其改回未激發態。如果建立的事件物件是「同步事件」,當事件物件為激發態時,如果遇到相應的 kewaitfor****等核心函式,事件物件會自動變回到未激發態。
設定事件的函式是 kesetevent,可通過該函式修改事件物件的狀態。
下面用一段簡單的**來說明問題。
void
mycreatethread()
zwclose(hthread);
// 等待事件
kewaitforsingleobject(&kevent, executive, kernelmode, false, 0);
}void
mythreadfunc(
in pvoid context
)程式執行如圖:
建立核心執行緒
在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。在驅動裡生成的執行緒一般是系統執行...
建立核心執行緒
在linux中,有一些程序完全執行在核心空間,比如ksoftirqd等等,這些程序稱為核心執行緒。今天,我們就動手建立乙個核心執行緒。引言 如果使用者層的程序違規訪問記憶體,核心會傳送乙個sigse 訊號給程序。我們的目標就是,建立乙個核心執行緒,如果發生了段錯誤,就在控制台列印 mykthread...
核心執行緒建立
核心執行緒建立 核心執行緒的建立最終是由kthreadd完成,核心建立核心執行緒的其他api是kthread create on node對它的封裝。常見的kthread create on cpu和create worker最終呼叫kthread create on node 核心初始化時,會建立...