通過輪詢的方式去查詢各個硬體的狀態顯得有的低效,一種更好的機制是當硬體狀態準備好之後能夠主動地報告給cpu。中斷就是這樣的一種機制,它允許硬體發訊號給cpu。
下面就先分析一下當乙個中斷發生時,linux系統的處理流程。
首cpu在收到中斷線上的中斷訊號後,會跳到某個固定的位址去執行**,這個位址被稱為中斷向量。這部分**是同體繫結構相關,主要是彙編**,其中的主要工作有儲存中斷現場,切換到中斷上下文中,獲取中斷號,呼叫linux核心中斷子系統來對中斷做進一步的響應。
/* * do_irq handles all hardware irq's. decoded irqs should not
* come via this function. instead, they should provide their
* own 'handler'
*/asmlinkage void __exception asm_do_irq(unsigned int irq, struct pt_regs *regs)
else
/* at91 specific workaround */
irq_finish(irq);
irq_exit();
set_irq_regs(old_regs);
}
在asm_do_irq()中經過下面的一系列中間呼叫generic_handle_irq(irq))-> __do_irq(irq) 最終會呼叫到handle_irq_event() 函式:
/**
* handle_irq_event - irq action chain handler
* @irq: the interrupt number
* @action: the interrupt action chain for this irq
* * handles the action chain of an irq event
*/irqreturn_t handle_irq_event(unsigned int irq, struct irqaction *action)
/** wake up the handler thread for this
* action. in case the thread crashed and was
* killed we just pretend that we handled the
* interrupt. the hardirq handler above has
* disabled the device interrupt, so no irq
* storm is lurking.
*/if (likely(!test_bit(irqtf_died,
&action->thread_flags)))
/* fall through to add to randomness */
case irq_handled:
flags |= action->flags;
break;
default:
break;
} retval |= ret;
action = action->next;
} while (action);
add_interrupt_randomness(irq, flags);
local_irq_disable();
return retval;
}
而在handle_irq_event函式中時通過下面的語句來呼叫我們在驅動程式中註冊的中斷處理函式的:
ret = action->handler(irq, action->dev_id);
中斷的註冊流程,我們會在後面的文章中介紹。 LINUX裝置驅動程式筆記
1.核心功能劃分 程序管理,記憶體管理,檔案系統,裝置控制,網路。裝置的分類 字元裝置,塊裝置,網路介面。單個原始檔編譯模組 obj m hello.o 多個原始檔編譯模組 obj m module.o module objs file1.o file2.o make c kernel 2.6 m ...
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...