Linux中斷處理

2021-07-26 03:29:52 字數 2182 閱讀 1809

裝置管理過程中,中斷號的申請是乙個非常重要的操作。

當裝置發出中斷之後,硬體裝置根據intel cpu的通用處理過程,跳轉到了該中斷號對應的中斷相應函式處。在linux作業系統中,必定要跳到do_irq函式處。在do_irq()函式中,進行了一部分公共的中斷響應處理之後,根據已經入棧了的中斷號查詢裝置中斷資訊的註冊結構陣列irq_desc, 找到註冊的響應函式之後,執行,最終完成中斷響應處理。

do_irq() 函式中能夠執行中斷號所對應的函式的乙個前提是,該函式已經在系統中註冊。中斷函式註冊資訊就保留在irq_dex_t{} 結構之中,系統所有的中斷註冊資訊構成了乙個由224個irq_desc_t{} 結構組成的陣列irq_desc.

因此,在linux的裝置管理過程中,陣列iqr_desc的填寫與維護對於中斷響應的正常進行是舉足輕重的。舉例來說,現在跟蹤一下9號中斷。 9號中斷請求發生後,首先由d0_irq函式進行了中斷通用處理。然後由irq_desc[9]對應的中斷描述(irq_desc_t) 獲得對應9號中斷處理函式並執行(如果有其他裝置共享該中斷,應該將每乙個裝置對應的響應函式均執行)。如果irq_desc[9]對應的irq_desc_t{}結構中,根本就沒有註冊過中斷響應函式,那麼系統只好忽略這個中斷請求。發生這種情況的原因就在於安裝裝置的驅動程式時並沒有將該裝置占用的中斷號通知系統,沒有提供中斷響應函式是。因此裝置發出的中斷請求猶如石沉大海,根本不會有任何回音。

從上面的描述可以看出,在裝置管理的範疇之內,所提到的中斷處理主要是指中斷號的申請,釋放,與中斷響應函式的安裝與解除安裝。

申請中斷:在linux核心中,乙個裝置在使用乙個中斷請求號時,需要首先通過request_irq()申請使用中斷請求。對於基於intel cpu的普通pc機,函式request_irq() 的定義在arch/i386/kernel/iqr.c中。

各引數含義如下:

引數irq為中斷號

引數handler為所安裝的中斷處理函式。

引數irqflags用於中斷管理的一些常量:sa_interrupt, sa_shirq(是否共享),sa_sample_random(利用裝置的中斷響應資料生成隨機數)。

引數dev_id用來共享中斷號。

int request_irq(unsigned int irq, 

void (*handler)(int, void *, struct pt_regs *),

unsigned long irqflags,

const char * devname,

void *dev_id)

#endif

if (irq >= nr_irqs)

return -einval;

if (!handler)

return -einval;

action = (struct irqaction *)

kmalloc(sizeof(struct irqaction), gfp_kernel);

if (!action)

return -enomem;

action->handler = handler;

action->flags = irqflags;

action->mask = 0;

action->name = devname;

action->next = null;

action->dev_id = dev_id;

retval = setup_irq(irq, action);

if (retval)

kfree(action);

return retval;

}

662: 函式request_irq().

678-680: 如果要求使用中斷號共享,但是沒有提供自己的dev_id, 則提示dev_id未提供。

684-687:判斷申請的irq是否超過nr_irqs(最大中斷號), 以及是否提供了中斷響應函式。

689-693:為新的irqaction{} 結構分配記憶體空間,如果分配不成功,則返回「-enomem".

694-699:填寫action中的成員。主要是將用為引數傳入的中斷處理函式handler, 中斷 屬性標誌irqflags, 中斷裝置名稱devname, 中斷共享id號dev_id賦給action中的相關成員。同量將中斷標誌mask設定為0.

701:呼叫setup_irq() 函式將action加入irq_desc中對應位置。

Linux中斷和中斷處理

眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...

Linux中斷處理之共享中斷處理初探

在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...

Linux學習 中斷和中斷處理

2 中斷處理程式 3 上半部和下半部的對比 處理器的速度和外圍裝置的速度相差太遠,為了解決讓核心不做過多的無用功 使用輪詢 這是就需要一種機制在硬體需要時再向核心發出訊號 中斷機制 中斷機制可以更好的協同處理器和外部裝置,並且提高機器的效能 中斷 指的是可以使得硬體得以發出通知給處理器,中斷可以隨時...