オペレーティングシステムの誕生

前講で、マイクロプロセッサ・RAM・キーボード・ビデオディスプレイ・ディスクドライブが1本のバスで つながった。机(RAM)とファイルキャビネット(ディスク)という比喩まで手に入れて、ハードウエアの 全体像はこれで出来上がりである。あとは電源を入れさえすれば動き出すはずだ——ところが、いざスイッチを 入れてみると、何も生産的なことは起きない。 何が足りないのだろうか。 この章は、その「足りないもの」を1つずつ自分の手で足していき、気がつけばオペレーティングシステムと 呼ばれるものを組み上げてしまう道のりである。全5セクション・演習20問。回答はブラウザに保存されるので、 途中でやめても続きから再開できる。

進捗 0 / 20 問(正解 0 問)

1. 電源を入れても動かない — ブートストラップ問題

前講でマイクロプロセッサ・RAM・キーボード・ビデオディスプレイ・ディスクドライブが1本のバスでつながり、ハードウエアとしてのコンピュータは完成した。ところが電源を入れても、生産的なことは何も起きない。半導体メモリは電源投入直後の内容がランダムで、マイクロプロセッサはそのでたらめなバイト列を律儀にマシンコードとして実行してしまうからである。足りないのはソフトウエア——それも、いちばん最初の1本。マイクロプロセッサはリセット時に決まった番地から実行を始めるので、その番地に最初のマシンコードを置く手段が要る。ここで登場するのがコントロールパネルだが、それは同時に「真っ先に廃止すべきもの」でもある。

電源を入れた直後の半導体メモリ(RAM)の中身は、ランダムで予測不可能である。0で 埋まっているわけでも、工場出荷時のプログラムが入っているわけでもない。本当にでたらめなバイトの 並びが、そこにある。そしてマイクロプロセッサは、そのでたらめな並びを律儀にマシンコードとして 解釈し、実行し始める。悪いことは何も起きないが、生産的なことも何も起きない——ただ無意味に空回り するだけである。

足りないのはソフトウエア、それもいちばん最初の1本である。マイクロプロセッサは 電源投入時とリセット時に、あらかじめ決まった特定のメモリアドレスから実行を始めるよう設計されて いる。Intel 8080なら0000h番地。つまり「その番地に何を置くか」が、コンピュータを動かす第一歩に なる。

では、その最初のマシンコードをどうやってRAMに入れるのか。手段の1つが、第16章に出てきたRAM読み 書き用コントロールパネルの発展版である。新たにReset・Takeoverという2つのスイッチが加わっていて、 次の手順で1バイトずつ書き込む。

  1. Resetをオンにして、マイクロプロセッサを止める
  2. Takeoverをオンにして、バスの主導権を奪う
  3. アドレススイッチとデータスイッチで、書き込む位置と値をセットする
  4. Writeスイッチを一瞬オンにしてからオフに戻し、書き込みを確定する
  5. 書き終えたらTakeoverをオフにし、最後にResetをオフにする

これで、書き込んだ番地の先頭からプログラムが走り出す。もっとも、1バイトごとにこの手順を繰り返す わけで、少し長いプログラムを入れようと思えば気の遠くなるような作業になる。しかも計算結果を ビデオディスプレイに16進数で表示するだけでも、ニブル(4ビット)をASCIIコードに変換するサブルーチンを 別に書いておく必要がある。

本文はこのコントロールパネルを入出力装置としては最悪の発明品と評し、真っ先に 廃止すべき対象に挙げる。理由ははっきりしていて、数を1つずつ0と1のスイッチで打ち込む必要があり、 著しく使いにくいからである。白紙の状態からコンピュータを設計できるほどの技術力があっても、 入出力の使い勝手まではまだ手が回っていない——この章は、そこから先の話になる。

演習 1理解

完成したコンピュータの電源を入れた直後、RAM(半導体メモリ)の中身はどうなっているか

演習 2理解

