DOSエクステンダ

概要

DOSエクステンダは、アプリケーションソフトウェアが、MS-DOS環境下においてx86CPUのプロテクトモードを利用するためのプログラムである。通常は、MS-DOSより起動され、DOSエクステンダ専用のアプリケーションソフトの実行を可能にする。他にも、MS-DOS用のプログラムをマルチタスクで稼働させるものや、グラフィカルユーザインタフェースを提供するものなど、DOSエクステンダと、その上で実行されるプログラムの種類に応じて、様々な機能が提供される。
MS-DOS上では通常、メモリアドレスは1メガバイト以内、CPU命令も16bit用のそれしか用いることができず、例え32bitCPUであっても、実質的には高速な16bitCPUとしてのみ利用され、CPUが32bitである意味は薄かった。しかし、386|DOS-Extender などの32bit命令/メモリアドレスに対応したDOSエクステンダを用いる事により、MS-DOSを経由して32bit環境を構築する事が可能となり、種々の制約に縛られながらも、16bit環境と比較すればアプリケーションのパフォーマンスは大幅に向上した。
また、副次的なことながら、従来のMS-DOSプログラムでほぼ必須であったIntel 8086由来の制限による複雑なメモリモデルやC言語でのポインタ制御、セグメント切り替えなどの必要性が、事実上ほぼ撤廃され、これにより開発効率の向上や、更なる速度面での優位性も確保されている。このことは、従来のMS-DOS環境では、連続して扱えるメモリ領域(リニアメモリ)が64KiB、もしくは1MiBに過ぎなかったことに起因する。Windowsの、Microsoft Windows 3.x以前のもの及びMicrosoft Windows 9x系も、技術的にはDOSから起動されプロテクトモードで稼働する、DOSエクステンダの一種、ないし、一体化しているDOSエクステンダ上で稼働するデスクトップ環境と言える。
プロテクトモードで稼働するアプリケーションは、通常のEXEフォーマットのプログラムではなく、提供されるDOSエクステンダ専用にコンパイルされたプログラムでないと実行できない。またDOSエクステンダごとに実行可能なプログラムの形式は異なり、たとえばRUN386でGO32用にコンパイルされたプログラムを実行することはできない。この事は、DOSエクステンダが、その有用性が認識されながらも、大きく普及が進まなかった要因の1つとなった。
DOSエクステンダには、DESQviewや、PharLap Softwareが開発した386|DOS-Extender (RUN386)等がある。RUN386はPC/AT互換機用、PC-9800シリーズ用、FMRシリーズ用とFM TOWNS用が存在し、機種依存のBIOS等を直接利用しない限りどの機種でも同じプログラムを実行できる。なおRUN386用の実行プログラムの拡張子は.EXP（EXecutable Programの略とされている）である。
現在ではWindowsの普及で、DOSエクステンダはその役目を失いつつある。

技術的特徴

MS-DOSでアクセス可能なメモリ空間（コンベンショナルメモリ）は、最大でも640KB(PC/AT互換機およびPC-9800シリーズ等)から768KB (PC-H98等)であった。8086はアドレス空間が1Mバイトしか無かったため、最大で16Mバイトまで使用できる80286をインテルは発表するが、16Mバイトまでメモリが使用できる16ビットプロテクトモードをサポートしたのは、当初はOS/2等のマルチタスクOSだけであった。しかしながら80286や上位互換の80386は、マルチタスクOSを快適に使用するには速度不足であったし、当時のPCは複数のアプリケーションソフトウェアを同時に実行するには実装しているメモリが不足していた。そのため多くのユーザーはMS-DOSを利用しつづけたのである。
やがてMS-DOS上でメモリ容量が不足してくると、様々な方法でMS-DOSで利用可能なメモリ容量を拡張する試みがなされた。それらの内、80286で導入されたプロテクトモードを使用してアドレス空間の大きさそのものを拡張することにより、MS-DOS上でアプリケーションで利用可能なメモリ容量を拡張するソフトウェアがDOSエクステンダである。
一般にDOSエクステンダはシングルタスクであったので、これらの低速なCPUでも快適に利用できたし、せいぜい数Mバイト程度しかプロテクトメモリが実装されていなかったPCにおいても、1つのアプリケーションでそれらのメモリを独占的に利用できたので十分な容量であったといえた。またメモリの拡張方法としてはアドレス空間そのものを拡張するため、バンク切り換え処理とページフレームに出現しているメモリのページ管理が不要な分EMSより高速でありメモリ管理に手間がかからない方法であった。
DOSエクステンダは擬似OSと呼ばれMS-DOSを拡張するものである。プロテクトメモリの管理は独自に行うもののファイルシステム等はMS-DOSに依存する。そのため同時にオープン可能なファイル数はMS-DOSと変わるところは無いなど、MS-DOSの制限をかなり受けた。DOSエクステンダは、プロテクトモードアプリケーションからは、プロテクトメモリをサポートするMS-DOSのように見え、一方MS-DOSからは、DOSアプリケーションとして振舞う。つまりアプリケーションとOSの両方の性質をもったソフトウェアであった。

