核心自動探測中斷號

2021-07-08 14:22:22 字數 1701 閱讀 9738

我們來看short_kernelprobe函式如何實現由核心自動探測中斷號的:

[cpp]view plain

copy

466void short_kernelprobe(

void

)  467  

484        /*

485         * if more than one line has been activated, the result is

486         * negative. we should service the interrupt (no need for lpt port)

487         * and loop over again. loop at most five times, then give up

488         */

489    } while

(short_irq < 0 && count++ < 5);  

490    if

(short_irq < 0)  

491        printk("short: probe failed %i times, giving up\n"

, count);  

492}  

linux核心提供了探測可用中斷號的介面,但這種介面只能在非共享中斷模式下使用。核心提供的介面由兩個函式組成:

unsigned long probe_irq_on(void);

這個函式

返回乙個未分配中斷的位掩碼

,驅動程式必須儲存返回的位掩碼,並將它傳遞給probe_irq_off函式。

呼叫probe_irq_on函式之後,

驅動程式要安排裝置產生至少一次中斷。

int probe_irq_off(unsigned long);

在請求裝置產生中斷之後,驅動程式要呼叫這個函式,並將前面probe_irq_on返回的位掩碼作為引數傳遞給它。

probe_irq_off返回probe_irq_on之後發生的中斷編號

。如果沒有中斷發生,就返回0。如果產生了多次中斷,出現了二義性,就返回負數。

使用核心提供的介面探測中斷號時,需要注意在呼叫probe_irq_on之後啟用裝置中斷,在呼叫probe_irq_off之前禁用中斷。另外,

在probe_irq_off之後,需要處理裝置上待處理的中斷。

472行,呼叫probe_irq_on函式。
473行,將2號埠的第4位(0x10)設定為1,啟用中斷。
474行,將0號埠清0。
475行,將0號埠置1,觸發中斷。
476行,將2號埠的第4位(0x10)設定為0,禁用中斷。
477行,延時一會,以保證中斷的傳遞時間。
478行,呼叫probe_irq_off函式,並把472行probe_irq_on函式返回的位掩碼傳遞給它。
480行,probe_irq_off函式返回0,說明沒有中斷發生。
489行,probe_irq_off函式返回負值,說明發生了不止乙個中斷,需要重新探測,這裡限定最多探測5次。

核心探測工具systemtap簡介

systemtap是核心開發者必須要掌握的乙個工具,本文我將簡單介紹一下此工具,後續將會有系列文章介紹systemtap的用法。假如現在有這麼乙個需求 需要獲取正在執行的 linux 系統的資訊,如我想知道系統什麼時候發生系統呼叫,發生的是什麼系統呼叫等這些資訊,有什麼解決方案呢?下面將會介紹sys...

核心探測工具systemtap簡介

systemtap是核心開發者必須要掌握的乙個工具,本文我將簡單介紹一下此工具,後續將會有系列文章介紹systemtap的用法。假如現在有這麼乙個需求 需要獲取正在執行的 linux 系統的資訊,如我想知道系統什麼時候發生系統呼叫,發生的是什麼系統呼叫等這些資訊,有什麼解決方案呢?下面將會介紹sys...

核心探測工具systemtap簡介

systemtap是核心開發者必須要掌握的乙個工具,本文我將簡單介紹一下此工具,後續將會有系列文章介紹systemtap的用法。假如現在有這麼乙個需求 需要獲取正在執行的 linux 系統的資訊,如我想知道系統什麼時候發生系統呼叫,發生的是什麼系統呼叫等這些資訊,有什麼解決方案呢?下面將會介紹sys...