前回までの10回の連載で,プロセス管理やメモリー管理,ファイル・システムといったカーネルの基本機能を一通り解説しました。

 しかし,これまで解説してきた機能は,ほぼプロセッサと主メモリーだけを対象とするものばかりです。ファイル・システムはハード・ディスクなどの補助記憶装置と関連が高いのですが,主メモリー上にRAMディスクを作成した場合などを考えれば分かる通り,必ずしも補助記憶装置を必要とはしません。

 これに対し,カーネルにはもう一つ重要な役割があります。それは,コンピュータに接続されているさまざまなハードウエアの制御です。

 最近のコンピュータには,非常に多くの周辺機器が接続されています。モニターやキーボードはもちろん,ハード・ディスクやCD-ROMドライブなどの補助記憶装置,ネットワーク・インタフェースや各種USBデバイスなどさまざまな周辺機器が挙げられます。カーネルは,こういったさまざまな周辺機器を制御し,アプリケーションに対して統一的なインタフェースを提供しています。こうすることで,アプリケーションが周辺機器を手軽に利用できるようになっています。

 例えば,ハード・ディスクの接続インタフェースがSCSIであろうとATAであろうと,ファイルを読み込むときはreadシステム・コールを利用するだけで済みます。アプリケーションはどちらの接続規格のハード・ディスクであるかを意識する必要はありません。これもカーネルが,周辺機器を抽象化し,統一的なインタフェース(この場合は,readシステム・コール)を提供してくれるおかげです。

 カーネルの中でハードウエアを制御する部分をデバイス・ドライバと呼びます。今回は,このデバイス・ドライバを中心にカーネルが周辺機器をどのように管理するかを解説します。

Linuxにおけるデバイスの分類

 コンピュータの周辺機器には,前述のようにいろいろな種類のものが存在します。種類によって制御方法やデータの入出力方法はさまざまですが,OSは,これをできるだけ共通化することで取り扱いを容易にしています。Linuxを含むUNIX系OSでは,デバイスを大まかに「キャラクタ・デバイス」,「ブロック・デバイス」,「ネットワーク・デバイス」の3種類に分類して,それぞれ異なる管理方法を用意しています(図1)。

図1●Linuxカーネルの構造
図1●Linuxカーネルの構造
デバイス・ドライバは,Linuxカーネルの中でハードウエアの制御を担当する部分を指します。

 このうちネットワーク・デバイスは,その名の通りネットワーク・インタフェースなどのネットワーク機器を扱うためのデバイスです。UNIXではネットワーク機能はいわば「後付け」された機能であるため,ネットワーク・デバイスの取り扱いはやや特殊なものになっています。また,カーネルのネットワーク機能とも密接に関係しています。そこで,これについては別の回に解説し,ここでは他の2つのデバイスについて解説します。