このプロジェクトは、Windows Hypervisor Platform(WHP)APIを利用して仮想CPUを作成するDOSエミュレーターであり、最新のWindowsシステムで仮想化された16ビットリアルモード環境内でDOSプログラムの実行を可能にします。
以前のWindows 3.1エミュレータでは、80286 CPUがソフトウェアで完全にエミュレートされました。ただし、このプロジェクトでは、ソフトウェアのDOSレイヤーのみをエミュレートしながら、CPUにハードウェア仮想化を使用して別のアプローチをとることにしました。
このエミュレーターは主にWHP APIのデモとして機能し、完全なDOSエミュレーターとして機能することを意図していません。フレームワークは簡単に拡張できるように設計されていますが、最小限のDOS機能が実装されており、いくつかのサンプルプログラムを実行するのに十分です。
エミュレータは、WHP APIを使用して仮想CPUを初期化し、PE(保護されたモードを有効にする)とPG(ページング)ビットがCR0レジスタで無効になっていることを確認することにより、リアルモードで実行するように構成します。
DOS実行可能ファイルはエミュレータホストにマッピングされ、適切な物理アドレスでゲストと共有され、実際のDOSシステムのメモリレイアウトがシミュレートされます。
ほとんどのDOS機能は、システムサービスの0x21やビデオ操作では0x10などの割り込みを介して発生します。これは、ソフトウェアで手動でエミュレートする必要があります。割り込みはVM出口を本質的にトリガーすることはなく、それらをキャプチャするために追加のトリックが必要です。これは、各割り込みがCPUID命令を指すカスタム割り込みベクトルテーブル(IVT)を実装することで簡単に対処されます。この構成により、割り込みが発生したときにVM出口がトリガーされることが保証され、エミュレータが割り込みをインターセプトして処理できるようになります。
DOSプログラムは、多くの場合、PCスピーカー、CMO、ハードウェアタイマーなどのI/Oポートを使用します。 I/Oリクエストは、VM出口out
トリガーin
、機能をエミュレートできるため、I/Oリクエストを簡単にキャプチャできます。現在、一般的なI/O要求の非常に小さなセットのみがサポートされています。
DOSプログラムは、タイミングを維持するためにさまざまな方法を使用しました。このエミュレータには、これらのメカニズムのいくつかのサポートが含まれています。
0000:046C
からBIOSカウンター値を返します。これは、メモリに直接アクセスする代わりに。8253ピットタイマーは、現時点では完全には実装されていません。
エミュレータはキーボード状態を監視し、単純なキーバッファーを維持し、必要に応じてキーボード割り込み(0x16)を介して情報をDOSプログラムに渡す。
基本的な端末コマンドがサポートされており、エミュレータがシンプルなテキストベースのゲームやその他の基本プログラムを実行できるようにします。
現在、エミュレータは、BIOSデータ領域やプログラムセグメントプレフィックス(PSP)などのシステムフィールドにスペースを割り当てています。ただし、BIOSカウンター値を除いて、これらのフィールドは現在居住していません。必要に応じて、追加のフィールドを入力できます。
テストは、Flareon 2023(Flaresay.exe、課題#6)の単純なDOSゲームを使用して実行されました。これは、主に当時のハードディスクで唯一のDOS実行可能ファイルだったためです。
このDOSエミュレーターに加えて、64ビット/32ビットのWindowsユーザーモードプログラムをエミュレートすることを目的とした同様の概念で、ある程度の成功を収めました。シミュレートされたCPL3環境を構築し、MSR_LSTARレジスタを引っ掛けることにより、実行可能ファイルをエミュレートし、システムコールでVM出口を強制することができます。これにより、エミュレータはシステムコールリクエストをホストOSにキャプチャして転送するか、インターセプトできます。この手法には多くの合併症が伴いますが、軽量のエミュレーターが役立つ可能性のある有効なユースケースがある場合があります。