在linux中,有一些程序完全執行在核心空間,比如ksoftirqd等等,這些程序稱為核心執行緒。今天,我們就動手建立乙個核心執行緒。
引言:如果使用者層的程序違規訪問記憶體,核心會傳送乙個sigse**訊號給程序。我們的目標就是,建立乙個核心執行緒,如果發生了段錯誤,就在控制台列印
"mykthread: segmentation fault!!!"
系統環境:
centos 5.5 i386 + 2.6.18 原始碼
設計原理:
(1)使用kthread_create建立執行緒:
structtask_struct *kthread_create(
int(*threadfn)(
void
*data),
void
*data,
const
char
*namefmt, ...);
這個函式可以像printk一樣傳入某種格式的執行緒名
執行緒建立後,不會馬上執行,而是需要將kthread_create() 返回的task_struct指標傳給wake_up_process(),然後通過此函式執行執行緒。
在arch/i386/mm/fault.c最前邊新增函式
staticintmykthread(
void
*data)
} (2)不管是誰訪問記憶體,都會呼叫到函式do_page_fault,如果是使用者層程式,位址合法,就會允許訪存,如果違法,就傳送sigse**。我們在傳送發動訊號前喚醒mykthread。
mykthread在第一次段錯誤時被建立。
在arch/i386/mm/fault.c的do_page_fault函式內新增乙個靜態變數
staticstruct
task_struct *kt = null;
在force_sig_info_fault(sigse**, si_code, address, tsk);這個語句之前,新增下面的內容
if(!kt)
//first time
else
wake_up_process(kt);
ok.重新編譯核心
程式執行結果:
沒發生段錯誤之前
執行程式seg_fault
注:我原先編譯的,內容是列印sigse** sent和segment fault!
seg_fault**
intmain()
建立核心執行緒
在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。在驅動裡生成的執行緒一般是系統執行...
建立核心執行緒
在作業系統的最小執行單元就是執行緒,在核心中線程的概念更加容易看出來。比如說有的時候需要使用執行緒來完成一些任務,可是這些任務的工作量過大的時候系統處理這些任務就必須停下來等待。而等待的過程就大大的浪費了cup寶貴的時間,所以這個時候利用多執行緒去處理是最好的方法。在驅動裡生成的執行緒一般是系統執行...
核心執行緒建立
核心執行緒建立 核心執行緒的建立最終是由kthreadd完成,核心建立核心執行緒的其他api是kthread create on node對它的封裝。常見的kthread create on cpu和create worker最終呼叫kthread create on node 核心初始化時,會建立...