Linux核心開發之中斷處理

2021-09-26 05:47:24 字數 1277 閱讀 5466

一、概念

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裝置驅動程式之中斷與時鐘,前邊你講了中斷,還給了我很多模版,我都看懂了,這次是不是要開始講時鐘了.真聰明,越來越喜歡你這聰明的樣子了,說的不錯,今天就要開始乙個新的模組 核心時鐘 我很少誇人,為啥今天誇她呢了,呵呵.定時器,意思大家都明白,我就不說了,要是...