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