monoの開発ブログ

その場限りの処理を行うLinuxのLoadable Kernel Module

通常Loadable Kernel Module (LKM) は一度insmodmodprobeロードされると、rmmodでアンロードするまでそのままです。一般的なLKMの利用目的からするとこの仕様は妥当かと思いますが、その場限りの処理を実行して、すぐにメモリ上から消えて欲しいという場合でも、明示的にアンロードしない限り残り続けてしまいます。

insmod && rmmodすればいいだけ、と言ってしまえばそれまでのことですし、実際に私もそのようにして対処していましたが、つい最近モジュールを自動アンロードする画期的な方法を見つけたのでご紹介します。

それがこちらです。

int init_module() {
  /* 何かしらの処理 */
  return -EAGAIN;
}

void cleanup_module() { }

通常はinit_moduleで0を返すところを、-EAGAINを返すようにするだけです。たったこれだけで、処理が終わった後に自動でアンロードされるLKMの出来上がり。Resource temporarily unavailableが毎回出力されるのはご愛嬌。

要するに、好き勝手処理をした後に強制的にエラーを返すことで、ロードできなかったことにしているというわけです。この手法、最初に見た時にはふざけているのかと思いましたが、私はLinuxカーネルで実際に使われているのを見て知りました (リンク先のコードでは上にifがありますが、普通のconfigではfips_enabledは常に0なので、常に-EAGAINを返すことになっています)。オフィシャルでクリーンなハックだと思いますので、ぜひ利用してみてはいかがでしょうか。