マイクロプロセッサが電源投入時やリセット時に実行を始める場所について正しいのはどれか

演習 3計算

第16章由来のコントロールパネルを使って最初のマシンコードをRAMに書き込む手順として正しい順序はどれか

演習 4理解

スイッチと電球を並べたコントロールパネルが、入出力装置として真っ先に廃止すべき対象とされた理由はどれか

このセクション: 0 / 4 問正解

2. キーボードハンドラで対話的にする

スイッチを1つずつ倒して1バイトを打ち込む生活から抜け出す第一歩がキーボードである。キーが押されると割り込み制御用チップがマイクロプロセッサに割り込みをかけ、実行中の位置をスタックに退避して決まった番地へ飛ぶ——そこに置かれたキーボードハンドラが、押された文字を画面にエコーし、BackSpaceで消し、Return/Enterでその行をコマンドとして解釈する。リセット直後に走る初期化コードがスタックポインタ・画面・カーソル・割り込み許可を整え、最後のHLTで次の合図を待つ。W・D・Rの3つのコマンドを理解するコマンドプロセッサができあがった時点で、コントロールパネルはお役御免になり、コンピュータは初めて「対話的」になる。

コントロールパネルを廃止する次の一手がキーボードである。キーボードのハードウエアは マイクロプロセッサに直接語りかけるのではなく、割り込み制御用チップを介して「今動いている処理を 一時中断してくれ」という信号を送る。マイクロプロセッサはこれを受けてRST命令を実行し、 現在の実行位置をスタックに退避してから、決まったアドレスへジャンプする。これが割り込み の基本形であり、飛んだ先に置いてあるプログラムがキーボードハンドラである。

割り込みが正しく機能するには、事前の準備がいる。リセット直後に走る初期化コードが その準備を引き受ける。スタックポインタをセットし、ビデオディスプレイメモリの全バイトを空白文字に して画面をクリアし、カーソル位置を初期化し、最後に割り込みを許可する命令(EI)を実行する。

そして初期化コードの末尾に置かれるのがHLT(停止)命令である。これは「終了する」 ための命令ではなく、「次の合図が来るまで待つ」ための命令だと考えるとわかりやすい。キーボードからの 割り込みか、コントロールパネルからのリセットが来るまで、マイクロプロセッサは行儀よく待機し続ける。

キーボードハンドラは押されたキーを判定して、3通りに振る舞う。ふつうの文字ならビデオディスプレイ メモリに書き込んで画面に映す(エコー)。BackSpaceなら直前の文字を空白で上書きして 消す。Return/Enterなら、その行全体をコマンドとして解釈する。

コマンドを解釈する部分がコマンドプロセッサである。理解するのはさしあたり3つだけ でよい。

  • W(Write): 指定した番地にバイト列を書き込む
  • D(Display): 指定した番地からのメモリの内容を画面に表示する
  • R(Run): 指定した番地に置かれたプログラムへジャンプして実行する

この3つがそろった時点で、コントロールパネルは不要になる。もう0と1のスイッチを倒す必要はなく、 キーボードから打ち込んで画面で確かめられる。コンピュータが初めて 対話的(インタラクティブ)になった瞬間である。

演習 5理解

キーボードのキーが押されたとき、マイクロプロセッサに処理が渡るまでの流れとして正しいのはどれか

演習 6理解

マイクロプロセッサがリセットされた直後に実行される「初期化コード」が行うことの説明として、誤っているものはどれか

演習 7理解

初期化コードの最後にHLT(停止)命令が置かれているのはなぜか

演習 8計算

コマンドプロセッサが理解するW・D・Rのうち、次の行をタイプして実行した場合の説明として正しいのはどれか。「R 3000」

このセクション: 0 / 4 問正解

3. ファイルという発想の誕生

