玩式草子─ソフトウェアとたわむれる日々

第84回 Linuxの成長過程をふりかえる[その3]

この記事を読むのに必要な時間:およそ 4 分

前回に引き続き,今回はlinux-1.x世代の成長過程を検討します。

前回紹介したように,linuxは0.99世代でずいぶん迷走しました。その原因が新機能の追加安定化という相反する目標を同時に追求した結果だと考えたLinusさんは,1.0以降,⁠開発版」「安定版」を分離して2つの目標をそれぞれ異なるシリーズで追求することにしました。

  • 「開発版」は新機能を積極的に追加していくシリーズで多少不安定になることがあっても構わない開発者向け
  • 「安定版」は過去との互換性を重視したシリーズでバグフィックスを中心とした一般ユーザー向け

このような位置づけで,両者はバージョン番号の2ケタ目(マイナーバージョン)で区別されます。linux-1.x世代で言えば1.0と1.2が安定版,1.1と1.3が開発版です。

開発版では新しい機能やドライバが積極的に取り込まれ,週に数回,新しいバージョンがリリースされます。必要な機能が揃い,十分安定した,と判断されれば,開発版の最終バージョンが次の安定版の最初のバージョンになります。1.x世代の場合,linux-1.1は96回バージョンアップを繰り返して1.2になり,linux-1.3は114回バージョンアップして,メジャーバージョンを更新した2.0になりました。第82回で紹介したカーネルサイズの変遷グラフから,この期間のみを取り出して描いたのが図1です。

図1 linux-1.xのサイズ変遷

図1 linux-1.xのサイズ変遷

なお,linux-1.0のシリーズも10ほどのバージョンがリリースされているものの,www.kernel.orgにはパッチファイルしか保存されていないため,図ではlinux-1.0のみを記しています。また,1.1のシリーズも前半部は飛び飛びにしか保存されていないため,グラフはやや粗くなっています。

図1からわかるように,開発版の両シリーズとも開発期間は約1年で,その期間中に1.1では約1.6倍,1.3では2倍強にまでサイズが増加しています。以下,それぞれのシリーズでどのような機能が追加されたのかを詳しく見てみることにします。

linux-1.1シリーズ

linux-1.1シリーズは1994年4月に開発が始まり,96回のバージョンアップを経て,1995年3月に開発終了,最終バージョンが新しい安定版であるlinux-1.2となりました。

このシリーズの開発経過を調べるために,前期(1.1.13)⁠中期(1.1.52)⁠後期(1.1.93)の各ソースコードを展開し,トップディレクトリ直下のサブディレクトリのサイズを調べてみました。表中の各数字の単位はKB(キロバイト)です。

1.1.131.1.521.1.93
arch/721280
boot/44
drivers/296840824892
fs/114412801356
ibcs/852
include/8409801500
init/161620
ipc/525268
kernel/220236156
lib/484856
mm/100104132
modules/440
net/588604 712
tools/1212
zBoot/8080
total6208767210260

この結果をソースコード全体に占める各ディレクトリの割合に換算し,扇型グラフに描いたのが図2です。図2では,内側から1.1.13,1.1.52,1.1.93の順になっています。

図2 linux-1.1シリーズのディレクトリ構成

図2 linux-1.1シリーズのディレクトリ構成

この表と図で目に付くのは1.1.52から現われているarchディレクトリです。archディレクトリは1.1.52の段階では72KBほどと小さいものの,1.1.93では1280KBまで増加し,ソースコード全体の1割強を占めるようになっています。

このディレクトリにはlinuxが対応しているそれぞれのCPU専用のコードが収められています。具体的には,元々サポートしているi386以外に,alpha,mips,sparcの各ディレクトリが追加されています。

$ ls linux-1.1.93/arch/
alpha/  i386/  mips/  sparc/

archディレクトリは1.1.52で作られてはいたものの,その時点ではi386用のコードしか入っていませんでした。

$ ls linux-1.1.52/arch
i386/

どのバージョンでどのarch用のディレクトリが追加されたのかを調べてみたところ,1.1.70でalphaが,1.1.73でsparcが,1.1.83でmipsが,それぞれ確認できました。

