2.2. カーネルの構成

この節では、2 つの側面から 4.4BSD カーネルの構成を見ていきます。

  1. ソフトウェアの静的側面、つまりカーネルを構築するためのモジュール によって提供された機能性による分類

  2. その動的な機能、つまりユーザに提供されるサービスによる分類

カーネルの大部分は、システムコールを通してアプリケーションが アクセスするためのシステムサービスを実装しています。 4.4BSD では、このソフトウェアは次のような構成になっています。

Table 2-1. 4.4BSD カーネルにおける機種非依存なソフトウェア

分類 コード行数 カーネル内での割合
ヘッダ 9,393 4.6
初期化部分 1,107 0.6
カーネルの機能 8,793 4.4
汎用のインタフェース 4,782 2.4
プロセス間通信 4,540 2.2
端末の取り扱い 3,911 1.9
仮想メモリ 11,813 5.8
vnode 管理 7,954 3.9
ファイルシステムネーミング 6,550 3.2
FFS 4,365 2.2
ログ構造化ファイルシステム 4,337 2.1
メモリベースのファイルシステム 645 0.3
cd9660 ファイルシステム 4,177 2.1
その他のファイルシステム (10) 12,695 6.3
ネットワークファイルシステム 17,199 8.5
ネットワーク通信 8,630 4.3
インターネットプロトコル 11,984 5.9
ISO プロトコル 23,924 11.8
X.25 プロトコル 10,626 5.3
XNS プロトコル 5,192 2.6
機種非依存部分の総計 162,617 80.4

これらのカテゴリのソフトウェアのほとんどは機種非依存であり、しかも 異なるハードウェアアーキテクチャに移植できるものです。

カーネルの機種依存部分は本流のコードから分離されています。 特に、機種依存しているコードのどれを取っても、 特定のアーキテクチャのためのコードを含んでいません。 機種に依存する機能が必要なときには、機種に依存しないコードは 機種依存のコード内にあるアーキテクチャ依存の関数を呼び出します。 機種依存であるソフトウェアは次のものを含んでいます。

Table 2-2. 4.4BSD カーネル内にある HP300 用の機種依存部分

分類 コード行数 カーネル内での割合
機種依存部分のヘッダ 1,562 0.8
デバイスドライバのヘッダ 3,495 1.7
デバイスドライバのソースコード 17,506 8.7
仮想メモリ 3,087 1.5
他の機種依存部分 6,287 3.1
アセンブリ言語で書かれたルーチン 3,014 1.5
HP/UX 互換機能 4,683 2.3
機種依存部分の総計 39,634 19.6

Table 2-1 は HP300 用 4.4BSD カーネルを構成するソフトウェアのうち、 機種非依存の部分をまとめたものです。 2 列目の数値は C 言語のソースコード、ヘッダファイル、そして アセンブリ言語のものを表しており、 アセンブリ言語のものは 2% 以下しかありません。 また、Table 2-2 の統計が示しているように、 機種依存のソフトウェアは、HP/UX やデバイスサポートを除いて、 カーネルのうちわずかに 6.9% しかありません。

カーネルのごく小さな部分だけがシステムの初期化に専念します。 このコードはシステムが 起動する ときに用いられ、 カーネルがハードウェアやソフトウェアの環境構築をするための基本部分と なります (14 章参照)。 (制限された物理メモリを持つものには特に) オペレーティングシステムの中には これらの機能が実行された後にそのソフトウェアを廃棄してしまうか、 上から覆ってしまう ものもあります。 4.4BSD カーネルは、起動するために要したコードのためのメモリを再利用しません。 それは通常の機種ではカーネルのリソースのうち 0.5% に過ぎないからです。 そして、起動のためのコードはカーネルの中の一部分に固まってはいません。 それは全体にわたって散在しており、初期化されたときに論理的に関連していた 場所に存在します。