1990年代にMS-DOS用のゲームをプレイしていた人なら一度は「DOS/4GW」のバナーを見たことがあるはず。DOS/4GWがいったい何をするツールでどのように機能していたのかについて、詳しい知識を持ったエキスパートたちがブログで解説しています。

Pikuma: DOS/4GW and Protected Mode

https://pikuma.com/blog/what-is-dos4gw-protected-mode



The popularity of DOS/4GW made Windows 95 game compatibility a little easier, but with higher stakes - The Old New Thing

https://devblogs.microsoft.com/oldnewthing/20230829-00/?p=108661

初代IBM PCが1981年に発売された時に搭載されていたCPUはIntel 8088です。Intel 8088は外部データバスが8bitで、メモリのアドレス空間は1024KB分しかありませんでした。さらに、1024KBのメモリを搭載したとしても、384KBは表示バッファ、拡張機能、BIOS、ROMなどの用途向けに予約されており、アプリケーションが利用できるのは下位の640KBのみとなっていました。1981年に開催されたコンピューター展示会において、Microsoft創業者のビル・ゲイツが「640KBあれば誰にとっても十分だ!」と発言したという伝説がありますが、後にビル・ゲイツは「そんな発言をしたことはない」と否定しています。



DOSではハードウェアに直接アクセスする行為が許可されていたため、アプリケーションは「0xA0000〜0x00000」のアドレスを指定して直接数値を書き換えることが可能でした。例えば、0xA0000の数値を直接書き換えることで画面左上のピクセルの色を変更できました。



この方式はプログラムから見えるメモリの番地が実際のメモリの番地と一致しているため、「リアルモード」と呼ばれています。仕様上、メモリ保護機能やマルチスレッド、複数プロセスの同時実行はサポートされていませんでした。

8088で成功を収めたIntelは、1982年にはIntel 80286という16bitのCPUを発売し、1985年には32bitのIntel 80386を発売。使用できるメモリ量の上限は、16bitのCPUで16MB、32bitのCPUで4GBまで拡張されました。Intelは8088との互換性を保ちつつ増加したメモリ空間にアクセスするために、CPUに2つのモードを搭載しました。1つは8088と同じ「リアルモード」で、もう1つが「プロテクトモード」です。Intelは互換性を維持するため、CPUの電源がオンになった際にまずリアルモードで起動し、状況に応じてプロテクトモードに移行できるように設定しました。

プロテクトモードでは、仮想メモリ、ページング、安全なマルチタスク、1MBを超える拡張メモリ空間へのアクセスなど多数の機能が利用可能になっています。ただし、MS-DOSはマルチタスクOSではなく、マルチスレッド機能が無いなどプロテクトモードの機能を発揮できませんでした。そのため、プロテクトモードの機能を利用したいアプリケーションは起動後に自分で必要なカーネルツールを用意してプロテクトモードに移行する必要がありました。

こうした問題を解決するために生み出されたのが「DOSエクステンダ」です。DOSエクステンダはマルチタスク、メモリ管理、メモリ保護、基本的なネットワークサポートなどのいくつかの基本サービスを提供する単なる小さなOSカーネルツールで、プログラマーはDOSエクステンダを利用することで簡単にプロテクトモードの機能を利用できるようになりました。



DOSエクステンダの中で最も人気があったのが「DOS/4GW」です。アプリケーション本体が起動する前に、DOS/4GWが起動してリアルモードからプロテクトモードに移行することで、MS-DOS向けのプログラムをまるで32bitOS向けのプログラムであるかのように記述することができるようになったとのこと。

時代が進み、最初からプロテクトモードで起動しているOSであるWindows 95が登場すると、アプリケーションがシステム全体の制御を引き継ぐことができなくなりました。こうしたマルチタスクOSではDPMI(DOSプロテクトモードインターフェイス)が導入されており、DPMIを通してMS-DOSアプリはプロテクトモードで起動することが可能でした。

DOS/4GWとDPMIは機能的に競合する部分がありますが、DOS/4GWは自身の機能をサーバーとクライアントの2つに分離することで対応したとのこと。DOS/4GWは起動時にDPMIサーバーが既に存在しているかを調べ、存在していない場合にのみ自身をDPMIサーバーとしてインストールするようになっています。既にDPMIサーバーが存在している場合にはDOS/4GWのクライアント部分のみが機能し、アプリケーションとDPMIサーバーとのやりとりを仲介する仕組みです。



この仕組みによって、MS-DOSのアプリケーションをWindows 95などのマルチタスクOSで動作させる際の互換性を大幅に向上することが可能になったとのこと。DOS/4GWクライアントとDPMIサーバーの通信で問題が発生した場合、その問題を修正するだけで多くのゲームで同様に問題が修正されるというわけ。修正できなかった場合は影響範囲が大きくなってしまうというハイリスク・ハイリターンのアプローチでしたが、ほとんどのゲームは正常に動作したと述べられています。