1. 程式人生 > >Linux核心中斷機制(一):中斷註冊方法

Linux核心中斷機制(一):中斷註冊方法

今天在網上看到一份不錯的講解核心中斷原理的文章,分享給大家!

1.中斷註冊方法

linux 核心中用於申請中斷的函式是 request_irq(),函式原型在Kernel/irq/manage.c 中定義:

int request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname,

void *dev_id)

irq 是要申請的硬體中斷號

handler 是向系統註冊的中斷處理函式,是一個回撥函式,中斷髮生時,系統呼叫這個函式,dev_id 引數將被傳遞給它。

irqflags 是中斷處理的屬性,若設定了 IRQF_DISABLED (老版本中的SA_INTERRUPT,本版 zhon 已經不支援了),則表示中斷處理程式是快速處理程式,快速處理程式被呼叫時遮蔽所有中斷,慢速處理程 序不遮蔽;若設定了IRQF_SHARED (老版本中的 SA_SHIRQ),則表示多個裝置共享中斷,若設定了IRQF_SAMPLE_RANDOM(老版本中的 SA_SAMPLE_RANDOM),表示對系統熵有貢獻,對系統獲取隨機數有好處。(這幾個 flag 是可以通過或的方式同時使用的)

dev_id 中斷共享時會用到,一般設定為這個裝置的裝置結構體或者 NULL

devname 設定中斷名稱,在 cat /proc/interrupts 中可以看到此名稱。

request_irq()返回 0 表示成功,返回-INVAL 表示中斷號無效或處理函式指標為NULL,返回-EBUSY 表示中斷已經被佔用且不能共享。

關於中斷註冊的例子,大家可在核心中搜索下 request_irq

在編寫驅動的過程中,比較容易產生疑惑的地方是:

1、中斷向量表在什麼位置?是如何建立的?

2、從中斷開始,系統是怎樣執行到我自己註冊的函式的?

3、中斷號是如何確定的?對於硬體上有子中斷的中斷號如何確定?

4、中斷共享是怎麼回事,dev_id 的作用是?