カーネルは実際非常に多くの仕事をしている。それらの仕事の内容を的確に要約する なら、プログラムからの要求を適正かつ効率的にハードウェアに実行させることだと 思われる。
プロセッサは一度にひとつの命令しか実行できない。しかし、Linux システムは 同時に多くの作業をこなしているように見える。カーネルは、タスクからタスク へと瞬時の切り替え(switch)をすることでこれを実現しているのである。また カーネルは、どのプロセスが実行可能で、どのプロセスがハードディスク上の ファイルレコードやキーボードからのインプットなどを待っているのかを常に 監視することで、プロセッサ資源を最大限に活用している。
プログラムがなにもしていなければ、RAM 上にある必要はない。なにかしていたと しても、そのプログラムの内部には、なにもしていない部分があるかもしれない。 プロセスごとのアドレス空間は、ページ(という単位)に分割されている。カーネル は、どのプロセスのどのページが最も使われているかを絶えず監視している。ほと んど使われていないページは、スワップパーティションへと立ち退かせることがで きる。再度それが必要なときは、使われていない別のページをページアウトさせて、 空間を確保することが可能である。これを仮想記憶操作という。
カーネルをコンパイルしたことがあるなら、具体的なデバイスに関するオプションが 大量にあることに気付いただろう。カーネルには、多種多様なハードウェアと対話す るために大量の具体的なコードが含まれている。そしてアプリケーションプログラム に対しては、整然と統一された方法で、それら(へのアクセス手段)を提供する。
カーネルは同時に、ファイルシステム、プロセス間通信、多くのネットワークプログ ラムなども管理している。
いったんロードされたら、カーネルが行う最初の仕事は、init
プログラムの
探知とその実行である。
カーネルソースのある場所、例えば /usr/src/linux
において、
make menuconfig
か make xconfig
を使いカーネルをビルドすれ
ば、設定の大部分は終了する。
ビデオモードやルートファイルシステム、スワップデバイス、また rdev
を
使えば RAM のサイズについても、デフォルトの設定を変更することは可能である。
これらのパラメータ等は、lilo
からカーネルに渡すこともできる。
lilo.conf
ファイルに書くか、lilo
プロンプトから入力すれば、
カーネルに渡すべき情報を lilo
に取り次がせることができる。
例えば、hda2
の代わりに hda3
をルートファイルシステムとした
いのであれば、以下のようにタイプすればよい。
LILO: linux root=/dev/hda3
ソースコードからシステムを構築している場合、モノリシック(monolithic)なカーネ ルを作れば作業を単純化できる。これは、モジュールを持たないカーネルのことであ る。そうすれば構築中のシステムにカーネルモジュールをコピーする必要がなくなる。
原注: System.map
ファイルは、カーネルのログ記録プログラム
(kernel logger)がどのモジュール名を使ってメッセージを出すか決定する際に使用さ
れる。top
というプログラムもこのファイルの情報を使う。
カーネルを目的のシステムにコピーするときは、System.map
も一緒に
コピーすること。
以下のことについて考えること: /dev/hda3
は、ハードディスクのパーティ
ションを表す特別な種類のファイルである。しかし、それは他の普通のファイルと全
く同じようにファイルシステム上に存在する。カーネルは、まだファイルシステムを
持たない段階で、どのパーテイションをルートファイルシステムとしてマウントする
か知る必要がある。では、カーネルは、どういう方法でマウントすべきパーティション
を突き止めて、 /dev/hda3
を読み込むのか?
もしまだカーネル構築をしたことがないなら、自分のカーネルをビルドすること。 個々のオプションについてのヘルプ情報には全て目を通すこと。
驚くほど小さなカーネルを作っても動作することを確認すること。間違った思いこみ を捨てることで、多くを学べる。
"The Linux Kernel" (URL は以下)を読むこと。読みながらそこで紹介されているソー スコードの一部を実際に見つけること。(この文書の執筆時において)そこでは、バー ジョン 2.0.33 のカーネルが取り上げられているが、そのバージョンはもうかなり時 代遅れになっている。その旧バージョンのカーネルソースをダウンロードしてから、 コードに目を通したほうが、読みやすいだろう。"process" や "page" と呼ばれる C のコード群を発見するのは面白いことだと思う。
ハックせよ! カーネルメッセージに何かを追加して、それを出力できるかどうか 確認すること。
/usr/src/linux/README
と /usr/src/linux/Documentation/
の
中にある文書(システムによっては、違う場所にあるかもしれない)make menuconfig
や make xconfig
を使ってカーネル設定をする
時のヘルプ情報