一、概念
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處理函數中不能睡眠,而工作隊列處理函數中允許睡眠 。