next up previous
次へ: 割り込みハンドラ 上へ: 割り込み処理の実装 戻る: 割り込み処理の登録

割り込み処理の解除

free_irqの書式は、次のようになっている(L.D.D.3 264ページ)。
   void free_irq(unsigned int irq, void *dev_id);

上記の書式に基づき、割り込み処理の解除を行なうfree_irq関数を次の ように実行する。
\begin{boxedminipage}{\textwidth}
\begin{verbatim}free_irq(dio_res.irq, (void *)&dio_res);\end{verbatim}
\end{boxedminipage}

割り込み処理の登録を行なうrequest_irq関数と同様に、解除を行なう free_irq関数でも、解除を行いたい割り込み番号と、登録時に指定した ユニークな識別子が必要になる。ここでは、割り込み番号のdio_res.irq と識別子としての構造体ポインタでもある&dio_resを指定して割り込み の解除を実行する。

ドライバモジュールをカーネルから取り外すまでに、ドライバ内で登録された全 ての割り込みハンドラを解除する必要がある。解除を行わない状態でモジュール を取り外すと、割り込み発生時に、すでに存在していないハンドラを呼び出して しまい、カーネルパニックとなる。

登録を確実に行なうためには、init_moduleopenの中で登録する 関数を実行するのが一般的である。なお、この実験ではinit-moduledio_initという名前にしている。
また、解除を確実に行なうためには、cleanup_modulereleaseの 中で解除する関数を実行するのが一般的である。なお、この実験では cleanup-moduledio_cleanupという名前にしている。



MANOME Yoichi 平成19年1月6日