仮想DOSマシン(VDM )とは、既に別のオペレーティングシステムがハードウェア上で動作し、制御している状況下で、16ビット/32ビットのDOSプログラムや16ビットのWindowsプログラムを実行できるようにする技術を指します。
仮想DOSマシンは、一般的なソフトウェアエミュレーション方式(動的再コンパイルなど)のみで動作させることも、 Intel 80386プロセッサの仮想8086モードを利用することもできます。仮想8086モードでは、保護されたハードウェアへのアクセスを伴うすべての操作を捕捉し、それらを通常のオペレーティングシステムに(例外として)転送することで、リアルモードの8086ソフトウェアを制御された環境で実行できます。その後、オペレーティングシステムはエミュレーションを実行し、DOSソフトウェアの実行を再開できます。
VDMは一般的に、16ビットおよび32ビットのプロテクトモードソフトウェア(DOSエクステンダー)の実行をサポートする機能も実装しており、これはDOSプロテクトモードインターフェイス(DPMI)に準拠する必要があります。[ 1 ]
VDM内で実行されているDOSプログラムが周辺機器にアクセスする必要がある場合、Windowsはこれを直接許可するか(まれ)、またはオペレーティングシステムの機能を使用してハードウェアをエミュレートする仮想デバイスドライバ(VDD)をDOSプログラムに提供します。VDMには、Intel 8259A割り込みコントローラ、8254タイマーチップ、8237 DMAコントローラなどのエミュレーションが体系的に備わっています。[ 1 ]
1985 年 1 月、Digital Research はIntel と共同でConcurrent DOS 286 1.0 [ 2 ]をプレビュー公開しました。これは、 80286の保護モードでリアルモード DOS プログラムを実行できるConcurrent DOSのバージョンです。 [ 2 ]しかし、B-1 ステッピングのプロセッサ チップで考案されたこの方法は、Digital Research が製品をリリースする直前の 1985 年 5 月には C-1 以降のプロセッサ ステッピングでは動作しなくなりました。E-1 ステッピングでは、Intel は 1985 年 8 月にこの問題に対処し始め、Digital Research の「8086 エミュレーション モード」が文書化されていないLOADALLプロセッサ命令を使用して再び動作するようになりましたが[ 3 ] [ 4 ]、実用的であるには遅すぎました。E -2 ステッピングのマイクロ コードの変更により、速度が再び向上しました。[ 5 ] [ 6 ]この初期の実装は、実際の仮想 DOS マシンの前身と見なすことができます。
最終的に、Concurrent DOS 286 は、潜在的なデスクトップ オペレーティングシステムから、1986 年に産業用途向けのFlexOS 286へと再設計されました。 [ 7 ] [ 8 ]また、1986 年にIBMの4680 OSにもライセンス供与されました。 [ 9 ] [ 10 ]
Intelの80386とその仮想8086モードが利用可能になったとき(1985年10月からサンプルとして、1986年6月から量産として)、Digital Researchはこれを使用して、Concurrent DOS 386 1.0(1987年2月)[ 11 ]およびFlexOS 386 1.0 (1987年6月) [ 12 ]の下で、仮想DOSマシンで保護モードでリアルモードDOSプログラムを実行するように切り替えました。しかし、これらのマルチユーザーマルチタスク保護モードオペレーティングシステムのアーキテクチャは、それ自体がDOSベースではありませんでした。
Concurrent DOS 386は後にマルチユーザーDOS(1991年以降)およびREAL/32 (1995年以降)へと発展した。FlexOS 386は1993年に4690 OSとなった。
これらの保護モードのオペレーティングシステムとは対照的に、DOSはデフォルトではリアルモードのオペレーティングシステムであり、メモリマネージャやDOSエクステンダーが拡張メモリへのアクセスを提供したり、通常のDOSプログラムがアクセスできる最初のメガバイトにメモリをマップしたりするためにのみ、保護モードや仮想86モードに切り替わります。
DOS ベースの VDM は、1987 年 9 月にMicrosoft の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 システムによって実行されるようにシステム ドメインに渡されることです。
アーキテクチャにおいて Windows 3.x 386 拡張モードと同様に、Novell DOS 7のEMM386 3.xx [ 1 ] [ 14 ] Caldera OpenDOS 7.01 [ 14 ] [ 15 ] DR-DOS 7.02 [ 16 ] (およびそれ以降) も、オプションが使用されている場合に、複数の DOS アプリケーションのプリエンプティブ マルチタスクをサポートするために DOS ベースの VDM を使用します。 [ 14 ] [ 15 ] [ 16 ]このコンポーネントは、1991 年以来、 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 ]
OS/2 におけるWindows 3.1以降のWin32sアプリケーションのシームレスな統合は、 Windows 7におけるWindows Virtual PCに基づくXP モードのシームレスな統合と表面上は類似した概念です。「ゲスト」 VDM または NTVDM のリダイレクタにより、OS/2 または NT 「ホスト」のディスクへのアクセスが可能になります。「ゲスト」内のアプリケーションは、名前付きパイプを使用して「ホスト」と通信できます。[ 18 ]
技術的な制限により、OS/2 上の DOS および 16 ビット Windows アプリケーションは 2 GB を超えるハードドライブ領域を認識できませんでした。[ 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をロードし、NTIO.SYS はNTDOS.SYSをロードします。NTDOS.SYSは変更されたCOMMAND.COMを実行して、コマンドライン引数として NTVDM に渡されたアプリケーションを実行します。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と 5.50 を報告するように変更され、より多くのプログラムが変更なしで実行できるようになりました。[ 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 ) では利用できないため、NTVDM はこれらのバージョンの NT では Insignia のSoftPCからライセンスされたコードを使用して完全なエミュレータとして実装されています。[ 1 ] Windows NT 3.51までは80286 エミュレーションのみが利用可能です。Windows NT 4.0では486エミュレーションが追加されました。[ 24 ]
NTVDMは、64ビット版Windowsや、Windows RT、Windows 10 IoT CoreなどのARM32ベースのバージョンには含まれていません。このコンポーネントを含む最後のWindowsバージョンはWindows 10で、Windows 11では32ビットプロセッサのサポートが終了しました。
Windows XPには、MS-DOSサブシステム用の以下の16ビットコマンドが含まれています。 [ 18 ]
2010 年 1 月、Google のセキュリティ研究者Tavis Ormandy は、Windows NT の VDM 実装に重大なセキュリティ上の欠陥があることを明らかにしました。この欠陥により、権限のないユーザーが権限をSYSTEMレベルに昇格させることが可能になり、1993 年以降のすべての x86 バージョンの Windows NT カーネルのセキュリティに適用可能とされました。これには、すべての 32 ビット版の Windows NT、2000、XP、Server 2003、Vista、Server 2008、および Windows 7 が含まれます。 [ 25 ] Ormandy は、この脆弱性の概念実証エクスプロイトを公開しました。 [ 26 ] Microsoft がセキュリティ パッチをリリースする前は、この問題の回避策は 16 ビット アプリケーション サポートを無効にすることでしたが、これにより古いプログラム (DOS および Windows 3.1 用に作成されたもの) の実行が妨げられました。NTVDM サブシステムが含まれていないため、64 ビット版の Windows は影響を受けません。[ 27 ] [ 28 ]影響を受けるオペレーティングシステムに Microsoft のセキュリティ パッチが適用されると、VDM を安全に再有効化できます。[ nb 2 ]
Windows XP 16 ビットサブシステムには制限があります (ただし、以前のバージョンの Windows NT にはありません)。これは、GDI オブジェクトのセッションごとの制限が引き上げられたため、GDI ハンドルを 32 ビットから 16 ビットに変換する際に、ハンドルが 2 ビット右にシフトされるためです。[ 29 ]その結果、実際のハンドルは 14 ビットより大きくすることはできず、GDI システムによって 16384 より大きいハンドルが提供される 16 ビットアプリケーションはクラッシュしてエラー メッセージとともに終了します。[ 29 ]
一般的に、VDMや類似の技術では、今日のコンピュータで古いDOSゲームを十分に動作させることはできません。エミュレーションは最も基本的な周辺機器のみに対応しており、実装も不完全な場合が多いです。例えば、NTVDMのサウンドエミュレーションは非常に限定的です。WindowsのNT系バージョンは、DOSプログラムが画面に書き込む際に、実際の画面を1秒間に数回しか更新せず、高解像度グラフィックモードをエミュレートしません。ソフトウェアはほとんどの場合、ホストCPUの速度でネイティブに実行されるため、すべてのタイミングループが途中で終了してしまいます。そのため、ゲームの動作が速すぎるか、応答を待つ時間が短すぎるためにエミュレートされたハードウェア周辺機器を認識できないかのどちらかになります。
x86-64 CPUでは、仮想 8086 モードは、ネイティブの 64 ビットロング モードではなく、レガシー モード (16 ビットおよび 32 ビットのオペレーティングシステムを実行する場合) でのみサブ モードとして使用できます。[ 30 ] NTVDM は、アドレス指定に必要な 16 ビット セグメントを有効にするためにローカル ディスクリプタ テーブルの代わりに VM86 CPU モードを使用するため、Windows の x86-64 エディションではサポートされていません。[31] DOS プログラムもサポートされていません。[ 32 ]また、Microsoftは以前の互換性のないアーキテクチャのように、この互換性のない命令セット用の完全なエミュレータをリリースしていないため、 Windows のAArch64 (または ARM64) バージョン ( Windows RTなど) では NTVDM は使用できません。
NTVDM は、Windows の x86-64 および AArch64 バージョンではサポートされていませんが、Windows 7の非ホーム バージョンや VMware Workstation などの仮想化ソフトウェアを使用して実行することは可能です。その他の方法としては、ReactOSのバージョン[ 34 ]または WineVDM/OTVDM (下記参照) [ 35 ]を使用する方法があります。
Linux および Mac OS X 用のWineおよびCrossOverには、 MAMEの i386 エミュレーションと人気の Windows 互換レイヤーであるWineの 16 ビット部分に基づいた WineVDM (OTVDM とも呼ばれる)が含まれています。[ 35 ]また、64 ビット版の Windows には NTVDM サブシステムが含まれていないため (上記参照)、Windows 自体にも移植されています。[ 36 ]
"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat\VDMDisallowed"=dword:00000000。{{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite book}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite journal}}: CS1メンテナンス: 非推奨のアーカイブサービス (リンク) [リンク削除済み]{{cite journal}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)