電源を切ればタイプしたコードは消える。そこでコマンドプロセッサにS(保存)とL(ロード)を足してディスクに読み書きできるようにするのだが、今度は「どのプログラムをディスクのどこに置いたか」を人間が手作業で覚えておく必要が出てくる。しかもプログラムを別の番地にロードし直すと内部のジャンプ命令が古い番地を指したままになり、長いプログラムはディスク上の連続しないセクタに分かれて入る。この行き詰まりから、関係するデータをひとまとまりの「ファイル」として名前で識別する——ファイルシステムという発想が生まれる。前講で見たファイルキャビネットの中身を、どう整理するかという話である。

対話的にはなったが、電源を切ればタイプしたコードは消えてしまう。書いたものを残す先として、まず 思いつくのはROMである。一度だけ書き込めるPROM、紫外線を当てれば消して書き直せるEPROM——どちらも 「完成したプログラム」の置き場所としては良い。しかし、書きかけのプログラムを毎日出し入れする 場所としては向かない。

そこでコマンドプロセッサに、ディスクとの読み書きを担当する2つのコマンドを足す。 S(Store)はメモリのブロックをディスクの指定位置(サイド・トラック・セクタ)へ 保存し、L(Load)は同じ指定でディスクからメモリへ読み戻す。これで永続化はできた。

ところが、ここから面倒が始まる。どのプログラムをディスクのどこに保存したかを、 人間がメモ用紙で管理しなければならない。しかも問題はそれだけではない。

  • プログラムを別の番地にロードし直すと、プログラム内部のジャンプ命令やコール命令は 元の番地を指したままなので、的外れな場所へ飛んでしまう
  • 長いプログラムは、ディスク上で連続しない複数のセクタに分かれて保存されることが ある。どのセクタとどのセクタが同じプログラムの一部なのかも、自分で覚えておく必要がある

この2つを手作業のメモだけで追い続けるのは、早晩どこかで破綻する。破綻を避けるために生まれた発想が ファイルシステムである。関係するデータの集まりを、名前で識別できる ファイルとしてまとめ、ディスクの1つまたは複数のセクタに置いて管理する。ディスクを ファイルキャビネット、ファイルをその中の書類の束、ファイル名をタブに例えると、狙いがつかみやすい ——前講で手にした比喩の、その中身を整理する話である。

そしてファイルシステムは、ふつう単独では存在しない。ほとんどの場合、もっと大規模なソフトウエア ——オペレーティングシステム——の一部として実装されている。ここまで自分たちで積み 上げてきたキーボードハンドラもコマンドプロセッサも、実はその大きなソフトウエアが担う仕事の 一部だったことになる。

ファイルシステムの2つの要点名前で識別できること/セクタが連続していなくてよいこと① ディスク上での格納(セクタの並び)1234REPORT.TXT のセクタ他のファイル・空き REPORT.TXT は離れた4つのセクタに分かれて入っているが、ディレクトリが名前と順番を記録しているので正しく読み出せる ② ディレクトリの階層構造ルートディレクトリREPORT.TXTSALES(サブディレクトリ)NOTES.TXTQ1DATA.TXTQ2DATA.TXT 太枠=ディレクトリ/細枠=ファイル。ディレクトリの中に別のディレクトリを置けるのが階層化ファイルシステム
演習 9計算

次のコマンドの意味として正しいものはどれか。「S 6000 1 08 2」

演習 10理解

「どのプログラムをディスクのどこに保存したか」を手作業のメモだけで記録するやり方が、いずれ破綻すると本文が指摘する理由はどれか

演習 11理解

本文が導入する「ファイルシステム」の考え方の説明として最も正しいものはどれか

演習 12理解

ファイルシステムは通常、単独ではなく、より大規模なソフトウエアの一部として実装される。その大規模なソフトウエアは何と呼ばれるか

演習 13計算

CP/Mのファイル名は、最大8文字の「ファイル名」と最大3文字の「ファイルタイプ」をピリオドで区切る「8.3」命名規則に従う。次のうち、この規則に従っているものはどれか

このセクション: 0 / 5 問正解

