次のページ 前のページ 目次へ

4. Linux カーネル

カーネルは実際非常に多くの仕事をしている。それらの仕事の内容を的確に要約する なら、プログラムからの要求を適正かつ効率的にハードウェアに実行させることだと 思われる。

プロセッサは一度にひとつの命令しか実行できない。しかし、Linux システムは 同時に多くの作業をこなしているように見える。カーネルは、タスクからタスク へと瞬時の切り替え(switch)をすることでこれを実現しているのである。また カーネルは、どのプロセスが実行可能で、どのプロセスがハードディスク上の ファイルレコードやキーボードからのインプットなどを待っているのかを常に 監視することで、プロセッサ資源を最大限に活用している。

プログラムがなにもしていなければ、RAM 上にある必要はない。なにかしていたと しても、そのプログラムの内部には、なにもしていない部分があるかもしれない。 プロセスごとのアドレス空間は、ページ(という単位)に分割されている。カーネル は、どのプロセスのどのページが最も使われているかを絶えず監視している。ほと んど使われていないページは、スワップパーティションへと立ち退かせることがで きる。再度それが必要なときは、使われていない別のページをページアウトさせて、 空間を確保することが可能である。これを仮想記憶操作という。

カーネルをコンパイルしたことがあるなら、具体的なデバイスに関するオプションが 大量にあることに気付いただろう。カーネルには、多種多様なハードウェアと対話す るために大量の具体的なコードが含まれている。そしてアプリケーションプログラム に対しては、整然と統一された方法で、それら(へのアクセス手段)を提供する。

カーネルは同時に、ファイルシステム、プロセス間通信、多くのネットワークプログ ラムなども管理している。

いったんロードされたら、カーネルが行う最初の仕事は、init プログラムの 探知とその実行である。

4.1 設定

カーネルソースのある場所、例えば /usr/src/linux において、 make menuconfigmake xconfig を使いカーネルをビルドすれ ば、設定の大部分は終了する。 ビデオモードやルートファイルシステム、スワップデバイス、また rdev を 使えば RAM のサイズについても、デフォルトの設定を変更することは可能である。 これらのパラメータ等は、lilo からカーネルに渡すこともできる。 lilo.conf ファイルに書くか、lilo プロンプトから入力すれば、 カーネルに渡すべき情報を lilo に取り次がせることができる。 例えば、hda2 の代わりに hda3 をルートファイルシステムとした いのであれば、以下のようにタイプすればよい。

        LILO: linux root=/dev/hda3

ソースコードからシステムを構築している場合、モノリシック(monolithic)なカーネ ルを作れば作業を単純化できる。これは、モジュールを持たないカーネルのことであ る。そうすれば構築中のシステムにカーネルモジュールをコピーする必要がなくなる。

原注: System.map ファイルは、カーネルのログ記録プログラム (kernel logger)がどのモジュール名を使ってメッセージを出すか決定する際に使用さ れる。top というプログラムもこのファイルの情報を使う。 カーネルを目的のシステムにコピーするときは、System.map も一緒に コピーすること。

4.2 演習

以下のことについて考えること: /dev/hda3 は、ハードディスクのパーティ ションを表す特別な種類のファイルである。しかし、それは他の普通のファイルと全 く同じようにファイルシステム上に存在する。カーネルは、まだファイルシステムを 持たない段階で、どのパーテイションをルートファイルシステムとしてマウントする か知る必要がある。では、カーネルは、どういう方法でマウントすべきパーティション を突き止めて、 /dev/hda3 を読み込むのか?

もしまだカーネル構築をしたことがないなら、自分のカーネルをビルドすること。 個々のオプションについてのヘルプ情報には全て目を通すこと。

驚くほど小さなカーネルを作っても動作することを確認すること。間違った思いこみ を捨てることで、多くを学べる。

"The Linux Kernel" (URL は以下)を読むこと。読みながらそこで紹介されているソー スコードの一部を実際に見つけること。(この文書の執筆時において)そこでは、バー ジョン 2.0.33 のカーネルが取り上げられているが、そのバージョンはもうかなり時 代遅れになっている。その旧バージョンのカーネルソースをダウンロードしてから、 コードに目を通したほうが、読みやすいだろう。"process" や "page" と呼ばれる C のコード群を発見するのは面白いことだと思う。

ハックせよ! カーネルメッセージに何かを追加して、それを出力できるかどうか 確認すること。

4.3 参考文献等


次のページ 前のページ 目次へ