Linuxがモノリシックカーネルである理由
Quoraの問答は本当に面白いものばかり。技術的でないのもかなり興味深いものが多いが、またLinuxについてのネタで分かりやすいのがあったので訳してみた。
Linuxがモノリシックカーネルであるというのはどういう意味か?
モノリシックカーネル
モノリシックカーネルは、プロセスやメモリの管理、例外の取扱い、入出力のやり取り、ファイルシステムなどほとんどの基本的なシステムサービスを実行する。層構造になっており、基礎的なプロセス管理からOSの他の部分(ライブラリ群や、層の最上位であるアプリケーション)とのインタフェースからなっている。基本的なサービスをカーネルスペースに含めることは、次のような大きな3つの欠点となる。
- カーネルサイズが大きくなる
- 拡張性に乏しい
- メンテナンス性が悪い
マイクロカーネル
カーネルの機能を基本的なプロセス間通信と入出力制御のみに絞り、ユーザスペースの他のシステムサービスを普通のプロセス(「サーバ」と呼ばれる)としてしまうのがコンセプトである。あるサーバはメモリに関する管理を行い、別のサーバはプロセス管理、さらに他のサーバはドライバの管理…といった具合だ。サーバはカーネルスペースでは実行されないので、ユーザプロセスが特権モードに入ったり出たりするためにいわゆるコンテキストスイッチが発生してしまう。この方式では、マイクロカーネルはもはやシステムサービスの塊ではなく、プロセス間通信とプロセスとその下のハードウェアとの通信を制御するための、単にいくつかの基本的な抽象化とプリミティブを提供するだけである。通信は直接行われないので、独立した通信と拡張性をもたらす、メッセージングの仕組みが使われる。
ここでLinuxカーネルの話に入ろう。Linuxカーネルは、モノリシックカーネルである。しかし、Linuxの美しいところは、どちらとしてもコンパイルできることである!
モノリシックカーネル
- 1つのバイナリファイル
- 全ドライバがカーネル自体に含まれる
モジュラーカーネル
- 複数のカーネルのファイル
- ドライバはmodprobeコマンドなどでカーネルにロードしたりアンロード可能。lsmodやmodprobeのmanページを参照
- ほとんど全てのドライバはカーネルに対してビルドされてリンクされる
以下のカーネルコンフィグオプションの設定でモジュラーカーネルをビルドすることができる。
Enable loadable module support (CONFIG_MODULES) [Y/n/?]
このオプションにYと答えるとモジュラーカーネルとなり、各機能やドライバそれぞれに関して3つの選択肢が現われる。
m | ドライバをモジュールとしてコンパイルできる |
y | カーネル自身に組み込む |
n | 機能・ドライバを含まない |
(CONFIG_MODULES)オプションを n に設定した場合モノリシックカーネルとなり、各機能やドライバそれぞれに2つの選択肢がある。
y | 機能・ドライバを含む |
n | 機能・ドライバを含まない |