Linux核心執行緒

2021-09-30 15:44:16 字數 1613 閱讀 3980

核心執行緒是直接由核心來啟動的程序,通常也稱為守護程序,用於執行下列任務

記憶體頁很少使用時,換出。

管理延時的動作。

實現檔案系統的事務日誌。

週期性的將修改的記憶體頁與頁**塊裝置同步。

其它。核心執行緒按照工作方式可以分為兩種型別:

執行緒啟動後一直在等待,直到核心請求執行緒執行某一特定操作。

執行緒啟動後按週期性間隔執行,檢測特定資源的使用等操作,在必要時採取一些行動。

一,核心執行緒建立

核心執行緒採用kernel_thread函式建立,接收的引數有:執行緒執行的函式指標,傳遞給執行函式的引數,以及用於建立程序的標誌。

int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)

export_symbol(kernel_thread);

這個函式最後的呼叫,還是建立乙個程序,即呼叫我們熟知的:

do_fork(flags | clone_vm | clone_untraced, 0, ®s, 0, null, null);

二,標誌解析

其實核心執行緒是由核心生成的,並且也是在cpu的管態執行。

clone_untraced:表示核心不會被其它程序追蹤。

三,暫存器引數

pt_regs引數在本質上就是一些暫存器,這個引數設定完成以下一些工作。

把ebx和edx暫存器設定為fn和arg,為什麼要這樣?這和下面的設定相關,先往下看。

把eip暫存器設定為kernel_thread_helper。在體系結構相關的entry_32.s 檔案中定義的:

entry(kernel_thread_helper)

pushl $0 # fake return address for unwinder

cfi_startproc

movl %edx,%eax

push %edx

cfi_adjust_cfa_offset 4

call *%ebx

push %eax

cfi_adjust_cfa_offset 4

call do_exit

cfi_endproc

endproc(kernel_thread_helper)

為樣就明白為什麼把ebx和edx設定為fn和arg了。在呼叫call *%ebx之後,就會開始執行fn(arg)這個函式。直到結束,並返回。

四,核心執行緒的位址空間

在linux上,位址空間被分成兩個部分,這已經不是秘密了,並把它分割成兩塊。空間底部的部分由使用者程式訪問,空間上層的部分由核心使用。核心在排程使用者程序時,其task_struct指向乙個mm_struct的例項,就是mm,以描述虛擬位址空間。在程序切換時,虛擬位址空間也會切換。

但核心執行緒不是使用者程序,也不與使用者程序相關聯,所以在核心程序排程時,不要需切換其位址空間,因此核心執行緒的位址空間是隨機的,為使得核心執行緒不訪問使用者空間部分,將核心執行緒的mm置為空指標,另設乙個active_mm指標來儲存前乙個程序的mm_struct例項。

但當核心排程完成時,需要將active_mm也斷開與上乙個程序的聯絡。

linux建立執行緒 建立Linux核心執行緒

執行緒 thread 是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。乙個執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每個執行緒並行執行不同的任務。很多時候會需要在後台執行一些任務,比如做乙個需要實時監控某個模組狀態的debug功能,這種任...

開啟linux 核心執行緒

函式說明 kthread create 建立執行緒。struct task struct kthread create int threadfn void data void data,const char namefmt,執行緒建立後,不會馬上執行,而是需要將kthread create 返回的t...

Linux 核心執行緒建立

在linux核心中,建立執行緒函式為 kthread create on node 需要注意的是核心建立乙個核心執行緒是個非同步過程。函式 kthread create on node對外提供兩個函式一,kthread create worker二,kthread create on node當然我...