その場限りの処理を行うLinuxのLoadable Kernel Module
通常Loadable Kernel Module (LKM) は一度insmod
やmodprobe
ロードされると、rmmod
でアンロードするまでそのままです。一般的なLKMの利用目的からするとこの仕様は妥当かと思いますが、その場限りの処理を実行して、すぐにメモリ上から消えて欲しいという場合でも、明示的にアンロードしない限り残り続けてしまいます。
insmod && rmmod
すればいいだけ、と言ってしまえばそれまでのことですし、実際に私もそのようにして対処していましたが、つい最近モジュールを自動アンロードする画期的な方法を見つけたのでご紹介します。
それがこちらです。
通常はinit_module
で0を返すところを、-EAGAIN
を返すようにするだけです。たったこれだけで、処理が終わった後に自動でアンロードされるLKMの出来上がり。Resource temporarily unavailable
が毎回出力されるのはご愛嬌。
要するに、好き勝手処理をした後に強制的にエラーを返すことで、ロードできなかったことにしているというわけです。この手法、最初に見た時にはふざけているのかと思いましたが、私はLinuxカーネルで実際に使われているのを見て知りました (リンク先のコードでは上にifがありますが、普通のconfigではfips_enabled
は常に0なので、常に-EAGAIN
を返すことになっています)。オフィシャルでクリーンなハックだと思いますので、ぜひ利用してみてはいかがでしょうか。