我們來看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...