4. CP/Mに見るオペレーティングシステムの3つの仕事

ファイルシステムはたいてい、もっと大きなソフトウエア——オペレーティングシステムの一部として実装される。その実例が、ガリー・キルダルが1970年代半ばにIntel 8080向けに開発したCP/M(Control Program for Micros)である。CP/Mを分解すると、オペレーティングシステムがやっている3つの仕事がはっきり見えてくる。ファイルに関する基本操作を提供すること、プログラムをメモリにロードして実行すること、そしてハードウエアへのアクセスを容易にするインタフェース(API)を提供すること。CCP・BDOS・BIOSという階層のおかげで、実際のハードウエアを知る必要があるのはいちばん下のBIOSだけになる——これが「デバイスインディペンデント」の正体であり、プログラムが機種を越えて動く理由でもある。

8ビットマイクロプロセッサの時代に最も重要だったオペレーティングシステムがCP/M (Control Program for Micros)である。1942年生まれのガリー・キルダルが1970年代 半ばにIntel 8080向けに開発し、後にデジタル・リサーチ社を興した。

CP/Mのファイル名は8.3命名規則に従う。ピリオドの前が最大8文字のファイル名、後ろが 最大3文字のファイルタイプで、たとえばTXTはテキストファイル、COMはマシンコードのファイルを表す。 ディレクトリにファイル名と保存位置の情報を記録するので、ファイルの中身がディスク上で連続しない セクタにまたがっていても構わない。人間が読めるASCIIコードの並びがテキストファイル、 それ以外がバイナリファイルという区別もここで出てくる。

CP/M自体はディスクの最初のトラックに保存されている。電源を入れると、 ブートストラップローダと呼ばれる小さなROMのコードが最初のセクタを読み込んで実行し、 それが残りのCP/Mをメモリにロードする。この手順をブートすると言う—— S1で見た「最初の1本をどうやって入れるか」という問題への、実用的な答えである。

ロードが済んだ後のメモリ配置には意味がある。低位アドレスにシステムパラメータ、その上に トランジェントプログラムエリア(TPA)というユーザープログラム用の空き領域、そして 最高位アドレス側にCCP・BDOS・BIOSの3つが置かれる。CCP(コンソールコマンドプロセッサ)は プロンプトを表示してDIR・ERA・REN・TYPE・SAVEといったコマンドを受け付け、知らないコマンドを 打たれたときはCOMファイルのプログラム名とみなしてTPAにロードし実行する。

ここまで来ると、オペレーティングシステムがやっている仕事を3つに整理できる。

  1. ファイルに関する基本操作(作成・削除・読み書き)を提供すること
  2. プログラムファイルをメモリにロードして実行すること
  3. プログラムがハードウエアに容易にアクセスできる インタフェース(API)を提供すること

3つ目のアプリケーションプログラミングインタフェース(API)が、この章のいちばんの 山場である。CP/Mのプログラムは、レジスタに機能コードをセットして「CALL 5」を呼ぶだけで、キーボードの 読み取り・画面への出力・ファイル操作ができる。実機のキーボードやディスプレイの回路がどう組まれて いるかを、プログラム側は一切知らなくてよい——これが デバイスインディペンデントという言葉の意味である。

呼び出しの経路も整理されている。「CALL 5」はBDOS(基本ディスクオペレーティングシステム)へ渡り、 BDOSはファイルシステムを管理しながら、必要に応じてBIOS(基本I/Oシステム)を呼ぶ。実際に キーボード・ディスプレイ・ディスクのハードウエアに触れるのはBIOSだけである。 機種ごとの違いをBIOSが吸収してくれるからこそ、CP/M用に書かれたプログラムは、8080系のCPUを積む 様々な機種でそのまま動く——移植性という利点がここで生まれる。

