Linux內核模塊編程可使用的內核組件

2.2.2 在閱讀《深刻Linux內核架構與底層原理》 做者:劉京洋 韓方,發現一些錯誤,有些本身的理解,特以此記錄linux

一、工做隊列(workqueue)數據結構

  隊列是一種能夠先進先出的數據結構,經常用來將一些工做任務緩衝的狀況中。在linux下的workqueue能夠用來處理內核中的任務鏈。架構

  linux內核有workqueue,用戶能夠實現本身的workqueue,若是須要workqueue時,都臨時建立,會致使系統開銷大,爲了減小開銷,內核使用了workqueue的線程池的技術,將建立好的workqueue,應用完畢後,返回到線程池中,須要新workqueue時,先看池裏,若是有則直接使用,不然再新建,避免了頻繁的workqueue的建立和銷燬。經過這種動態綁定workqueue的機制就是cwmq(Concurrency Managed Workqueue)函數

見原書上p37頁,感受排版形成的問題很多阿 spa

 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/workqueue.h>
 4 
 5 static struct workqueue_struct *queue = NULL;
 6 static struct workqueue_struct work;
 7 
 8 static void work_handler(struct work_struct *data){
 9     printk(KERN_ALERT "work hadler\n");
10 }
11 
12 static init __initqueue_init(void){
13     queue = create_singlethread_workqueue("Hello world");
14     INIT_WORK(&work, work_handler);
15     schedule_work(&work);
16     
17     return 0;
18 }
19 
20 static void __exit queue_exit(void){
21     destroy_workqueue(queue);
22 }
23 
24 MODULE_LICENSE("GPL");
25 module_init(queue_init);
26 module_exit(queue_exit);

二、中斷系統和tasklet線程

  Linux下中斷分爲3個層次,code

  一、最低層次是在linux kernel源碼的arch目錄下與硬件有關的代碼下,個人是在/linux-4.20.6/arch/x86/include/asm/irq_vectors.h,這個文件定義了一些硬件中斷號,直接完成硬件的映射blog

  二、中層是do_IRQ函數,根據下層傳來的中斷號查找中斷函數、處理CPU訪問和中斷重入等隊列

  三、上層是直接調用真實的中斷處理函數源碼

 

  tasklet主要用於專用中斷,不能阻塞,耗時長的操做都有tasklet在上下文以外調度執行,經常使用軟中斷實現。

相關文章
相關標籤/搜索