Kernel中斷處理模型

2021-04-24 13:48:24 字數 1671 閱讀 3990

(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的初始化函式是要我們自己實現的。那我們實現了自己硬體的中斷初始化函式之後,核心是如何呼叫到它的呢?核心有自己的一套支援多平台的架構。下面我們分析核心中斷初始化的過程以及如何呼叫到乙個新平台...