
前回、「MS-DOS互換」のFreeDOSを立ち上げると、フツーにコマンドプロンプトでさえ、V86(仮想86)モードで走ってることに気づきました。そしてその仕組みについてちょいと調べました。ここにも歴史アリ。今回は更なる疑問に迫るべく、DOS/4GWにお願いして「プロテクト・モード」上で走るプログラムを作成してみます。
※「トホホな疑問」投稿順Indexはこちら
※当方、テストに使っているFreeDOS環境は現物ではありませぬ。屋上屋を重ねた以下のような「仮想なやつ」っす。
-
- Windows 11 (64 bit) のパソコン上の
- WSL2上の
- Ubuntu 24.04オペレーティングシステム上の
- QEMUエミュレータ(x86_64のシステムモード)上の
- FreeDOS 1.3
まあ、多分、恐らくは、現物と変わらん挙動を示していると信じてます。
DOS/4G と DOS/4GW
DOS Extenderという御言葉は一般名詞?のハズですが、日本では米Phar Lap社の「386|DOS-Extender」が超有名(今では誰も知らんかも)だったので、そちらで覚えている方(多分、ほぼ確実に年寄、同年代)が多いじゃないかと思います。 富士通様が、CD-ROM標準装備でプッシュした「FM TOWNS」に登載のDOS Extenderだったからね。
DOS/4Gは、Rational Systems(Tenberry Software)という会社製の「また別な」DOS Extenderみたいです。古のMS-DOSベースのGameの有名どころが結構使っていたらしいです。そしてFreeDOSの「推し」のDOS Extenderみたいです。なぜかというとFreeDOSの「推し」のCコンパイラをみやれば、
DOS/4GWというものが大活躍です。なお、DOS/4GWはDOS/4Gの無償限定版、でWatcom Cに同梱されていた、ということみたいです。FreeDOSの多くのツールはOpen Watcom C/C++(Watcom Cの灰の中から不死鳥のように蘇ったオープンソース版らしい)で書かれているのでFreeDOSでは無くてはならないものみたいです。
ただし、単体のDOS/4GWコマンドというものは無いみたい。基本、DOS/4GWに依存するアプリのオブジェクトの中に密に組み込まれ、そのアプリが起動されるとともに活躍を始めるという仕組みみたいです。
DOS/4GW(DPMI)とVCPIは共存しているのね?
前回、FreeDOSが仮想86モードで走っているのはEMMドライバであるJEMMEXが含むVCPIホストの仕業である、と知りました。しかし、さらに調べていくと、DOS/4GWのランタイムの中に
DPMI(DOS PROTECT MODE INTERFACE) ホスト
が含まれているのでした。あれれ、プロテクト・モードを「仕切る」プログラムがまた出てきたじゃん! 食い合わないの?
ま、調べてみたら抜かりはないのでした。VCPIはプリミティブなあたりのみ面倒を見てくれていて、DOS/4GW上で走るアプリの方は自分の中にあるDPMIの方にいろいろお願いしているみたいです。両者ちゃんと分担が成されているみたい。知らんけど。
DOS/4GW用にプログラムをコンパイルして本当にプロテクトモードか確認
ぶっちゃけ、DOS/4GWランタイムの上で走るようにプログラムを書けば、プロテクト・モード(仮想86モードではない)内でプログラムが実行されるハズ。
そこで、気になるシステム・フラグどもを確認するプログラムを作ってみました。Open Watcom Cコンパイラ用のソースです。肝心なところはインライン・アセンブラっす。
#include <stdio.h> void main() { unsigned long int _u32_cr0=0; unsigned long int _u32_eflags=0; _asm { .386p mov eax, cr0 mov _u32_cr0, eax pushfd pop eax mov _u32_eflags, eax } printf("CR0(MSW)=%08X\n",_u32_cr0); printf("EFLAGS =%08X\n",_u32_eflags); }
Open Watcom Cのインラインアセンブラについては、以下の過去回にて練習してます。
ソフトな忘却力(52) FreeDOS、OpenWatcom C、インラインアセンブラ
上記の短いプログラムでは、CR0(LSB側の16ビットは286時代には MSW と呼ばれていた。386以降、32ビットのCRレジスタの最初の1本という位置づけになってCR0と呼ばれるようになった)とEFLAGS(8086のFLAGS部分をLSB側の16ビットに持つ拡張FLAGレジスタ)の2つを読み出して、その値をプリントしてます。
気になっているのは以下のフラグね。
CR0(下16ビットはMSW)
-
- PE(ビット0、プロテクトモード
- PG(ビット31、ページングイネーブル
EFLAGS
-
- VM(ビット17、仮想86モード
FreeDOS(エミュレータ上のカリソメな存在だけれども)上で上記プログラムを走らせた結果が以下に。
プロテクテッドモードで、ページングもイネーブル、ついでに言うと80387相当のハードウエアFPUも在、そして仮想86フラグは降りて(フツーのプロテクテッドモード)ます。
DOS/4GWにお願いすれば、即386プロテクト・モードの世界に入れるっと。やったね。