■ Windows XPではMS-DOSのアプリケーションが動く。MS-DOSはリアル・モードで動作するOSなのに,なぜそのアプリケーションがプロテクト・モードのWindowsで動くのだろうか。しかも,MS-DOSは16ビット・プログラムである。どうして32ビット・プログラムと共存して動いているのであろうか。
■ 今回は,MS-DOSとWindowsの共存関係についてその発展の歴史から説き起こし,どうしてそのような仕組みになっているのかを解説する。

(2005年12月号「本当に知っている?Windows XPの基礎[アーキテクチャ編]」より)

(中島 省吾=メディアプラネット)



 今,パソコンを扱っている人に「最も有名なOSは何か」と問えば,それは迷うことなく「Windows」と答えるだろう。しかし,20年前に同じ質問をしたら,多分その答えは「MS-DOS」だったはずである。MS-DOSの誕生秘話は,後で触れるとして,今回のテーマは「WindowsでMS-DOSアプリケーションが動作する仕組み」である。


△ 図をクリックすると拡大されます
図1●Windows上では,複数のMS-DOSプログラムが実行できる
 今どきMS-DOSのアプリケーションを使い続けている人はほとんどいないと思うが,それでもMicrosoftは,MS-DOSとの互換性にこだわってきた。最新のWindows XPにおいても「コマンド・プロンプト」と呼ぶ実行環境で,すべてとは言わないまでもMS-DOSのコマンド・ライン・アプリケーションが実行できる(図1)。この背景には,常に過去の資産を継承できなければ,OSは生き残れないという,一種の強迫観念のようなものが働いていたのかもしれない。それは現代においても同じだろう。64ビットWindowsは,Itanium版より互換性が高いx64版の方が,特にデスクトップ市場では受け入れられているという事実がある。

 それにしてもWindowsとMS-DOSの関係は,それほど単純なものではない。過去にはWindows 9x系の中に残るMS-DOSのコードが厄介な問題を引き起こしていたし,その呪縛を完全に切り離したといわれるNT系のWindowsは,逆にMS-DOSとの互換性を犠牲にせざるをえなかった。ならば,Windows 9x系の「DOSプロンプト」とNT系の「コマンド・プロンプト」は何が違うのだろうか。

 今回は,この「MS-DOS」の歴史的な経緯をたどりながら,Windowsとの関係,そしてWindowsがどのようにMS-DOSのプログラムを実行しているのが,その仕組みを解説することにする。

MS-DOSの誕生
 MS-DOSは,1981年にIBMが同社初のパソコンとして開発した「IBM-PC」向けのOSである。正確にはIBMの「MS-DOS」は「PC-DOS」と呼ぶが,中身は同じである。このOSの開発を担当したのはMicrosoftとなっている。しかし,本当のところは少し違う。

 当初IBMは,既に8ビットCPUのOSとしてスタンダードであった,Digital Researchの「CP/M」というOSを「IBM-PC」に採用する予定だった。ところが「IBM-PC」は,16ビットCPU「8088」を搭載するため,そのままでは動作しない。そこで「IBM-PC」の言語製品を担当していたMicrosoftとともに,CP/Mを16ビットCPUへ移植するようDigital Researchに交渉へ向かった。これは決裂してしまうが,その結果,Microsoft自身がOSを開発することになった。しかし,納期は目の前に迫っていながら,MicrosoftにOSの開発実績は無かった。そこで,目を付けたのが,Seattle Computer Products社の「86-DOS」である。この「86-DOS」はCP/Mを独自に8086へ移植したもので,Microsoftは,このSeattle Computer Productsを開発者ごと買収して「86-DOS」をIBM-PC用に手直しさせる。こうして完成したのが「PC-DOS」である。

 ところで,8088と8086という2つのCPUが登場したが,この2つは同じCPUだと思ってかまわない。実際には8086が先に発売されたのだが,8088の方は,外部のデータ・バスだけ8ビットに縮小してある。こちらのCPUを「IBM-PC」が採用した理由は,当時まだ主流だった8ビット周辺部品を「IBM-PC」に流用できたためと言われている。

 さて,何とか納期に間にあった「PC-DOS」だが,Microsoftが他社にOEM供給する際には,自社の商標である「MS」を付け「MS-DOS」と呼んだ。つまりソフトウエアの権利をIBMに売ってしまうのではなく「IBM-PC」の出荷台数に対して使用料を受け取るようにライセンス契約したのだ。これが後に,大変な富をMicrosoftにもたらすことになる。

 この「IBM-PC」の成功で,日本のパソコンも次々とMS-DOSを採用していく。例えば,NECからは「PC-9801」と呼ばれるパソコンが発売後ベストセラーとなるが,このパソコンもMS-DOSを採用していた。その結果,日本のパソコンもOSならMS-DOSということになっていく。このようにしてMS-DOSは不動の地位を確立していった。