DOSエクステンダの動作

プロテクトモードアプリケーションがDOSエクステンダに対してファイルアクセスなどのファンクションコールを実行すると、DOSエクステンダはCPUをリアルモード（場合によっては仮想86モード）に切替えて、自身が受けたDOSエクステンダのファンクションコールをMS-DOSのファンクションコールに翻訳してMS-DOSを呼び出す。ファイルアクセスのような、大量のデータをMS-DOSとやり取りするファンクションコールのために、コンベンショナルメモリ上にリアルモードとプロテクトモード間のデータ通信用のバッファ領域が必要となることに注意しなくてはならない。なぜならMS-DOSはプロテクトメモリを直接アクセスできないからである。
例えば、ファイル読み出しの場合には、MS-DOSのファンクションコールを利用して、このコンベンショナルメモリ上にある通信バッファ領域にデータを読み出した後、DOSエクステンダはCPUをプロテクトモードに切替えて、読み込んだデータを通信バッファからプロテクトメモリに転送する。この時データサイズが大きくて、一度に通信バッファに読込みきれない場合には、CPUを再びリアルモードに切替えて、残りのデータを通信バッファに読み出すように再度MS-DOSにファンクションコールを発行して、ファイルデータの残りの部分の読み出しを行う。そしてデータサイズが極めて大きい場合には、このリアルモードとプロテクトモードの交互切替えの繰返しによるファイル上のデータのプロテクトメモリへの読込を行う。
このように、アプリケーションの実行中に何度もプロテクトモードとリアルモードの切替えが行われることもDOSエクステンダの特徴の一つである。
DOSエクステンダ起動時のプロテクトモードアプリケーションのプロテクトメモリへの読み出しも、上記と同様のシーケンスを経て行われる。
アプリケーションをプロテクトメモリに全て読み込み終えると、DOSエクステンダはCPUをプロテクトモードに切替え、アプリケーションを実行する。
アプリケーションが終了すると、確保したプロテクトメモリを全て開放しCPUをリアルモードへ切替えて、DOSエクステンダはMS-DOSアプリケーションとして終了する。

DOSエクステンダの機種依存部分

CPUをリアルモードからプロテクトモードに切替えることはCPU単体で行えるが、DOSエクステンダというものは基本的に機種依存するソフトウェアである。一つの実行ファイルで複数の機種に対応したDOSエクステンダも存在するが、それは対応する機種分だけ機種依存コードを内部に持っているだけのことである。
以下にDOSエクステンダの機種依存部分について記す。

プロテクトメモリ確保

DOSエクステンダは、その性質上、起動時にそのハードウェアで利用可能なプロテクトメモリを確保する必要があるが、MS-DOSは元来リアルモード用のOSであるために、直接プロテクトメモリを管理する機能を有していない。そのため、DOSエクステンダがプロテクトメモリを確保するためには、プロテクトメモリ管理用のデバイスドライバを用意する方法もあるが、基本的にはプロテクトメモリBIOSあるいはMS-DOSの拡張としてメーカーが用意した固有のファンクションコールを直接呼び出して、そのハードウェアで利用可能なプロテクトメモリを確保することになる。プロテクトメモリBIOSおよびメーカー固有のファンクションコールの仕様は、機種依存するので、DOSエクステンダが直接プロテクトメモリBIOSを呼び出すということは、DOSエクステンダが機種依存することになる。

アドレスライン20(A20)制御

80286や上位互換のCPUを搭載したPC/AT互換機やPC-9800シリーズでは、8086/88を搭載した旧機種との互換性を取るために、起動直後はCPU周辺の回路によって外部に出力するアドレスライン20(A20)を強制的に0にしているが、プロテクトメモリを利用するためには、このアドレスライン20をCPUから出力されるアドレスに切り換える（A20オン）制御を行わなくてはならない。しかし、A20をオンにするためのI/Oポートアドレス等は機種によって異なるので、DOSエクステンダに限らずプロテクトメモリを利用するソフトウェアは基本的に機種依存することになる。

