カーネルはLinuxシステムの中核をなす重要なソフトウエア部品です。Linuxを使いこなすためには,カーネルの動作や仕組みに対する理解が欠かせません。本連載では,Linuxカーネルの役割とその仕組みを体系的に紹介します。

 Linuxは,フィンランド・ヘルシンキ大学の学生だったLinus Torvalds氏が,i386プロセッサの勉強のために作成したオペレーティング・システム(OS)です。1991年に誕生しました。当初はネットワーク機能すらない貧弱なOSでしたが,いまや企業の基幹業務にも使われる実用的なOSとして成長しています。これは,Torvalds氏をはじめとした多くの開発者が,Linuxの改良に取り組んできた結果です。

 Linuxが誕生した1990年代は,ネットワーク機能を標準装備したWindowsシステムの登場や商用ISPのサービス開始により,インターネットが爆発的に普及した時代です。それと同時に一般家庭にもパソコンが浸透し,広く利用されるようになった時代でもありました。

 その一方で,コンピュータの仕組みや動作を理解する人の割合は年々減ってきているように思います。LinuxやWindowsなどの現代的なOSは,ハードウエアやOSの構造を知らなくても簡単にアプリケーションの作成ができる環境を提供してくれます。GUIも充実し,ユーザーにとっては利用しやすい環境になっています。

 この状況は自動車に似ています。自動車が登場した頃は,自動車の構造をよく知っている人しか利用できませんでしたが,現在では自動車の内部構造を深く知らなくても,簡単に運転できる機構が用意されています。

 しかし,自動車の性能を余すところなく利用するには,内部構造のきちんとした理解が必要です。同様に,コンピュータの性能を発揮させるには,利用者に対して隠ぺいされている部分の理解が必要です。コンピュータの仕組みや動作を理解することにより,性能上のボトルネックになっている部分の発見や,より効率的なアプリケーションを開発することが可能になります。

 この連載では,Linuxカーネルの内部構造の概要を分かりやすく解説します。本連載が,Linuxカーネルの開発や学習の第一歩になれば幸いです。また,教科書的な解説だけでなく,アプリケーションやシステムの開発に応用できるような実用的な情報も紹介したいと考えています。

OSはアプリの実行環境を整える

 Linuxとは何か,こう聞かれたときに私は「コンピュータのオペレーティング・システム(OS)の一つです」と答えます。では,OSとはいったいどのようなものなのでしょうか。OSを一言でいうと「ユーザー・アプリケーションに実行環境を提供するソフトウエア」になります。しかし,これでは簡潔過ぎて何だか分かりませんので,もう少し具体的に見てみましょう。

 例えば,コンピュータにログインする場合を考えてください。ログイン時には,キーボードからユーザーIDを入力します。入力した文字は画面に表示されます。このような動作が可能なのは,当然ですがログイン用のソフトウエアが,これらの処理を行うようにプログラムされているからです。

 ところが,実際には,ログイン用ソフトウエアは,キーボードの入力信号を判定したり,画面へのドット出力を制御するようにはプログラムされていません。キーボード入出力や画面出力のような基本的な処理を個々のソフトウエアで実装するのは,無駄が多く手間もかかるからです。例えば,キーボードやビデオ・カードなどの種類によってプログラムを書き分けねばなりません。

 代わりにこれらのソフトウエアには,「入力デバイスから文字を受け取る」や「出力デバイスに文字を出力する」という抽象的命令が記述されています。これらの命令を受け取って,実際にキーボードの入力を制御したり,画面に表示したりするのがOSの仕事です(図1)。

図1●オペレーティング・システムを通してハードウエアを扱う
図1●オペレーティング・システムを通してハードウエアを扱う
ハードウエアの制御をOSが肩代りすることで,アプリケーションの作成が容易になります。

 またOSは,指示に従ってディスクからソフトウエアをメモリーに読み込んで実行させるといった補助的な仕事も行います。これにより,プログラマはソフトウエア作成時にこのような部分まで作り込む必要がなくなります。

 コンピュータの登場初期は,各ソフトウエアごとに独自にハードウエアの制御をしていました。しかし,これでは効率が悪いため,OSという共通インフラが整備されたのです。OSの登場により,アプリケーションの開発が楽になると同時に,ハードウエアの細かな違いをOSが吸収し,同じプログラムをさまざまなコンピュータ上で実行できるようになりました。

OSの中核部分をなすカーネル

 OSの中でも,特に中心となるものが「カーネル(kernel)」です。カーネルというのは英語で「核」という意味で,文字通りOSの一番重要な部分を指します。なお,OSは,広義ではカーネルや基本ライブラリ・基本ツールを含む総称として用いられますが,狭義にはカーネルのみを指します。カーネルにはOSのエッセンスが詰まっているのです。先程のように,アプリケーションからの命令を受け取ってハードウエアを制御するのは,すべてこのカーネルの仕事です。

 このカーネルの機能の違いがOSの性質を表すといっても過言ではありません。例えば,MS-DOSで利用されているカーネルは,アプリケーションが直接ハードウエアを制御することを許可しています。柔軟な制御が可能ですが,アプリケーションのバグがシステム破壊をもたらす可能性があります。これに対しLinuxでは,原則としてカーネルを通じてのみハードウエアを制御できます。危険な操作はカーネルでブロックできるため,システムの安全性は高いと言えます。