8086に強く依存した作りのMS-DOS
 MS-DOSの誕生が,Intelの8086/8088(以降8086に統一する)というCPUと深い関係にあることは理解していただけたと思うが,もう少し具体的に8086とMS-DOSを見ていくことにしよう。


△ 図をクリックすると拡大されます
図2●MS-DOS実行時の8086のメモリー空間
 図2は,MS-DOSが読み込まれた時の物理メモリーの状態である。8086というCPUは,20ビットのアドレス・バスを持っている。従って,アクセスできるアドレス空間は図のように1Mバイトである。その中でも下位の640Kバイトは「コンベンショナル・メモリー」と呼び,MS-DOSやユーザー・プログラムがロードされる。また,一番下位のアドレスの「割り込み」(割り込みベクター)は,OSの機能を呼び出す場合に利用する。

 例えばMS-DOSの場合,アプリケーションがOSの機能を呼び出すために「INT21」と呼ぶ割り込みを実行すると,割り込みベクターの21番地に参照しに行く。ここには呼び出したいMS-DOSの処理が置かれているアドレスが書いてあり,今度はそちらへ移行してMS-DOSの処理を実行する。これが終了すると,割り込みの機能により,アプリケーションの割り込みが発生した場所へ,自動的に処理が戻ってくるのである。

 コンベンショナル・メモリー以外の領域は,主にROM(読み出し専用メモリー)領域とVRAM(ビデオRAM)領域に分けられる。ROM領域は,ハードウエアにアクセスするための共通機能とOSが起動するまでに必要な最低限の機能がROMに書き込まれており,この機能を利用するときは,ここにアクセスする。またVRAM領域は画面用の領域で,ここにデータを書き込むと画面へ出力される。


△ 図をクリックすると拡大されます
図3●セグメント方式のアドレス指定
 ところで8086は,20ビットのアドレス・バスを持っているにもかかわらず,そのアドレスを格納するレジスタは16ビットしかない。つまりこのままでは,64Kバイトのアドレス空間しか指定できないことになる。ではどうするのかというと,この16ビットのレジスタを2個使うのである。片方を「セグメント・レジスタ」,もう1つは「オフセット・レジスタ」と呼ぶ。そしてセグメント・レジスタの値を16倍してベースとなるアドレスを作り,さらにオフセット・レジスタの値をベースとなるアドレスに加えることで最終的なアドレス位置を決める。このような2段階のアドレス指定方式を「セグメント方式」と呼んでいる(図3)。

 なぜこのような面倒な方法を取るのかというと,8086以前のCPUである8080との互換性を維持するためだ。8080はアドレスを指定するレジスタが16ビット幅で,アドレス空間は64Kバイトとなっていた。このプログラムをそのまま8086でも動かそうと考えたため,1つのレジスタの幅を,8080と同じ16ビットにしたのだ。

 このようにIntelは,x86系と総称するCPUでは,たとえ面倒でも,以前のCPUとの互換性を保持してきた。この考え方は,今のPentiumにも受け継がれているし,だからこそユーザーの支持を維持できたとも言える。