カーネルモジュール
読み:カーネルモジュール
外語:kernel module
カーネル空間で動作する、プログラムの部品(モジュール)。ローダブルモジュール、ローダブルカーネルモジュールなどとも呼ばれる。
概要
FreeBSDをはじめとしたPC UNIXや、LinuxのようなUNIX互換システムで採用されている。
こういったシステムはモノリシックカーネルであるが、全ての機能を一つのバイナリとすることはもはや規模的に現実的でなく、機能毎に分割されるようになった。これがカーネルモジュールであり、その代表例として、いわゆるデバイスドライバーがある。
このようなプログラムは、機能毎に分割されている。しかし通常のアプリケーションプログラムのようにユーザー空間で動作するのではなく、やはりカーネル空間で動作する、カーネルの一部となる。
USBメモリーのような比較的新しいストレージデバイスや、無線LANやBluetoothなどのドライバー、あるいはグラフィックカードのドライバーなどは、モジュール化されていることが多い。
モジュール化されている場合は、プログラムを追加または更新する際に、カーネル全体のビルドが不要となるメリットがある。
特徴
Linux
Linuxの場合は、次のようなコマンドが用意されている。
- lsmod ‐ モジュールの一覧
- modprobe ‐ モジュールのロード(依存関係を考慮する)
- insmod ‐ モジュールのロード(依存関係を考慮しない)
- rmmod ‐ モジュールのアンロード
lsmodでは、モジュール名、サイズ、使用カウント数、必要に応じて参照モジュール名が表示される。
FreeBSD
FreeBSDの場合は、カーネルを再構築することなく、動的にカーネルモジュールを読み込むための技術としてkldloadが使われている。一般に、/boot/kernel/以下などに格納されている.koの拡張子を持ったファイルがローダブルモジュールで、kldloadで読み込むことが可能(root権限が必要)。
また、カーネルに動的にリンクされたファイルの情報については、kldstat(2)関数で取得するか、またはkldstat(8)コマンドで表示することができる。以下はkldstat(8)実行例である。
> kldstat
Id Refs Address Size Name
1 22 0xc0400000 b6dfe0 kernel
2 1 0xc0f6e000 a0d1c4 nvidia.ko
3 2 0xc197c000 2d8e4 linux.ko
4 1 0xc19aa000 6778 ng_ubt.ko
5 4 0xc19b1000 d9f4 netgraph.ko
6 2 0xc19bf000 df6c ng_hci.ko
7 3 0xc19cd000 23a0 ng_bluetooth.ko
8 1 0xc874d000 21000 ng_btsocket.ko
>
FreeBSDの場合、/boot/modules/以下にあるデバイスドライバー(上の例ではnvidia.ko)以外には、主としてnetgraph関係がモジュール化されている。
kldload以外でも、/etc/rc.confや、/boot/loader.confの記述に応じて、いくつかのモジュールが自動的に読み込まれることもある。
サンプルは、/usr/share/examples/kldの下に置かれている。
ビルド
FreeBSDは、カーネル含め、全てのソースが/usr/src以下に格納されている(インストール時にソースのインストールを選択した場合)。従って、いつでもソースを確認したりでき、また/usr/srcでmake kernelをすればカーネルの再構築も可能となっている。
部分ビルド
全カーネルのビルド、つまり/usr/srcでmake kernelをすれば、もちろん全ての(Makefileに登録されている)モジュールがビルドされるが、これは時間が掛かる。一つのモジュールを構築あるいはソース修正等するために、何十分も掛けるのは非効率であるし、それではモジュールに分割した意味も薄れる。
モジュールを単体あるいはいくつかのグループのみでビルドするには、/usr/src/sys/modules以下に置かれたMakefileを使用する。
各ディレクトリに置かれたMakefileは、その下の全ディレクトリのビルド情報を含む。ディレクトリを深く潜っていけば、その分、必要なビルド情報のみ得られる仕組みである。例えば、バグが多いBluetoothのソースを修正してビルドすることを考える。BluetoothのMakefileは/usr/src/sys/modules/netgraph/bluetooth以下にあるので、次のようにすればBluetoothのモジュール全てが再ビルドされ、再インストールされる。ルート権限が必要なので、rootでログインするか、suするか、sudo makeとする。
cd /usr/src/sys/modules/netgraph/bluetooth
make
make install
make clean
また、Bluetoothのうち、L2CAPの処理のみ修正したい場合は、/usr/src/sys/modules/netgraph/bluetooth/l2capで同様にすれば良い。
後は再起動するか、kldloadで読み込む等すれば、ビルドされたカーネルモジュールが利用できる。
再検索