JF Linux Kernel 2.2 Documentation: /usr/src/linux/Documentation/kmod.txt

kmod.txt

カーネルモジュールローダ kmod の解説 [プレインテキスト版]


Kmod: The Kernel Module Loader
Kirk Petersen
翻訳: 中野武雄 (1999/4/23 based on 2.2.5)

kmod は kerneld の代替となるシンプルな手法です。 kmod は
request_module() の代替品と、 kmod と呼ばれるカーネルスレッドと
からなります。カーネルがモジュールを要求すると、 kmod は目覚めて
modprobe を execve() し、起動した modprobe に要求された名前を渡します。

/proc ファイルシステムがマウントされている場合には、カーネルが
呼び出す modprobe のパスを以下によって設定できます。

	echo "/sbin/modprobe" > /proc/sys/kernel/modprobe

利用されていないモジュールを定期的に削除するには、以下のような
内容を root の crontab エントリに登録しておきましょう。

	0-59/5 * * * * /sbin/rmmod -a

kmod は単にモジュールをロードするだけです。 kerneld にはもっと
多くの機能がありました (ただし標準のカーネルでは、そのような
拡張機能は利用していませんでした)。 request_route のような機能が
必要な場合は、同様の手法をとることも可能ではあります。簡単な
request_route 関数を呼び出したり、 kroute カーネルスレッドを送って
その作業をさせたりできます。しかしこのような手法はできるだけ
使わないようにするべきだと思います (訳注: 例えば diald を使う)。

kerneld にはデバイスドライバの設定を保存する機能もありました。
これを modprobe にやらせるのは難しくありません。モジュールが
アンロードされるとき、 modprobe は「ドライバごとの設定」の置き場所
(/proc/sys/driver/blah) を見に行ってデバイスドライバの設定を読み、
その内容をファイルに書いておくことができます。モジュールが再び
ロードされたら、そのファイルを proc ファイルシステムの対応する
場所に cat し直せばよいのです。あるいは /etc/modules.conf に
スクリプトを設定しておくこともできるでしょう。他にもユーザ領域で
実行できる手法はたくさんあります (個人的には /proc を使う方法が
好きです)。

kerneld はちゃんと動作しているのに、なぜ置き換えるの?

- kerneld は SysV IPC を使っていますが、これは今ではモジュール化
  できることになっています。また SysV IPC は醜いので、できれば
  使いたくないのです (ええ、カーネルレベルではそうなんです)。

- kmod と kerneld は結局同じこと (modprobe の呼び出し) をします。
  なら仲介者はいない方がいいですよね?

- ipc/msg.c から kerneld 関連機能を削除すると、同ソースは 40%
  小さくなるのです。

- kmod はカーネルが通常用いている機能を使ってエラーを通知します。
  kerneld では Unix domain socket がモジュール化されていると
  「鶏と卵問題」が生じていましたが、 kmod ではこれを避けることが
  できます。

Linux カーネル 2.2 付属文書一覧へ戻る