CP/Mのメモリ配置とAPI呼び出しの経路実際のハードウエアを知る必要があるのはBIOSだけ① CP/Mをロードした後のメモリ配置システムパラメータ0000hトランジェントプログラムエリア(TPA)ユーザープログラムはここにロードされる0100h〜CCPBDOSBIOS最高位アドレスCCP=コンソールコマンドプロセッサ/BDOS=基本ディスクオペレーティングシステム/BIOS=基本I/Oシステム低位アドレス高位アドレス② API呼び出しがたどる経路アプリケーションプログラムBDOS(ファイルシステム管理)BIOS(実ハードウエア制御)ハードウエアキーボード/ディスプレイディスクCALL 5アプリケーションはハードウエアに直接アクセスしない 機種ごとのハードウエアの違いを吸収するのはBIOSの役目。だから同じプログラムが別の機種でも動く
演習 14理解

8ビットマイクロプロセッサ時代に最も重要だったオペレーティングシステムCP/Mを開発したのは誰か

演習 15理解

本文が説明するオペレーティングシステムの3つの主要な機能に含まれないものはどれか

演習 16理解

CP/Mの内部はCCP(コンソールコマンドプロセッサ)・BDOS(基本ディスクオペレーティングシステム)・BIOS(基本I/Oシステム)という3つの部分に分かれている。この構造について正しい説明はどれか

演習 17理解

CP/M用に書かれたプログラムが、機種ごとのキーボードやディスプレイの実際の回路構成を知らなくても様々なコンピュータで動作できるのはなぜか

このセクション: 0 / 4 問正解

5. 歴史の分岐点 — MS-DOS・UNIX、そしてGUI時代への扉

8ビット時代のCP/Mが16ビット時代へ渡したバトンが、ティム・パターソンの書いたQDOSからMS-DOSへ至る系譜である。MS-DOSはCP/Mのファイルシステムを継承せずFAT方式を採り、1983年のMS-DOS 2.0ではUNIX由来の階層化ファイルシステム——ディレクトリの中にディレクトリを置ける仕組み——を取り入れた。そのUNIXは1970年代初期にベル研でケン・トンプソンとデニス・リッチーが作った移植可能なシステムで、複数の端末で処理を切り替える時分割から、複数のプログラムを同時に走らせるマルチタスクへと道を開く。そして本章は最後に、1980年代半ば以降で最も重要な流れとして、MacintoshやWindowsのようなグラフィカルなシステムの登場を予告して幕を閉じる。

CP/Mは、次の世代に大きな影響を与えた。シアトル・コンピュータ・プロダクツ社の ティム・パターソンがIntelの16ビットチップ8086/8088向けに書いた QDOS(Quick and Dirty Operating System)がそれである。QDOSは86-DOSと名を変え、 マイクロソフト社にライセンスされてMS-DOSとなり、1981年発売の最初のIBM Personal Computerに搭載された(IBM機ではPC-DOSとも呼ばれた)。8ビット時代のCP/Mから16ビット時代の MS-DOSへ、バトンが渡った瞬間である。

MS-DOSはCP/Mのファイルシステムをそのまま継承せず、ファイルアロケーションテーブル(FAT) 方式を採った。ディスクをクラスタという単位に分け、FATが各クラスタについて「次のクラスタはどれか」を 記録していく。プログラムは64KB以下のCOMと、それより大きいEXEの2種類。APIも初期は「CALL 5」式 だったが、後にソフトウエア割り込み(INT 21h)を使う方式が新しいインタフェースとして推奨された。

そして1983年発売のMS-DOS 2.0が、ハードディスク対応のために 階層化ファイルシステムを導入する。あるファイルがそれ自体ディレクトリ——他の ファイルのリスト——となり、通常のディレクトリ(ルートディレクトリ)の中にさらに別のディレクトリ (サブディレクトリ、今日のフォルダ)を置けるようになった。この発想はUNIXから 借りてきたものである。