現在の,上はメインフレームや世界最速のスーパーコンピュータから,下はスマホやRasberry PiのようなワンボードマイコンまでサポートしているLinuxに慣れた目からすると,⁠マルチ・アーキテクチャ対応」などあたりまえではないか,と思われるかも知れません。

しかし本連載でも紹介したように,もともとのLinuxは80386CPUを積んだPC互換機のハードウェアを直接操作するために書かれたソフトウェアで,80386以外のCPUのことなど一切考慮していませんでした。

そのためアセンブリ言語で書かれたコードもあちこちにありましたし,Cのコード中にもインラインアセンブラが頻繁に利用されていました。

Linuxが手本にしていたUNIXは高級言語(C)で書かれた最初のOSとして知られ,異なるハードウェア(CPU)に移植可能なことが大きな特徴でした。そのUNIXを手本にしながら,80386CPUに強く依存した作りになっていた最初期のLinuxは,前回紹介したTanenbaum教授をはじめ,古くからのUNIXユーザの批判の的になりました。Linux-1.0が公開されたころには,BSD UNIXの正当な後継者である386BSDやそれを元にしたNetBSD商用のBSD/OSなども公開されており,筆者などもずいぶん肩身の狭い思いをした記憶があります。

Linusさんを中心としたLinuxの開発者も同じ思いをし,linux-1.1シリーズの前半で徹底的な整理と書き直しを行って,汎用的な部分とハードウェアに依存した部分を切り分け,Linuxをマルチ・アーキテクチャに対応できるようにしていきました。その成果を踏まえ,linux-1.1シリーズの後半で,DEC AlphaやMIPS,SPARC用のコードを少しずつソースコードに組み込んでいった,そのような歴史がこれらの表やグラフからも見てとれます。

もうひとつlinux-1.1のシリーズで注目すべき点はmodulesディレクトリでしょう。Linuxはマイクロカーネルの評価が定まった1990年代に,古いモノリシックカーネルの設計で公開されました。この点がOS研究者から批判されたのは前回紹介した通りです。一方,マイクロカーネルはプログラミングが面倒で,性能を出すのも大変,という問題があります。そこでLinuxの開発者たちが採用したのは「ドライバ類をモジュールとして用意し,必要に応じて動的に組み込む」というモジュールカーネルのアイデアです。

従来,コンパイラが出力するオブジェクトファイルは,シンプルなa.out形式やCOFF(Common Object File Format)形式が使われていました。しかし,これらのファイル形式ではコードやデータをメモリ上のどの位置に配置するか事前に決めておく必要があったため,共有ライブラリのような動的に読み込まれるファイルをうまく扱うことができません。そこで考案されたのがコードやデータをメモリ上の任意の位置に配置できるようにしたELF(Executable Linkable Format)と呼ばれる形式です。

ELF形式はUNIX SystemVの開発の中で生まれたファイル形式で,使用するコードやデータを相対アドレスで指定するため,メモリ上の任意の位置に読み込むことができます。

ELF形式を使えば,必要に応じて動作中のソフトウェアにでも新しいコードを追加できる,この機能に注目したLinuxの開発者たちは,まずはネットワークカード用のドライバをモジュール化し,必要に応じて動的に組み込めるようにしました。このために利用されたのがmodulesディレクトリです。

linux-1.1.93のREADME.modulesを見ると,当時モジュールドライバとして利用できたのは,minix, xiafs, msdosといった補助的なファイルシステム(ext2は未対応)⁠aha1542などのSCSIアダプタ,3c501,3c509,de600といったネットワークアダプタなど,限られたドライバ類だけでした。しかし,これらのドライバのおかげでモジュール機能の有効性は広く認められるようになり,伝統的なモノリシックカーネルでも,先進的なマイクロカーネルでもない,⁠モジュールカーネル」というLinuxの方向性が決まることになりました。

これらを考え合わせるとlinux-1.1のシリーズは,その後のLinuxの方向性を定めたきわめて重要な開発版だった,と言えるでしょう。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入