Chapter 3 プロセス仮想マシン(第一回)

他のマシン(ABI)向けにコンパイルされたプログラムを仮想マシンを使って動かせるようにしましょう、というお話。
そういったプログラムを動かすためには、システム全体を仮想マシンで扱う方法もありますが、ここでは他のマシン向けのプロセスに仮想環境を提供して、動かせるようにする。ゲストプロセスは、ランタイムの仮想環境によってホストプロセスと同等に扱えるようになる。それを表したのが下図。


仮想マシンの実装

典型的なプロセス仮想マシンの構成を下図に示しました。

ここでは、構成要素の説明をします。

  • ローダーは、ゲスト用のメモリイメージにコードとデータを書き込みます。
  • その後、ローダーは初期化に移行する。初期化ブロックでは、コードキャッシュや補助のテーブルのためにメモリを確保します。さらに、初期化ブロックはホストOSにシグナルハンドラをもうける。
  • エミュレーションエンジンは、インタープリットとバイナリ変換のどちらか、もしくは両方を使用してゲストプロセスの命令をエミュレートします。バイナリ変換を使う場合、変換されたターゲットコードはコードキャッシュに保持されます。
  • コードキャッシュマネージャは、どの変換されたコードをキャッシュするか、といったことを管理します。
  • OSコールエミュレータは、ゲストプロセスが発行したシステムコールのエミュレートを担当します。
  • 仮想環境では、must handle trapsやゲストプロセスに対する割り込みに対処する必要があります。この部分は、例外エミュレータが担当します。

互換性

ある種の仮想マシンでは、100%の互換性が必要とされることもありますが、プロセス仮想マシンでは必ずしも100%の互換性を実現する必要はありません。実際、Digital FX!32では、互換性があると保証されたwindowsプログラムのリストを作っています(それ以外のプログラムは、動かない可能性があるということ)。
互換性の議論をする際に、厳密な方法で互換性を示すのは非常に難しいため、ここでは互換性を調べるためのフレームワークを設定しましょう。

状態遷移

[続きは後で]