そのUNIXは、1970年代初期にベル研究所でケン・トンプソンデニス・リッチーが開発した。MITやGEと共同開発していたMulticsの簡略版として 始まり、様々なコンピュータで動く「移植可能」な設計と、テキストファイルを共通分母にして ユーティリティをつなげていく考え方——いわゆるUNIX哲学——を持っていた。AT&Tの独占禁止裁判の影響で 1973年から大学・企業・政府に広くライセンスされ、単一のバージョンではなく多数の派生版が並び立つ ことになる。

UNIXはもともと、大型計算機を時分割(タイムシェアリング)で使うために書かれた。 複数の端末(ディスプレイとキーボードの組)の間で処理をすばやく切り替え、全員に同時対応している ように見せる方式である。ここから、複数のプログラムを同時に走らせるマルチタスクの オペレーティングシステムへ話が進む。シングルタスクのCP/MやMS-DOSより複雑になるのは避けられない ——ファイルを同時に共有する仕組み、メモリを各プログラムへ割り当てるメモリ管理、 メモリが足りなくなったときに使っていないブロックを一時ファイルへ退避する仮想メモリ が必要になりうる。近年の流れとしては、リチャード・ストールマンが興したフリーソフトウエア ファンデーションとGNUプロジェクト、そしてリーナス・トーヴァルズが書いたUNIX互換のカーネル Linuxが挙げられる。

下のシミュレータは、この「すばやく切り替えて同時に見せる」仕組みを、1つのCPUと3つのプログラムで 再現したものである。「再生」を押すと各プログラムに与えられた持ち時間が減っていき、尽きた瞬間に 割り込みが入って、実行中の状態を退避してから次のプログラムへCPUが渡る。切り替え回数が積み上がる ほど、3つのプログラムが同時に動いているように見えてくる——マルチタスクの種明かしを自分の目で 確かめてほしい。

さわって確認時分割 — 1つのCPUを3つのプログラムで順番に使う
切り替え回数: 0
ブラウザ
動画を再生中
残り 6
エディタ
コードを編集中
待機中
音楽アプリ
曲を再生中
待機中

CPUを使用中:ブラウザ

  • 「再生」または「1ステップ」を押すと、割り込みと切り替えのログがここに表示されます

3つのプログラムは同時に動いているように見えますが、実際は1つのCPUを持ち時間ごとに 順番に使っているだけです。持ち時間が切れると割り込みが入り、オペレーティングシステムが 実行位置やレジスタの中身を退避してから、次のプログラムの状態を復元してCPUを渡します。 複数の端末に同時対応しているように見せる時分割(タイムシェアリング)も、 複数のプログラムを同時に走らせるマルチタスクも、この高速な切り替えの繰り返しでできています。

そして第22章は、1980年代半ば以降で最も重要な流れを予告して幕を閉じる。 グラフィクスや視覚的に豊かなビデオディスプレイを取り込んだ、アップルのMacintoshや マイクロソフトのWindowsのような大きく洗練されたシステムの登場である。

ただし正直に書いておくと、その予告が本格的に描かれるのは本コースの最終講 (第18講・第25章)であって、次講ではない。次講「不動点、浮動点」では視点をいったん巻き戻し、 ここまで整数だけを扱ってきたコンピュータが小数をどう表現するのかという、数値表現の最後の 話題に向き合うことになる。本文の予告先とコースの次講がずれるのは演出ではなく、本書の構成上の 事実である。

演習 18理解

シアトル・コンピュータ・プロダクツ社のティム・パターソンがIntelの16ビットチップ(8086/8088)向けに書き、後にマイクロソフト社にライセンスされて「MS-DOS」となり、1981年発売の最初のIBM Personal Computerに搭載されたオペレーティングシステムは、元々何と名付けられていたか

演習 19理解

1983年発売のMS-DOS 2.0で導入された「階層化ファイルシステム」の説明として正しいものはどれか

演習 20理解

第22章の最後で、著者は1980年代半ば以降のオペレーティングシステムの動向として最も重要なものを予告している。それはどれか

このセクション: 0 / 3 問正解