kernel
中斷處理模型結構圖如下:
下面簡單介紹一下:1.
linux
定義了名字為irq_desc的中斷例程描述符表:(include/linux/irq.h)
struct irqdesc irq_desc[nr_irqs];
nr_irqs
表示中斷源的數目。2.
irq_desc
是乙個指向irq_desc_t結構的陣列, irq_desc_t結構是各個裝置中斷服務例程的描述符。irq_desc_t結構體中的成員action指向該中斷號對應的irqaction結構體鍊錶。
irqaction
結構體定義如下:
/* include/linux/interrupt.h */
struct
irqaction ;
其中關鍵的handler成員指向了該裝置的中斷服務程式,由執行request_irq時建立。3.
在驅動程式初始化時,若使用到中斷,通常呼叫函式
request_irq
()建立該驅動程式對應的
irqaction
結構體,並把它登記到
irq_desc[irq_num]-> action
鍊錶中。
iqr_num
為驅動程式申請的中斷號。
request_irq
()函式的原型如下:
/* kernel/irq/manage.c */
intrequest_irq
( unsigned
intirq
, irqreturn_t
(*handler
)(int
,void
*,struct
pt_regs
*),unsigned
long
irqflags
,const
char
*devname
,void
*dev_id );
這樣當cpu接收到中斷請求後,就可以根據中斷號通過irq_desc找到該裝置的中斷服務程式。流程如上圖所示。
4.關於共享中斷
共享中斷的不同裝置的iqraction結構體都會新增進該中斷號對應的irq_desc結構體的action成員所指向的irqaction鍊錶內。當核心發生中斷時,它會依次呼叫該鍊錶內所有的
handler
函式。因此,若驅動程式需要使用共享中斷機制,其中斷處理函式必須有能力識別是否是自己的硬體產生了中斷。通常是通過讀取該硬體裝置提供的中斷flag
標誌位進行判斷。
Kernel中斷處理模型
linux 2.6.25.20 kernel 中斷處理模型結構圖如下 下面簡單介紹一下 1 linux 定義了名字為irq desc的中斷例程描述符表 include linux irq.h struct irqdesc irq desc nr irqs nr irqs 表示中斷源的數目。2 irq...
窺探 kernel 關於中斷
管理系統中的各個裝置是核心的任務,核心可以通過2中方式來實現。1 輪詢 以一定的時間來訪問裝置,參看其狀態並處理。2 中斷 裝置向核心傳送請求,核心再來完成處理。中斷的分類 中斷可分為同步中斷和非同步中斷。同步中斷是由cpu產生的,又稱為內部中斷。這裡的同步是指中斷指令訊號和 同時執行,在一條 執行...
Kernel硬體中斷的初始化流程
kernel硬體中斷的初始化流程 porting kernel到乙個全新的開發板時,通常hardware irq的初始化函式是要我們自己實現的。那我們實現了自己硬體的中斷初始化函式之後,核心是如何呼叫到它的呢?核心有自己的一套支援多平台的架構。下面我們分析核心中斷初始化的過程以及如何呼叫到乙個新平台...