仮想 DOS マシン( VDM ) とは、別のオペレーティング システムが既に実行されていてハードウェアを制御している場合でも、16 ビット/32 ビットDOSおよび16 ビット Windowsプログラムを実行できるようにするテクノロジを指します。
仮想DOSマシンは、一般的なソフトウェアエミュレーション手法(例:動的再コンパイル)のみで動作することも、 Intel 80386プロセッサの仮想8086モードを利用することもできます。仮想8086モードでは、保護されたハードウェアへのアクセスを伴うすべての操作を捕捉し、それらを通常のオペレーティングシステム(例外として)に転送することで、リアルモード8086ソフトウェアを制御された環境で実行できます。その後、オペレーティングシステムはエミュレーションを実行し、DOSソフトウェアの実行を再開できます。
VDMは通常、 DOS保護モードインターフェース(DPMI)に準拠する必要がある16ビットおよび32ビットの保護モードソフトウェア(DOSエクステンダー)の実行もサポートします。[ 1 ]
VDM内で動作するDOSプログラムが周辺機器にアクセスする必要がある場合、Windowsは(稀に)直接アクセスを許可するか、オペレーティングシステムの機能を用いてハードウェアをエミュレートする仮想デバイスドライバ(VDD)をDOSプログラムに提供します。VDMは、Intel 8259A割り込みコントローラ、8254タイマーチップ、8237 DMAコントローラなどのエミュレーションを体系的に備えています。[ 1 ]
1985年1月、デジタル・リサーチ社はインテル社と共同で、80286のプロテクトモードでリアルモードDOSプログラムを実行できるコンカレントDOSのバージョンであるConcurrent DOS 286 1.0をプレビューしました。[ 2 ] B - 1ステッピングプロセッサチップ用に考案されたこの方法は、1985年5月に、デジタル・リサーチ社が製品をリリースする直前のC-1以降のプロセッサステッピングでは動作しなくなりました。E-1ステッピングでは、インテル社が1985年8月に問題に対処し始め、デジタル・リサーチ社の「8086エミュレーションモード」が、文書化されていないLOADALLプロセッサ命令を使用して再び動作するようにしましたが、[ 3 ] [ 4 ]実用的であるには遅すぎました。E -2ステッピング用のマイクロコードの変更により、速度が再び向上しました。[ 5 ] [ 6 ]この初期の実装は、実際の仮想DOSマシンの前身と見なすことができます。
最終的に、コンカレントDOS 286は、1986年にデスクトップオペレーティングシステムとして開発され、産業用途向けのFlexOS 286になりました。 [ 7 ] [ 8 ]また、1986年にはIBMの4680 OS向けにライセンス供与されました。 [ 9 ] [ 10 ]
仮想8086モードを備えたIntelの80386が利用可能になると(1985年10月からサンプルとして、1986年6月から量産)、Digital Researchはこれを使用して、Concurrent DOS 386 1.0(1987年2月)[ 11 ]およびFlexOS 386 1.0(1987年6月)の下で、保護モードの仮想DOSマシンでリアルモードDOSプログラムを実行するように切り替えました。[ 12 ]ただし、これらのマルチユーザーマルチタスク保護モードオペレーティングシステムのアーキテクチャ自体はDOSベースではありませんでした。
Concurrent DOS 386は後にMultiuser DOS(1991年以降)およびREAL/32 (1995年以降)へと発展しました。FlexOS 386は1993年に4690 OSとなりました。
これらの保護モードのオペレーティング システムとは対照的に、DOS は、デフォルトではリアル モードのオペレーティング システムであり、拡張メモリへのアクセスを提供したり、通常の DOS プログラムがアクセスできる最初のメガバイトにメモリをマップしたりするために、メモリ マネージャと DOS エクステンダに代わってのみ保護モードと仮想 86 モードに切り替えます。
DOSベースのVDMは、1987年9月にマイクロソフトのWindows/386 2.01で登場しました。[ 13 ] DOSベースの仮想DOSマシンは、386拡張モードで動作するWindows 3.0、3.1x、Windows for Workgroups 3.1x 、およびWindows 95、98、98 SE 、 MEにも存在しました。DOS上で動作するこれらのソリューションの特徴の1つは、仮想DOSマシン内に示されるメモリレイアウトがDOSシステムの仮想インスタンスであり、マルチタスクがロードされる前にDOSドライバ構成が実行され、保護モードで処理できない要求がシステムドメインに渡されて、基礎となるDOSシステムによって実行されることです。
Novell DOS 7のEMM386 3.xx はアーキテクチャ上 Windows 3.x 386 拡張モードに似ており、[ 1 ] [ 14 ] Caldera OpenDOS 7.01、[ 14 ] [ 15 ] DR-DOS 7.02 ] (およびそれ以降) でも、オプションが使用されている場合、複数の DOS アプリケーションのプリエンプティブ マルチタスクをサポートするために DOS ベースの VDM を使用しています。[ 14 ] [ 15 ] [ 16 ]このコンポーネントは、1991 年[注 1 ]からDigital Research / Novellで開発されており、コード名 "Vladivar" (当初は EMM386 のモジュールではなく、独立したデバイス ドライバー[ 1 ] [ 14 ]でした) です。 1994年にNovell DOS 7としてリリースされたDR DOSの次のメジャーバージョンのために主に開発されましたが、[ 1 ] [ 14 ] 1992年から1993年にかけてリリースされなかったDR DOS「Panther」と「Star Trek 」プロジェクトでも使用されました。 EMM386 /MULTIKRNL386.SYS
1992年以降、 OS/2 2.0以降では、多重仮想DOSマシン(MVDM)が使用されている。[ 1 ] [ 4 ] OS/2 MVDMはNTVDMよりもかなり強力である。例えば、ブロックデバイスがサポートされており、様々なバージョンのDOSをOS/2 MVDMで起動することができる。[ 17 ] OS/2 1.xのDOSボックスはDOS 3.0をベースにしていたが、OS/2 2.xのMVDMはDOS 5.0をエミュレートする。[ 1 ]
Windows 3.1以降のWin32アプリケーションをOS/2にシームレスに統合する概念は、表面的にはWindows 7におけるWindows Virtual PCベースのXP Modeのシームレス統合に似ています。「ゲスト」VDMまたはNTVDMのリダイレクタは、OS/2またはNTの「ホスト」のディスクへのアクセスを可能にします。「ゲスト」アプリケーションは、名前付きパイプを使用して「ホスト」との通信を行うことができます。[ 18 ]
技術的な制限により、OS/2上のDOSおよび16ビットWindowsアプリケーションは2GBを超えるハードドライブ容量を認識することができませんでした。[ 19 ]これはArcaOS 5.0.4で修正されました。 [ 20 ]

