一、概念
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 ____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處理函式中不能睡眠,而工作佇列處理函式中允許睡眠 。
Linux核心 之 中斷
中斷處理函式所作的第一件事情是什麼?答案是遮蔽中斷,所以要遮蔽中斷,是因為新的中斷會再次呼叫中斷處理函式,導致原來中斷處理現場的破壞。因為中斷,它是把原來的上下文都存起來,如果是多級中斷的話,它需要存多級的上下文,除非linux能存多級上下文,感覺是能多存的。如果只能存一級,那必然是要遮蔽中斷,不然...
Linux核心設計基礎(一)之中斷處理
假設讓核心定期對裝置進行輪詢。以便處理裝置,那會做非常多無用功,假設能讓裝置在須要核心時主動通知核心,會是乙個聰明的方式,這便是中斷。在響應乙個特定中斷時,核心會執行乙個函式 中斷處理程式。中斷處理程式與其它核心函式的差別在於,中斷處理程式是被核心呼叫來響應中斷的,而它們執行於我們稱之為中斷上下文的...
Linux核心開發之中斷與時鐘 三
晚上7點10分.小濤哥,這章不是叫linux裝置驅動程式之中斷與時鐘,前邊你講了中斷,還給了我很多模版,我都看懂了,這次是不是要開始講時鐘了.真聰明,越來越喜歡你這聰明的樣子了,說的不錯,今天就要開始乙個新的模組 核心時鐘 我很少誇人,為啥今天誇她呢了,呵呵.定時器,意思大家都明白,我就不說了,要是...