仮想DOSマシン

仮想 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 ]

同時DOS 8086エミュレーションモード

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ベースのVDM

これらの保護モードのオペレーティング システムとは対照的に、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

OS/2 MVDM

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 ]

Windows NTVDM

Windows 10のNTVDMで実行されるCOMMAND.COM

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.SYSMSDOS.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ディスク)はサポートされていません。他のサブシステムとのプロセス間通信は、OLEDDE、および名前付きパイプを介して行うことができます。

仮想8086モードはx86ベース以外のプロセッサ(具体的にはMIPSDEC AlphaPowerPC )では利用できないため、これらのバージョンの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の速度でネイティブに実行されるため、すべてのタイミングループは早期に期限切れになります。その結果、ゲームの実行速度が速すぎるか、応答を待つ時間が十分ではないため、ソフトウェアがエミュレートされたハードウェア周辺機器を認識しない状態になります。

x64およびAArch64アーキテクチャには存在しない

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 ModeVMware Workstationなどの仮想化ソフトウェアを使用することで実行できます。その他の方法としては、 ReactOS由来のNTVDM [ 34 ]や、 MAMEのi386エミュレーションと人気のWindows互換レイヤーであるWineの16ビット部分に基づく16ビットWindowsインタープリターであるOTVDM(WineVDM)を使用する方法があります(WineVDMに関する以下のセクションを参照)。[ 35 ]

ワインVDM

LinuxおよびMac OS X用のWineおよびCrossOverには、WineVDM(OTVDMとも呼ばれる)と呼ばれるVDMが含まれています。64ビット版WindowsにはNTVDMサブシステムが含まれていないため、Windowsにも移植されています(上記参照)。[ 36 ]

参照

注記

  1. ^ DR DOS「Panther」のKRNL386.SYSには著作権文字列「1991,1992」があります。
  2. ^無効にされた VDM は、対応するレジストリ キーを に設定し直すことで再度有効にすることができます"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat\VDMDisallowed"=dword:00000000

