天天看點

linux核心實驗中斷,Linux核心的中斷機制分析(栢圖實驗室)

Linux核心的中斷機制分析

一、中斷的概念

中斷是指在CPU正常運作期間,由于内外部事件或由程式預先安排的事件引起的CPU暫時停止正在運作的程式,轉而為該内部或外部事件或預先安排的事件服務的程式中去,服務完畢後再傳回去繼續運作被暫時中斷的程式。Linux中通常分為外部中斷(又叫硬體中斷)和内部中斷(又叫異常)。

在實位址模式中,CPU把記憶體中從0開始的1KB空間作為一個中斷向量表。表中的每一項占4個位元組。但是在保護模式中,有這4個位元組的表項構成的中斷向量表不滿足實際需求,于是根據反映模式切換的資訊和偏移量的足夠使得中斷向量表的表項由8個位元組組成,而中斷向量表也叫做了中斷描述符表(IDT)。在CPU中增加了一個用來描述中斷描述符表寄存器(IDTR),用來儲存中斷描述符表的起始位址。

二、中斷的請求過程

外部裝置當需要作業系統做相關的事情的時候,會産生相應的中斷。裝置通過相應的中斷線向中斷控制器發送高電平以産生中斷信号,而作業系統則會從中斷控制器的狀态位取得那根中斷線上産生的中斷。而且隻有在裝置在對某一條中斷線擁有控制權,才可以向這條中斷線上發送信号。也由于現在的外設越來越多,中斷線又是很寶貴的資源不可能被一一對應。是以在使用中斷線前,就得對相應的中斷線進行申請。無論采用共享中斷方式還是獨占一個中斷,申請過程都是先講所有的中斷線進行掃描,得出哪些沒有别占用,從其中選擇一個作為該裝置的IRQ。其次,通過中斷申請函數申請相應的IRQ。最後,根據申請結果檢視中斷是否能夠被執行。

中斷機制的核心資料結構是 irq_desc, 它完整地描述了一條中斷線 (或稱為 “中斷通道” )。以下程式源碼版本為linux-2.6.32.2。

其中irq_desc 結構在 include/linux/irq.h 中定義:

typedef void (*irq_flow_handler_t)(unsigned int irq,

struct irq_desc *desc);

struct irq_desc {

unsigned int irq;

struct timer_rand_state *timer_rand_state;

unsigned int *kstat_irqs;

#ifdef CONFIG_INTR_REMAP

struct irq_2_iommu *irq_2_iommu;

#endif

irq_flow_handler_t handle_irq;

struct irq_chip *chip;