仮想 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]をプレビューしました。 [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 [16] (およびそれ以降) も、オプションが使用されている場合、複数の DOS アプリケーションのプリエンプティブマルチタスクをサポートするために DOS ベースの VDM を使用しています。[14] [15] [16]このコンポーネントは、1991 年[注 1]以来、コード名「Vladivar」(当初は EMM386 のモジュールではなく、独立したデバイスドライバー[1] [14]でした) でDigital Research / Novellで開発されていました。 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 機能とコマンドが欠落しています。
INT 21h/AH=30hINT 21h/AX=3306h
16ビットWindowsアプリケーションは、デフォルトでは単一のNTVDMプロセス内の独自のスレッドで実行されます。NTVDM自体は32ビットプロセスであり、システムの他の部分に対してプリエンプティブマルチタスクで実行されますが、その中の16ビットアプリケーションは互いに協調的にマルチタスクで実行されます。「実行」ボックスまたはアプリケーションのショートカットファイルで「別のメモリ空間で実行」オプションをオンにすると、各16ビットWindowsアプリケーションは独自のNTVDMプロセスを取得し、他のプロセス(他の16ビットWindowsアプリケーションを含む)に対してプリエンプティブマルチタスクで実行されます。NTVDMは、BIOSコールとテーブル、Windows 3.1カーネル、16ビットAPIスタブをエミュレートします。[21] 32ビットWoW変換層は16ビットAPIルーチン をサンクします。
32ビットDOSエミュレーションは、DOSプロテクトモードインターフェース(DPMI)と32ビットメモリアクセスのために存在します。この層は、DOS機能に必要な拡張メモリ呼び出しをWindows NTメモリ呼び出しに変換します。wowexec.exeは、16ビットWindowsをエミュレートするエミュレーション層です。Windows XPではSound Blaster 2.0エミュレーションが追加されました。[22] 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エミュレーションが追加された。[23]
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ビットバージョンが含まれる。[24] Ormandyはこの脆弱性の概念実証エクスプロイトを公開した。 [25] Microsoftがセキュリティパッチをリリースする前は、この問題の回避策は16ビットアプリケーションのサポートをオフにすることで、これにより古いプログラム(DOSおよびWindows 3.1用に作成されたもの)の実行が防止されていた。NTVDMサブシステムが含まれていないため、64ビットバージョンのWindowsは影響を受けない。[26] [27]影響を受けるオペレーティングシステムにMicrosoftのセキュリティパッチを適用すると、VDMを安全に再度有効化できるようになります。[注 2]
Windows XPの16ビットサブシステムには制限が存在する(Windows NTの以前のバージョンには存在しない)。これは、GDIオブジェクトのセッションあたりの制限が引き上げられたためであり、GDIハンドルを32ビットから16ビットに変換すると、ハンドルが2ビット右にシフトされる。[28]その結果、実際のハンドルは14ビットより大きくすることができず、結果として、GDIシステムによって16384を超えるハンドルが提供される16ビットアプリケーションはクラッシュし、エラーメッセージを表示して終了する。[28]
一般に、VDM や類似の技術では、今日のコンピュータ上でほとんどの古い DOS ゲームを満足に実行できません。エミュレーションは最も基本的な周辺機器に対してのみ提供されており、実装が不完全な場合がよくあります[要出典]。たとえば、NTVDM のサウンド エミュレーションは非常に制限されています。NT ファミリ バージョンの Windows は、DOS プログラムが実際の画面に書き込むときに 1 秒間に数回更新するだけで、高解像度のグラフィック モードをエミュレートしません。ソフトウェアは主にホスト CPU の速度でネイティブに実行されるため、すべてのタイミング ループが早期に期限切れになります。これにより、ゲームの実行速度が非常に速くなるか、応答を待つ時間が十分ではないため、ソフトウェアがエミュレートされたハードウェア周辺機器に気付かなくなることがあります。
x86-64 CPUでは、仮想8086モードは、レガシーモード(16ビットおよび32ビットオペレーティングシステムを実行するため)のサブモードとしてのみ使用でき、ネイティブ64ビットロングモードでは使用できません。[29] NTVDMは、DOSプログラムを含むx86-64エディションのWindowsではサポートされていません。 [ 30 ]これは、NTVDMが、アドレス指定に必要な16ビットセグメントを有効にするために、ローカル記述子テーブルではなくVM86 CPUモードを使用するためです。[31] NTVDMは、 AArch64 (またはARM64)バージョンのWindows( Windows RTなど)でも使用できません。これは、Microsoftが以前の互換性のないアーキテクチャとは異なり、この互換性のない命令セット用の完全なエミュレータをリリースしなかったためです。
NTVDMはWindowsのx86-64版およびAArch64版ではサポートされていませんが、Windows 7の非ホーム版のWindows XP ModeやVMware Workstationなどの仮想化ソフトウェアを使用することで実行できます。その他の方法としては、 ReactOS由来のNTVDM [33]や、 MAMEのi386エミュレーションと人気のWindows互換レイヤーであるWineの16ビット部分に基づく16ビットWindowsインタープリターであるOTVDM(WineVDM)を使用する方法があります(WineVDMに関する以下のセクションを参照)。[34]
LinuxおよびMac OS X用のWineおよびCrossOverには、WineVDM(OTVDMとも呼ばれる)と呼ばれるVDMが含まれています。64ビット版WindowsにはNTVDMサブシステムが含まれていないため、Windowsにも移植されています(上記参照)。[35] [非一次資料が必要]
"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat\VDMDisallowed"=dword:00000000。