参考文献

  1. ^ a b c d e f g h i j k l mシュルマン, アンドリュー;ブラウン, ラルフ D. ; マクシー, デイビッド; ミシェルズ, レイモンド J. ; カイル, ジム (1994) [1993年11月]. 『Undocumented DOS: A programmer's guide to reserved MS-DOS functions and data structures - extending to include MS-DOS 6, Novell DOS and Windows 3.1 (第2版)』 マサチューセッツ州レディング:アディソン・ウェスリー. ISBN 0-201-63287-X(xviii+856+viページ、3.5インチフロッピー) 正誤表: [1] [2]
  2. ^ a b「Concurrent DOS-286 Challenges Unix」 BYTE Magazine 10 ( 5): 375– 377. 1985年5月. 2018年9月14日時点のオリジナルよりアーカイブ。 2017年1月23日閲覧[3]
  3. ^ 「Concurrent DOS 68K 1.2 - Motorola VME/10用開発キット - ディスク2」 1986年8月6日 [1986年4月8日] . 2018年9月13日閲覧(注: このパッケージには、 Concurrent DOS 286のヘッダー ファイルもいくつか含まれており、その中には「8086 エミュレーション」のLOADALL を明示的に示す STRUCT.H も含まれています。)
  4. ^ a bデイテル, ハーヴェイ・M.; コーガン, マイケル・S. (1992). OS/2の設計.アディソン・ウェスレー. ISBN 0-201-54889-5
  5. ^ Foster, Edward (1985-05-13). 「Super DOSは新型80286を待ち受ける – Concurrent DOS 286はIntelのチップアップグレードまで延期 – XenixのパワーとIBM PCとの互換性を提供」 InfoWorld . 7 ( 19). InfoWorld Media Group : 17–18 . ISSN 0199-6649 . 2019年4月3日時点のオリジナルよりアーカイブ。 2019年4月3日閲覧 
  6. ^ Foster, Edward (1985-08-26). 「Intelが新型80286チップを発表 – DRIのConcurrent DOS 286の将来はプロセッサ修正後も依然として不透明」 InfoWorld . 7 ( 34). InfoWorld Media Group : 21. ISSN 0199-6649 . 2019年4月3日時点のオリジナルよりアーカイブ。 2019年4月3日閲覧 
  7. ^ Intel iAPX 286ベースコンピューター向けFlexOS補足資料(PDF) . 1.3 (第1版). Digital Research, Inc. 1986年11月. 2019年4月3日時点のオリジナルよりアーカイブ(PDF) . 2018年8月14日閲覧
  8. ^ CBR編 (1987年1月15日). 「Digital Research、FlexOS 286リアルタイム製造オペレーティングシステムを発表」 . Computer Business Review . 2013年1月18日時点のオリジナルよりアーカイブ2018年9月15日閲覧。
  9. ^ Calvo, Melissa; Forbes, Jim (1986-02-10). 「IBM、DRIオペレーティングシステムを採用へ」 InfoWorld . 2019年4月3日時点のオリジナルよりアーカイブ。 2011年9月6日閲覧
  10. ^ 「IBM、PC AT小売システムにConcurrent DOS-286を選択」(PDF) . European Review (18). Digital Research : 1. 1986年3月. 2019年4月3日時点のオリジナルよりアーカイブ(PDF) . 2018年9月15日閲覧
  11. ^ Weiss, Jiri (1987-02-16). 「DRI マルチユーザー80386オペレーティングシステムをリリースへ」 InfoWorld 9 ( 7): 1, 8. 2019年4月3日時点のオリジナルよりアーカイブ。 2017年1月22日閲覧[4]
  12. ^ CBR編 (1987年6月3日). 「Digital Research、Real-Time FlexOS 386を披露」 . Computer Business Review . 2013年6月28日時点のオリジナルよりアーカイブ2011年9月6日閲覧。
  13. ^ Necasek, Michal (2011-05-21). 「Windows/386 2.01」 . OS/2 Museum. 2019年4月3日時点のオリジナルよりアーカイブ。 2019年4月2日閲覧
  14. ^ a b c d eポール、マティアス R. (1997-07-30) [1994-05-01]. 「NWDOS-TIPs — Novell DOS 7 に関するヒントとコツ、Blick の詳細、バグと回避策」MPDOSTIP。リリース 157 (ドイツ語) (第 3 版)。2016-11-03 のオリジナルからアーカイブ2014 年 9 月 6 日に取得(注: NWDOSTIP.TXT はNovell DOS 7およびOpenDOS 7.01に関する包括的な資料で、多くの未文書化の機能や内部構造の説明も含まれています。これは、著者が 2001 年まで維持し、当時多くのサイトで配布していた、より大きな MPDOSTIP.ZIP コレクションの一部です。提供されているリンクは、HTML に変換された NWDOSTIP.TXT ファイルの古いバージョンを指しています。) mpdostip.zip
  15. ^ a b OpenDOS開発者リファレンスシリーズ - OpenDOSマルチタスキングAPIガイド - プログラマーズガイド. 英国: Caldera, Inc. 1997年8月. Caldera部品番号: 200-DOMG-004. 2017年9月10日時点のオリジナルよりアーカイブ。 2016年11月2日閲覧
  16. ^ a b Caldera DR-DOS 7.02 ユーザーガイド. Caldera, Inc. 1998 [1993, 1997]. 2016年11月5日時点のオリジナルよりアーカイブ。 2014年9月6日閲覧
  17. ^ 「OS/2 Workplace Shell 設定テクニック」(PDF) . IBM redbook. 1994. pp.  68– 80. 2012年3月20日時点のオリジナル(PDF)からアーカイブ。 2011年7月5日閲覧
  18. ^ a b「MS-DOS サブシステムコマンド。Microsoft
  19. ^ 「なぜDOSおよびWin-OS/2セッションで2GB以上の空き容量が表示されないのか?」 Arca Noae . Arca Noae, LLC . 2021年7月7日時点のオリジナルよりアーカイブ。 2020年9月3日閲覧
  20. ^ “ArcaOS リリースノート” . 2020年8月31日 [2017年5月15日]. 2021年3月16日時点のオリジナルよりアーカイブ。 2020年9月3日閲覧
  21. ^ 「Wayback Machine」 . windows.microsoft.com . 2000年8月15日時点のオリジナルよりアーカイブ。 2026年1月10日閲覧
  22. ^ 「第27章 - Windowsの互換性と移行」 . Windows NT 4.0 リソースキット. Microsoft . 2014年2月20日. 2017年7月19日閲覧
  23. ^ Schulman, Jerold (2002年12月4日). 「Windows XPで実行されているMS-DOSプログラムのトラブルシューティング方法」 . ITPro Windows . 2017年7月19日閲覧
  24. ^ 「情報: Windows における浮動小数点演算の処理方法」 Microsoftサポート2006年11月21日。2013年2月24日時点のオリジナルよりアーカイブ。 2017年7月19日閲覧
  25. ^ 「Microsoft セキュリティ情報 MS10-015 - 重要: Windows カーネルの脆弱性により、特権が昇格される可能性がある (977165)」 .セキュリティ TechCenter . Microsoft . 2010年3月17日. 2012年11月2日閲覧
  26. ^ Ormandy, Tavis (2010-01-19). 「Microsoft Windows NT #GP トラップハンドラーにより、ユーザーがカーネルスタックを切り替えることが可能」 . CVE-2010-0232 .完全開示. 2013年4月13日閲覧。
  27. ^ Farrell, Nick (2010年1月20日). 「17年後に発見された古代のWindowsの欠陥」 . The Inquirer . Incisive. 2010年1月23日時点のオリジナルよりアーカイブ。 2010年1月21日閲覧
  28. ^ 「マイクロソフト セキュリティ アドバイザリ (979682): Windows カーネルの脆弱性により特権が昇格される可能性がある」 TechNet Microsoft 2010年1月20日2010年1月21日閲覧
  29. ^ a b Windows XP における「Win 16 サブシステムの実行を継続するにはリソースが不足しています」問題
  30. ^ Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル 統合巻: 1、2A、2B、2C、3A、3B、3C (PDF) (PDF). Intel . 2013年6月 [1997]. 325462-047US . 2013年7月2日閲覧
  31. ^ Klein, Helge (2008年3月11日). 「Windows x64 - すべて同じだが非常に異なる、パート5:NTVDM、サービス、WoW64」 . 2013年7月21日閲覧
  32. ^ 「64ビットWindowsの制限事項一覧」 Microsoft Corporation. 2007年10月11日. 2017年7月19日閲覧
  33. ^ "modify_ldt(2)" . Linuxプログラマーズマニュアル. 2019年7月21日閲覧。
  34. ^ 「ReactOSからのNTVDM」 . GitHub . 2018年11月3日閲覧。
  35. ^ "Winevdm" . GitHub . 2019年7月21日閲覧エドワード・メンデルソンの追加文書
  36. ^ "Otya128/Winevdm" . GitHub .

さらに読む