Linux は、インターネットの産物である。ひとりの学生の趣味のプロジェクトから 出発し、フリーに入手できる他のどんなオペレーティングシステムよりもポピュラー なものに成長した。 しかし、多くのひとにとって Linux は謎である。フリーなものに価値があるなどという ことがあり得るのか? 一握りの巨大ソフトウェア企業に支配された世界において、 いわゆる「ハッカー」連中の書いたもので太刀打ちできるのか? 世界中の様々な国の 多様な人間が関わって作られたソフトウェアに、安定性と効率を期待できるだろうか? だが、それは安定と効率そのものであり、現に市販製品と競合している。 多くの大学や有名な研究機関において、Linux は日ごとの計算処理の要求を満たす ために使用されている。個々人が自宅の PC 上で走らせているし、おそらく大部分の 会社でも、かならずしも意識されているわけではないかもしれないが、使用されている だろう。 Linux の使用目的は、ウェブの閲覧、ウェブサイトのホスティング、そのウェブ コンテンツの作成、電子メールの送信、そしてコンピュータの常として、ゲームで 遊ぶことなど様々だろう。だが、Linux は、断じておもちゃではない。 本当のプロフェッショナルによって書かれ、全世界に熱心なユーザを持つ、完全に 成熟したオペレーティングシステムである。
Linux のルーツは、Unix の起源にまで遡る。1969 年、ベル研究所の研究グループ の一員であった Ken Thompson は、当時誰も使っていなかった PDP-7 上でマルチ ユーザ、マルチタスクのオペレーティングシステムの実験を始めた。 まもなく Dennis Richie がそれに加わり、ふたりは、研究グループの他のメンバー からの協力も得て Unix の初期バージョンを生み出した。Richie は、それ以前の MULTICS プロジェクトから大きな影響を受けていたので、その Unix という名称 自体も MULTICS という名前をもじったものである。 初期のバージョンはアセンブリコードで記述されていたが、三度目のリリースでは C 言語で書き換えらている。C は、オペレーティングシステムを記述するためのプログ ラミング言語として Richie が特別に作成したものであった。この書き直しによって、 Unix は、よりパワフルな PDP-11/45 や 11/70 といった当時 DIGITAL(DEC) で生産さ れたばかりのコンピュータに移植することが可能になった。彼ら自身も述べている ことだが、それは歴史的事件にまで発展する。 Unix は研究所内に留まらず、コンピュータのメインストリームとなり、間もなく メジャーなコンピュータメーカの大部分が自社バージョンを製造するようになった。
Linux は、必要の産物であった。Linux の作者であり監修者でもある Linus Torvalds にとって、当時入手可能な唯一のソフトウェアは Minix だった。Minix とは、 (当時)教育目的で広く使用されていた、シンプルで Unix ライクなオペレーティング システムのことである。 Linus は Minix の機能に魅力を感じなかったため、自分自身の ソフトウェアを書くことで解決しようとした。彼は、学生としての日々の生活で使い 慣れたオペレーティングシステムである Unix をモデルに選んだ。そして、Intel 386 ベースの PC を使って、コードを書き始める。進歩はめざましく、それに 勢いを得た Linus は、当時動き始めた世界規模のネットワーク、主に研究者の コミュニティー内で使用されていたネットワーク経由で、その成果を他の学生たちに 提供した。彼らは、そのソフトウェアを見て、自分たちもそのプロジェクトに関わり 始めた。彼らが提供した新しいソフトウェアの多くは、提供者自身が直面した問題 への解決策であった。そしてまもなく、Linux はひとつのオペレーティングシステムと なるに到る。 注意すべきなのは、Linux は Unix のコードを含んでいないということ である。Linux は出版された POSIX 規格をもとに書き直されたものだからだ。 また、Linux は、GNU(GNU's Not Unix の略称)の多くのソフトウェアによって 構築されており、それを数多く実装している。GNU ソフトウェアは、 マサチューセッツのボストンにある Free Software Fundation が作成した ものである。
大部分の人にとって、Linux は単なる道具である。良く出来た CD-ROM ベース のディストリビューションは多数あるので、そのひとつをインストールするだけで、 たいていすぐに利用できる。多くの Linux ユーザは、それでアプリケーションを書い たり、他人が書いたアプリケーションを実行する。たくさんのユーザが、HOWTO (脚注1) を熱心に読ん で、システムの一部を正しく設定できたときにはその成功を喜び、うまくいかない ときは失敗でがっかりする。小数の人は、大胆にもデバイスドライバを書 いたり、カーネルパッチを作ったりしてカーネル作成者であり管理者でもある Linus に 送ったりする。 Linus は、どこの誰からでもカーネルソースへの追加や変更を受け付けている。この ような方法は、混乱を生み出すだけのように思えるかもしれない。しかし、Linus は 厳格な品質管理を行っており、カーネルへの新しいコードの追加は彼自身が行って いる。とはいえ、どんなときも、Linux カーネルソースに貢献する人々は小数だが 存在する。
Linux ユーザの大半は、オペレーティングシステムの仕組みや内部での相互作用を 調べようとはしない。これは残念なことだ。Linux を調べることは、オペレーティング システムの仕組みについて多くを学ぶ非常によい方法だからである。Linux はよく 書かれたオペレーティングシステムであるだけでなく、そのすべてのソースコードを 自由に入手して調べることが可能になっている。作者はソフトウェアに対する著作 権を保持しているが、Free Software Foundation の GNU General Public License の もとでソースの自由な配布を許しているからである。しかし、初めてソースを眺めた ときには混乱するかもしれない。kernel, mm, net などのディレクトリがあるのは わかるが、それに何が含まれるのか、どのコードがどういう役割を果たしているのか 見当がつかない。必要なのは、Linux 全体の構造と目的を鳥瞰して、理解すること である。つまり、これが本書の目的である。すなわち、Linux という オペレーティングシステムの仕組みについてはっきりとした理解を促進すること である。ファイルをある場所から別の場所にコピーしたり、電子メールを読んだりする ときに、何が起こっているのかを思い描けるような心象を提供することである。 オペレーティングシステムの実際の動きについて初めて理解できたときに感じた興奮 をわたしは今も鮮明に覚えている。わたしが本書の読者に伝えたいのは、そのときの 興奮である。
わたしが Linux に関わり始めたのは、1994 年の終わり頃、当時 Alpha AXP ベース のシステムへの Linux の移植作業をしていた Jim Paradis を訪ねたときだった。その 頃、わたしは 1984 年以来 Digital Equipment Co.Limited でネットワークとコミュ ニケーションに関する仕事をしていて、1992 年には、新しく設立された電子半導体 部門で働き始めていた。この部門の目的は、商用チップ製造市場に完全に参入して、 Alpha AXP シリーズのマイクロプロセッサを中心に、Alpha AXP システムボードを 他社にも販売するということであった。Linux の話を初めて聞いたとき、 わたしはすぐに面白いことができそうだと思った。Jim の熱心さが伝染して、わたしも 移植の手伝いをしはじめた。その作業をするうちに、わたしはそのオペレーティング システムだけでなく、それを作り出したエンジニアのコミュニティーをもより深く 敬愛するようになっていった。
しかし、Alpha AXP は、Linux が走る多くのハードウェアプラットフォームのひと つでしかない。大部分の Linux カーネルは、Intel プロセッサベースのシステムで 動いているが、Intel 以外の Linux システムの数もだんだんと増えていて、入手も しやすくなってきている。それらの中には、Alpha AXP, ARM, MIPS, Sparc, それに PowerPC などがある。それらのひとつを選んでこの文書を書くこともできたのだが、 わたしのバックグラウンドと技術的経験は、Alpha AXP 上の Linux のものであり、それより少し程度は低いが ARM 上のものである。本書で、重要な 点について解説するときに Intel 以外のハードウェアを例に挙げるのは、そのため である。ただ、Linux カーネルのソースの約 95% はどのようなハードウェアプラット フォームにも当てはまるものとなっている。同様に、本書の約 95 % も、マシンに依存 しない部分の Linux カーネルの解説となっている。
この文書は、読者の知識や経験を前提としていない。この主題に興味があるなら、 必要なものは自分から学ぶようになると信じているからである。ただ、コンピュータ、 できれば PC について知っていると、本書から実際に得るものがあるだろうし、C 言語 の知識もあると役立つだろう。
本書では、Linux 内部の作業マニュアルとして使用されることを意図していない。 むしろ、オペレーティングシステム一般の入門書であり、そのなかで特に Linux を 取り上げている。各章は、わたしのルールである「一般から個別へ」という原則に 従って構成されている。つまり、実際にカーネルの内部で動いているコードの詳細 についていきなり説明を始めるのではなく、まずその章で扱うカーネルサブシステム の概要を確認することから始めている。
カーネルのアルゴリズムについての叙述は意図的に省いている。
routine_X()
が routine_Y()
を呼び出し、それが foo
データ構造内の bar
フィールドをインクリメントするといった動作方法は
述べていない。そうしたことは、コードを読めばわかるからだ。コードの一部を理解
したり、それを誰かに説明したりする必要があるとき、わたしはよくホワイトボード
にデータ構造を描くことから始める。したがって、わたしは、関係のあるカーネルの
データ構造とそれらの相互関係についてはかなり詳細に述べている。
各章は完全に独立している。これは、各章で述べる Linux のカーネルサブシステ ムが独立しているのと同じである。しかし、ときには関連する事柄もある。たとえば、 仮想メモリの仕組みを理解しないと、プロセスを解説できないといったことである。
「ハードウェアの基本」の章は、現代の PC に関 する簡単な入門となっている。 オペレーティングシステムは、ハードウェアと密接に関連して動作しており、ハード ウェアはオペレーティングシステムの基礎として働く。オペレーティングシステム は、ハードウェアでしか提供できないサービスを必要とする。Linux オペレーティン グシステムを完全に理解するには、その基礎となっているハードウェアの基本を理解 する必要がある。
「ソフトウェアの基本」の章では、ソフトウェア の基本的な原理を説明し、アセンブリと C 言語を概観する。Linux 等のオペレー ティングシステムを構築するために使用されるツールについて述べ、オペレーティン グシステムの目的と機能について概説する。
「メモリ管理」の章では、システム上の物理メモ リと仮想メモリを Linux がどう扱っているのかについて述べる。
「プロセス」の章では、プロセスとはなにか、 Linux はシステム上でプロセスをどのように生成し、管理し、削除するのかを説明 する。
プロセスは、互いに協調して働くため、他のプロセスやカーネルと通信している。 Linux は、いくつかのプロセス間通信(IPC)のメカニズムをサポートしている。シグナル とパイプはそのうちのふたつだが、Linux は System V IPC もサポートしている。この 名称は、初めてその仕組みが登場したのが Unix の当該リリースの時だったからで ある。これらプロセス間通信のメカニズムは、 「プロセス間通信の仕組み」の章で説明する。
PCI(Peripheral Component Interconnect) 規格は、PC 上の低価格・高性能のデータ バスとして今日ではその立場を確立している。 「 PCI 」の章では、Linux が、システム上で、PCI バスとそのデバイスを 初期化して使用する方法を説明する。
「割り込みと割り込み処理」の章では、Linux の 割り込み処理の方法について説明する。カーネルは割り込み処理についての汎用 メカニズムとインターフェイスを備えているが、割り込み処理の詳細の中には、 ハードウェアやアーキテクチャに依存するものもある。
Linux の長所のひとつは、現代の PC 向けの多くのハードウェアデバイスをサポート していることだ。 「デバイスドライバ」の章では、 システム上の物理デバイスを Linux がどのように管理しているのか説明する。
「ファイルシステム」の章では、Linux 上で サポートされているファイルシステムをカーネルがどのように維持管理しているのか を説明している。仮想ファイルシステム(Virtual File System)について述べ、 Linux カーネルの実(real)ファイルシステムがどのようにサポートされているのかを 解説している。
ネットワークと Linux とは、ほぼ同義語である。本当の意味で、Linux は
インターネットやウェブ(WWW)の産物なのである。開発者とユーザは、ウェブを使って
情報やアイデアやコードを交換しているし、Linux 自体が、しばしば組織のネット
ワークへの要求を満たすために使用されている。
「ネットワーク」の章では、Linux が、TCP/IP
と総称されている
ネットワークプロトコルをどのようにサポートしているかについて解説する。
「カーネルメカニズム」の章では、カーネルの一部 が他の部分と協調して効率よく機能するために、Linux カーネルが提供しなければな らない一般的なタスクとメカニズムについて解説する。
「モジュール」の章では、カーネルが、たとえば ファイルシステムのサポートなどの機能を、必要なときに動的にロードする仕組みに ついて説明する。
「プロセッサ」の章では、Linux が移植されてい るいくつかのプロセッサについての概要を説明する。
「Linux カーネルソース」の章では、特定の カーネル関数を探すときソースのどこから探し始めるべきかについて説明する。
この文書では、次のような表記規則を採用している。
serif font コマンドや、ユーザが文字どおりにタイプすべきテキストの場合 type font データ構造およびそのデータ構造の中のフィールドを示す場合(訳注: 訳文では、どちらも等幅フォントで示しています。)
この文書のいたるところに、Linux カーネルのソースツリー内のコードの一部への
参照が付されている。(たとえば、文章のすぐそばにある、四角で囲った記述など。)
(訳注: 原著では HTML 版以外の PS 版などに付けられています。訳文では、[ ] で
囲って、文中に記述しました。)
それらは、読者が実際にソースそのものを見たい場合を考えて付したものであり、
すべての参照ファイルは、/usr/src/linux
からの相対位置にある。
たとえば、/foo/bar.c
を例にとると、ファイルのフルネームは /usr/src/linux/foo/bar.c
である。Linux を使っているなら(そうであって欲しい
のだが)、コードを見ることは価値のある経験であり、本書をコードへの理解と
データ構造への手引きとして利用することができる。
(訳注: 以下は、原文のままです。)
ARM は、ARM Holdings PLC の登録商標です。
Caldera, OpenLinux, および C のロゴは、Caldera, Inc の登録商標です。
Caldera OpenDOS 1997 Caldera, Inc.
DEC は、Digital Equipment Corporation の登録商標です。
DIGITAL は、Digital Equipment Corporation の登録商標です。
Linux は、Linus Torvalds の登録商標です。
Motif は、The Open System Fundation, Inc の登録商標です。
MSDOS は、Microsoft Corporation の登録商標です。
Red Hat, glint および Red Hat ロゴは、Red Hat Software, Inc の登録商標です。
UNIX は、X/Open の登録商標です。
XFree86 は、XFree86 Project, Inc の登録商標です。
X Window System は、X Consortium と Massachusetts Institute of Technology の 登録商標です。
わたしは、スプートニクが打ち上げられる数週間前の 1957 年に、イギリス北部に 生まれた。Unix と初めて出会ったのは、大学時代だった。講義でカーネルや スケジューリングその他のオペレーティングシステムの機能についての概念を教わる ときに、講師が教材として使ったからだ。わたしが卒業する年のプロジェクトとして PDP-11 が搬入されたのだが、その新品のマシンを使っていたときのことはとても 印象に残っている。卒業後(1982 年、コンピュータサイエンス学科の First Class Honours の学位を得て)、Prime Computer (Primos) に就職し、その数年後に DEC (VMS, Ultrix) で働き始めた。DEC では、いろいろなことに従事したが、 最後の 5 年間は、半導体部門の Alpha と Strong ARM の評価委員会で働いた。 1998 年には、ARM に移籍し、ここでは、低レベルファームウェアを書いたり オペレーティングシステムを移植したりするエンジニアのグループを束ねている。 わたしの子供たち(Esther と Stephen)は、わたしをコンピュータ狂い(geek)と呼ぶ。
職場や家庭で Linux について尋ねられることがしばしばあるが、そんなとき わたしは楽しさのあまり、つい聞かれてもいないことまで答えてしまう。仕事上でも 個人的にも Linux を使えば使うほど、わたしは Linux の熱心な愛好家になってゆ く。読者は気付いているかもしれないが、わたしは、狂信家ではなく、愛好家という 言葉を使う。Linux 愛好家とは、他にもオペレーティングシステムがあることを理解 しているが、それらを使うことを好まない情熱的な人間のことだとわたしは考えてい る。Windows 95 を使っている妻の Gill は、こう言ったことがある。「オペレーティングシステムが他にもあるなんて知らな かったわ。」 エンジニアであるわたしにとって、Linux は自分の要求に完璧に答えて くれるものである。それは、わたしが職場でも自宅でも使用する、柔軟で応用範囲の 広い非常に出来の良い道具である。フリーで手に入るほとんどのソフトウェアは、 Linux 上で簡単にビルドでき、しばしばあらかじめビルドされた実行ファイルを ダウンロードすることもでき、それらを CD-ROM からインストールすることもできる。 C++ や Perl でのプログラムを学ぶのに、あるいは Java について知るのに、Linux 以外にいったい何が自由に使えるというのだろう。
本書についてのコメントをメールで送ってくれた多くの親切なひとたちに感謝し たいと思う。それらのコメントは新しいバージョンを出すたびに含めるようにしてき た。コメントをもらうことは、わたしには本当に嬉しいことなので、是非わたしの 新しいメールアドレスを目に留めてほしい。
何名かの講師が、わたしに質問を送り、コンピュータについて教えるためにこの本 の一部を使ってもよいかどうか尋ねてきた。これには当然快諾する。それは わたしが特に意図していた本書の利用方法だからだ。そのクラスに未来の Linus Torvalds が座っていないと誰が断言できるだろうか。
この本全体を非常に詳細に批評してくれた John Rigby と Michael Bauer には特に 感謝している。大変な仕事だったと思う。Alan Cox と Stephen Tweedie はわたしの 質問に辛抱強く答えてくれた。どうもありがとう。各章をすこし明るくするために Larry Ewing のペンギンをつかった。最後に、この本を Linux Documentation Project に加えることに同意し、ウェブサイトに載せてくれた Greg Hankins に感謝する。
(脚注1) HOWTO とは、その名の 通り、何かをする方法(how to)を述べた文書である。Linux 向けに多数書かれており、 非常に役に立つ。