free_irq
の書式は、次のようになっている(L.D.D. 274ページ)。
void free_irq(unsigned int irq, void *dev_id); |
上記の書式に基づき、割り込み処理の解除を行なうfree_irq
関数を次の
ように実行する。
割り込み処理の登録を行なうrequest_irq
関数と同様に、解除を行なう
free_irq
関数でも、解除を行いたい割り込み番号と、登録時に指定した
ユニークな識別子が必要になる。ここでは、割り込み番号のdio_res.irq
と識別子としての構造体ポインタでもある&dio_res
を指定して割り込み
の解除を実行する。
ドライバモジュールをカーネルから取り外すまでに、ドライバ内で登録された全
ての割り込みハンドラを解除する必要がある。解除を行わない状態でモジュール
を取り外すと、割り込み発生時に、すでに存在していないハンドラを呼び出して
しまい、カーネルパニックとなる。
登録を確実に行なうためには、init_module
かopenの中で登録する
関数を実行するのが一般的である。なお、この実験ではinit-module
は
dio_init
という名前にしている。
また、解除を確実に行なうためには、cleanup_module
かreleaseの
中で解除する関数を実行するのが一般的である。なお、この実験では
cleanup-module
はdio_cleanup
という名前にしている。