NTVDMは、1993年のWindows NT 3.1のリリース以降、Windows NTファミリーのすべてのIA-32エディションのシステムコンポーネントです。16ビットWindowsおよび16ビット/32ビットDOSアプリケーションの実行を可能にします。単一のDOS(またはWindows 3.x )環境の基盤となるWindows NT 32ビットユーザーモード実行ファイルは、ntvdm.exeと呼ばれます。[ 1 ]
DOS プログラムを実行するために、 NTVDM はNTIO.SYSをロードし、次にNTDOS.SYSをロードし、NTVDM にコマンドライン引数として渡されたアプリケーションを実行するために、変更されたCOMMAND.COMを実行します。 16 ビットのリアルモード システム ファイルは、 MS-DOS 5.0の同等のIO.SYS、MSDOS.SYSおよびCOMMAND.COM [ 1 ]から派生したもので、 FAT ファイル システムの固定の仮定がすべて削除され、無効なオペコード0xC4 0xC4を使用して 32 ビットの NTVDM に飛び込んで要求を処理します。[ 1 ]当初、 NTDOS はプログラムに DOS バージョン 30.00 を報告していましたが[ 1 ] 、すぐにバージョン 5.00 atおよび 5.50 atを報告するように変更され、より多くのプログラムを変更せずに実行できるようになりました。[ 1 ]これは最新のWindowsでも当てはまります。MS-DOSバージョン6.xおよびWindows 9xで導入された多くの追加のMS-DOS機能とコマンドが欠落しています。 INT21h/AH=30hINT21h/AX=3306h
Windows 2000のNTVDMには、NTブランドがないため頻繁にクラッシュしたり不安定になったりするというよく知られた問題があり、ビル・ゲイツとジム・オールチンの2ヶ月に及ぶ議論がきっかけとなった。[ 21 ]
16ビットWindowsアプリケーションは、デフォルトでは単一のNTVDMプロセス内の独自のスレッドで実行されます。NTVDM自体は32ビットプロセスであり、システムの他の部分に対してプリエンプティブマルチタスクで実行されますが、その中の16ビットアプリケーションは互いに協調的にマルチタスクで実行されます。「実行」ボックスまたはアプリケーションのショートカットファイルで「別のメモリ空間で実行」オプションをオンにすると、各16ビットWindowsアプリケーションは独自のNTVDMプロセスを取得し、他のプロセス(他の16ビットWindowsアプリケーションを含む)に対してプリエンプティブマルチタスクで実行されます。NTVDMは、BIOSコールとテーブル、Windows 3.1カーネル、16ビットAPIスタブをエミュレートします。[ 22 ] 32ビットWoW変換層は16ビットAPIルーチン をサンクします。
32ビットDOSエミュレーションは、DOSプロテクトモードインターフェース(DPMI)と32ビットメモリアクセスのために存在します。この層は、DOS機能に必要な拡張メモリ呼び出しをWindows NTメモリ呼び出しに変換します。wowexec.exeは、16ビットWindowsをエミュレートするエミュレーション層です。Windows XPではSound Blaster 2.0エミュレーションが追加されました。[ 23 ] 16ビット仮想デバイスドライバとDOSブロックデバイスドライバ(例:RAMディスク)はサポートされていません。他のサブシステムとのプロセス間通信は、OLE、DDE、および名前付きパイプを介して行うことができます。
仮想8086モードはx86ベース以外のプロセッサ(具体的にはMIPS、DEC Alpha、PowerPC )では利用できないため、これらのバージョンのNTではNTVDMがInsigniaのSoftPCからライセンスされたコードを使用して完全なエミュレータとして実装されている。[ 1 ] Windows NT 3.51までは80286エミュレーションのみが利用可能であった。Windows NT 4.0では486エミュレーションが追加された。[ 24 ]
NTVDMは、Windowsの64ビット版、およびWindows RTやWindows 10 IoT CoreなどのARM32ベース版には含まれていません。Windows 11では32ビットプロセッサ のサポートが廃止されたため、このコンポーネントを含む最後のWindowsバージョンはWindows 10です。
Windows XPには、MS-DOSサブシステム用の以下の16ビットコマンドが含まれています。 [ 18 ]
2010年1月、Googleのセキュリティ研究者Tavis Ormandyは、Windows NTのVDM実装に、権限のないユーザーが権限をSYSTEMレベルに昇格できるという重大なセキュリティ上の欠陥があることを明らかにした。これは、1993年以降のWindows NTカーネルのx86版すべてのセキュリティに当てはまると指摘されている。これには、Windows NT、2000、XP、Server 2003、Vista、Server 2008、Windows 7のすべての32ビット版が含まれる。[ 25 ] Ormandyはこの脆弱性の概念実証エクスプロイトを公開した。 [ 26 ] Microsoftがセキュリティパッチをリリースする前は、この問題の回避策は16ビットアプリケーションのサポートをオフにすることで、これにより古いプログラム(DOSおよびWindows 3.1用に作成されたもの)の実行が防止されていた。64ビット版のWindowsは、NTVDMサブシステムが含まれていないため、影響を受けない。[ 27 ] [ 28 ]影響を受けるオペレーティングシステムにMicrosoftのセキュリティパッチを適用すると、VDMを安全に再度有効化できるようになります。[ nb 2 ]
Windows XP 16ビットサブシステムには制限が存在する(Windows NTの以前のバージョンには存在しない)。これは、GDIオブジェクトのセッションあたりの制限が引き上げられたためであり、GDIハンドルを32ビットから16ビットに変換すると、GDIハンドルが2ビット右にシフトされる。[ 29 ]その結果、実際のハンドルは14ビットより大きくすることができず、結果として、GDIシステムによって16384より大きいハンドルが提供される16ビットアプリケーションはクラッシュし、エラーメッセージを出して終了する。[ 29 ]
一般的に、VDMや類似の技術は、今日のコンピュータ上でほとんどの古いDOSゲームを満足に動作させることができません。エミュレーションは最も基本的な周辺機器に対してのみ提供されており、実装が不完全な場合も少なくありません。例えば、NTVDMのサウンドエミュレーションは非常に限定的です。NTファミリバージョンのWindowsは、DOSプログラムが実際の画面に書き込みを行う際に、1秒間に数回しか更新せず、高解像度のグラフィックモードをエミュレートしません。ソフトウェアは主にホストCPUの速度でネイティブに実行されるため、すべてのタイミングループは早期に期限切れになります。その結果、ゲームの実行速度が速すぎるか、応答を待つ時間が十分ではないため、ソフトウェアがエミュレートされたハードウェア周辺機器を認識しない状態になります。
x86-64 CPUでは、仮想8086モードは、レガシーモード(16ビットおよび32ビットオペレーティングシステムを実行するため)のサブモードとしてのみ使用でき、ネイティブ64ビットロングモードでは使用できません。[ 30 ] NTVDMは、DOSプログラムを含むx86-64エディションのWindowsではサポートされていません。 [ 31 ]これは、NTVDMが、アドレス指定に必要な16ビットセグメントを有効にするために、ローカル記述子テーブルではなくVM86 CPUモードを使用するためです。[ 32 ] NTVDMは、 AArch64 (またはARM64)バージョンのWindows( Windows RTなど)でも使用できません。これは、 Microsoftが以前の互換性のないアーキテクチャとは異なり、この互換性のない命令セット用の完全なエミュレータをリリースしなかったためです。
NTVDMはWindowsのx86-64版およびAArch64版ではサポートされていませんが、Windows 7の非ホーム版のWindows XP ModeやVMware Workstationなどの仮想化ソフトウェアを使用することで実行できます。その他の方法としては、 ReactOS由来のNTVDM [ 34 ]や、 MAMEのi386エミュレーションと人気のWindows互換レイヤーであるWineの16ビット部分に基づく16ビットWindowsインタープリターであるOTVDM(WineVDM)を使用する方法があります(WineVDMに関する以下のセクションを参照)。[ 35 ]
LinuxおよびMac OS X用のWineおよびCrossOverには、WineVDM(OTVDMとも呼ばれる)と呼ばれるVDMが含まれています。64ビット版WindowsにはNTVDMサブシステムが含まれていないため、Windowsにも移植されています(上記参照)。[ 36 ]
"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat\VDMDisallowed"=dword:00000000。