Linux內核開發之中斷處理

一、概念

1、外設的處理速度一般慢於CPU。

2、CPU不能一直等待外部事件。

所以設備必須有一種方法來通知CPU它的工作進度,這種方法就是中斷。

二、中斷實現

在Linux驅動程序中,爲設備實現一箇中斷包含兩個步驟:

  1、向內核註冊中斷

  2、實現中斷處理函數

三、中斷處理子系統

1、根據中斷號找到正確的中斷處理代碼。

2、

   Linux定義名字爲irq_desc的中斷例程描述符表:(include/linux/irq.h),該表struct irqdesc 結構組成。
   struct irqdescirq_desc[NR_IRQS];//NR_IRQS表示中斷源的數目

 irq_desc結構體中的成員action指向該中斷號對應的irqaction結構體鏈表。irqaction結構體定義如下: 
struct irqaction {
        irq_handler_t           handler;
        unsigned long           flags;
        void                    *dev_id;
        void __percpu           *percpu_dev_id;
        struct irqaction        *next;
        int                     irq;
        irq_handler_t           thread_fn;
        struct task_struct      *thread;
        unsigned long           thread_flags;
        unsigned long           thread_mask;
        const char              *name;
        struct proc_dir_entry   *dir;
} ____cacheline_internodealigned_in_smp;
3、


4、共享中斷
        將不同的設備掛到同一個中斷信號線上。Linux對共享的支持主要是爲PCI設備服務。共享中斷也是通過request_irq函數來註冊的。    


    共享中斷的處理程序中,不能使用disable_irq(unsigned int irq);

    如果使用了這個函數,共享中斷信號線的其它設備將同樣無法使用中斷,也就無法正常工作。

5、中斷處理程序

中斷處理程序是在中斷上下文中運行的,它的行爲受到某些限制:

1)不能向用戶空間發送或接受數據。

2)不能使用可能引起阻塞的函數。

3)不能使用可能引起調度的函數。

6、Linux中斷底半部機制


兩個半部的理念:解決既要中斷執行快,又要做的事情多的矛盾。

下半部機制
軟中斷

tasklet

工作隊列

Linux軟中斷機制

軟中斷是利用硬件中斷的概念,用軟件方式進行模擬,實現宏觀上的異步執行效果。硬中斷是外部設備對CPU的中斷,軟中斷通常是硬中斷服務程序對內核的中斷。
驅動程序延緩執行機制


Tasklet和下半部處理
workqueue和下半部處理
內核定時器
總結:


工作隊列的使用方法和tasklet非常相似
tasklet運行於中斷上下文,工作隊列運行於進程上下文,tasklet處理函數中不能睡眠,而工作隊列處理函數中允許睡眠 。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章