割り込み再配置

x86系のCPUは、最初の8086がリリースされた時に、割り込みベクトル 0～ 0x1F をCPU例外用に予約されていたにもかかわらず、IBM PC や PC-9800シリーズは、この予約領域の一部を BIOS やハードウェア割り込みの処理のために割り当ててしまった。そのため、80286が開発されて例外が追加されると、CPU例外とBIOSやハードウェア割り込みの割り込みベクトルが衝突するようになった。80286以降のCPUで追加された例外は、その殆どがプロテクトモードに関連したものであった。そのため、リアルモードで処理をしている場合には、この衝突は殆ど問題にならなかったのだが、プロテクトモードでは割り込みベクトルの衝突が問題になった。そのため、プロテクトモードを利用するために、割り込みコントローラの設定を変更して、効率的にハードウェア割り込みのハンドリングを行うためにハードウェア割り込みの割り込みベクトルを変更する実装があった。この割り込みベクトルの変更処理を割り込み再配置という（BIOSもプロテクトモードで利用するためには、割り込みベクトルの再配置が必要だが、プロテクトモードからはBIOSを呼び出さないことにして衝突を回避する方法もある）。割り込みコントローラは、PC/AT互換機もPC-9800シリーズもFMRシリーズも8259を使用していたが、その接続しているI/Oアドレスが異なるために、割り込みベクトル再配置処理は機種依存する。よって、プロテクトモードを使用するために割り込み再配置処理が必要なので、DOSエクステンダは機種依存することになる。なおFMR/FM TOWNS シリーズは、予め割り込みベクトルが衝突しないように割り込みコントローラやBIOSの割り込みベクトルが割り当てられているので、割り込み再配置は必要ない。
割り込みの再配置は必須ではなく、あくまでも効率的にハードウェア割り込みを処理するための手段の一つである。実際には割り込みを管理する8259に対して割り込み要因の確認（ポール・ワードの読み出し）を行うことで、ハードウェア割り込みを再配置しなくとも、割り込みハンドラはハードウェア割り込みなのかソフトウェア割り込み（フォルトおよびトラップ）なのかを認識することが可能である。

仮想記憶対応

32ビットDOSエクステンダは、標準またはオプションでIA-32のページング機能を利用した仮想記憶をサポートして、物理メモリより大きなメモリを利用可能にしている場合が多い。
仮想記憶により物理メモリより大きいメモリを利用出来るようにするためには、ページ不在が検出されて該当ページをディスクからロードする必要が起こった場合に、ディスクにスワップアウトするページを決定する必要があるが、スワップアウトするページとなる利用頻度の低いページを探すために、ページの利用状況の統計を取っておかねばならない。
この処理のためには、インターバルタイマーの割り込みハンドラを組み込む必要があるが、割り込みハンドラとその組込みプログラムは、機種毎にI/Oアドレスの異なる割り込みコントローラを制御する必要があるので、機種依存プログラムとなる。
そのため仮想記憶をサポートするDOSエクステンダは機種依存する。

CPUリセット回路(16ビットDOSエクステンダの場合)

「DOSエクステンダの動作」の項で解説したように、DOSエクステンダはリアルモードとプロテクトモードを交互に切り換えながら動作する。ところが80286は、プロテクトモードからリアルモードに切り換える方法がCPUリセットしかないため、プロテクトモードからリアルモードへの切り換えが必要なプログラムのためにPC/AT互換機やPC-9800シリーズは、CPUのみをリセットする回路を装備していた。このCPUのみをリセットする回路は機種毎に異なっていたので、80286対応のDOSエクステンダ（当然16ビットDOSエクステンダとなる）のようなプロテクトモードからリアルモードへの切り換えが必要なプログラムは必然的に機種依存することとなった。また80286をリセットすると、アドレス 0FFFFF0hにジャンプするが、リアルモードに遷移後、処理をDOSエクステンダに戻すためには、この領域にあるプログラム（プロテクトモードBIOSの一種）の助けを必要とするが、BIOSの仕様も機種によって異なるということに注意が必要である。つまり32ビットよりも16ビットDOSエクステンダの方がPC/AT互換機対応版から他機種への移植の手間が多かったのである。なお、PC/AT互換機対応の16ビットDOSエクステンダをPC-9800シリーズ等に移植する場合に、移植作業の手間を少しでも減らすために、サポートするCPUを386以上に限定することにより、CPUリセット回路の制御とCPUリセットBIOSに関する移植を回避しているケースもあった。