(57)【要約】【課題】  仮想マシンにおいて合成命令を使用するためのシステム及び方法を実現することにより、より改善された仮想化を可能とする。【解決手段】  本発明は、トラップを生じさせる１組の「合成命令」を提供して、仮想マシン（ＶＭ）が命令を安全に処理する機会を提供することにより、ｘ８６プロセッサアーキテクチャの欠点を補償する。ｘ８６アーキテクチャには「イリーガル」であるが、それでも、仮想マシンが理解することができる命令を使用することにより、それらの合成命令を使用して、ｘ８６プロセッサに対する従来の命令によって実行された場合、問題があるが、ｘ８６プロセッサシステムに関するはるかに改良されたプロセッサ仮想化を提供する明確に定義されたアクションを仮想マシンにおいて実行する方法である。【選択図】  図１０
2005122711.tif 000002
【特許請求の範囲】
【請求項１】
ＩＡ３２アーキテクチャを含むが、該アーキテクチャには限定されないｘ８６プロセッサアーキテクチャ及び同等のアーキテクチャにおけるプロセッサ仮想化を改良するための方法であって、
ｘ８６プロセッサ上で動作する仮想マシンに関する仮想化に悪影響を与えるゲストオペレーティングシステムにおける１つまたは複数の事前定義された命令を削除する、置き換える、または補足するステップ
を備えことを特徴とする方法。
【請求項２】
前記１つまたは複数の命令は、ＰＵＳＨ  ＣＳ、ＰＵＳＨ  ＳＳ、ＳＳからのＭＯＶ、ＣＡＬＬＦ、ＶＥＲＲ、ＶＥＲＷ、及びＬＡＲの命令グループのメンバを含む
ことを特徴とする請求項１に記載の方法。
【請求項３】
ｘ８６プロセッサ上の仮想化に悪影響を与える命令は、前記ｘ８６プロセッサにおいて例外を生じさせる合成命令によって置き換えられるか、または補足され、該例外が、前記ｘ８６プロセッサ上で実行されている仮想マシンによって前記仮想マシンによる処理のためにトラップされる
ことを特徴とする請求項１に記載の方法。
【請求項４】
第２の仮想マシン上で実行されている第１の仮想マシンに関して、命令が、前記ｘ８６プロセッサにおいて例外を生じさせる合成命令によって置き換えられるか、または補足され、該例外が、前記第２の仮想マシンを実質的に迂回することにより、前記ｘ８６プロセッサ上で実行されている前記第１の仮想マシンによって前記仮想マシンによる処理のためにトラップされる
ことを特徴とする請求項３に記載の方法。
【請求項５】
前記合成命令は、ユーザモードと特権モードの両方で使用可能である
ことを特徴とする請求項３に記載の方法。
【請求項６】
前記合成命令は、既存のｘ８６命令に対する帰結を有さない
ことを特徴とする請求項３に記載の方法。
【請求項７】
前記合成命令は、直接実行（例えば、ＶＭＤＸＤＳＢＬ）を無効にするための命令である
ことを特徴とする請求項３に記載の方法。
【請求項８】
前記合成命令は、直接実行（例えば、ＶＭＤＸＥＮＢＬ）を有効にする（または再び有効にする）ための命令である
ことを特徴とする請求項３に記載の方法。
【請求項９】
合成命令で置き換えられる命令に関して、前記合成命令は、置き換えられる前記命令に意味的に類似している
ことを特徴とする請求項３に記載の方法。
【請求項１０】
５バイト未満の長さの命令は、少なくとも５バイトの長さの合成命令で置き換えられる（例えば、パッチングを容易にするため）
ことを特徴とする請求項９に記載の方法。
【請求項１１】
ＳＴＩ命令は、少なくとも５バイトの長さの合成命令（例えば、ＶＭＳＴＩ）で置き換えられる
ことを特徴とする請求項１０に記載の方法。
【請求項１２】
ＣＬＩ命令は、少なくとも５バイトの長さである合成命令（例えば、ＶＭＣＬＩ）で置き換えられる
ことを特徴とする請求項１０に記載の方法。
【請求項１３】
前記ゲストオペレーティングシステムにおけるＣＰＵＩＤ命令は、仮想化されたＣＰＵＩＤ情報を読み取る合成命令（例えば、ＶＭＣＰＵＩＤ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項１４】
前記ゲストオペレーティングシステムにおける少なくとも１つのマルチプロセッサスピンロック命令は、スピンロック獲得が失敗した場合を特定するための合成命令（例えば、ＶＭＳＰＬＡＦ）で補足される
ことを特徴とする請求項３に記載の方法。
【請求項１５】
前記ゲストオペレーティングシステムにおけるＰＵＳＨＦ（Ｄ）命令は、ＩＦをスタック上にプッシュする合成命令（例えば、ＶＭＰＵＳＨＦＤ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項１６】
前記ゲストオペレーティングシステムにおけるＰＯＰＦ（Ｄ）命令は、ＩＦをポップしてスタックから外す合成命令（例えば、ＶＭＰＯＰＦＤ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項１７】
前記ゲストオペレーティングシステムにおいて記述子テーブルエントリを変更する命令は、前記記述子テーブルエントリを更新する合成命令（例えば、ＶＭＷＲＤＥＳＣ）で置き換えられて、シャドー記述子テーブルを保持することに関連するオーバーヘッドが回避される
ことを特徴とする請求項３に記載の方法。
【請求項１８】
前記ゲストオペレーティングシステムにおけるＳＧＤＴ命令は、現在のＧＤＴのベース及び長さをＥＡＸに格納する合成命令（例えば、ＶＭＳＧＤＴ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項１９】
前記ゲストオペレーティングシステムにおけるＳＬＤＴ命令は、現在のＬＤＴ選択子をＥＡＸに格納する合成命令（例えば、ＶＭＳＬＤＴ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項２０】
前記ゲストオペレーティングシステムにおけるＳＩＤＴ命令は、前記現在のＩＤＴのベース及び長さをＥＡＸに格納する合成命令（例えば、ＶＭＳＩＤＴ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項２１】
前記ゲストオペレーティングシステムにおけるＳＴＲ命令は、現在のＴＲ選択子をＥＡＸに格納する合成命令（例えば、ＶＭＳＴＲ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項２２】
前記ゲストオペレーティングシステムにおけるＣＬＩ命令は、仮想化されたＩＦをクリアする合成命令（例えば、ＶＭＣＬＩ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項２３】
前記ゲストオペレーティングシステムにおけるＳＴＩ命令は、仮想化されたＩＦを設定する合成命令（例えば、ＶＭＳＴＩ）で置き換えられる
ことを特徴とする請求項３に記載の方法。
【請求項２４】
前記プロセッサを停止させるための合成命令（例えば、ＶＭＨＡＬＴ）は、ユーザレベルのゲストコードとして実行される
ことを特徴とする請求項３に記載の方法。
【請求項２５】
オペレーティングシステムが、該オペレーティングシステムが仮想化されたプロセッサ上で実行されているか、またはｘ８６プロセッサ上で直接に実行されているかを判定する方法であって、
中央処理装置のＩＤを表す値を戻すために合成命令（例えば、ＶＭＣＰＵＩＤ）を実行するステップと、
値が戻された場合、前記オペレーティングシステムが、仮想化されたプロセッサ上で実行されていると結論付け、当該結論付けの後、合成命令を利用するステップと、
例外が生じた場合、前記オペレーティングシステムが、ｘ８６プロセッサ上で直接に実行されていると結論付け、当該結論付けの後、合成命令を利用することを控えるステップと
を備えることを特徴とする方法。
【請求項２６】
値が戻された場合、基礎にある仮想マシンモニタの機能または動作にアクセスするか、または該機能または該動作を変更するステップ
をさらに備えることを特徴とする請求項２５に記載の方法。
【請求項２７】
前記合成命令に関する１６進演算コードは、０ＦＣ７Ｃ８０１００である
ことを特徴とする請求項２５に記載の方法。
【請求項２８】
長いＪＭＰ命令を使用してトラップ可能な命令を効率的にパッチするためにオペレーティングシステムコードを改良するための方法であって、
ゲストオペレーティングシステムにおいて、５バイト未満の長さのトラップ可能な命令（例えば、リング０コード内で実行されるＳＴＩ命令及びＣＬＩ命令）のインスタンスを探し出し、該トラップ可能な命令を少なくとも５バイトの長さの対応する合成命令（例えば、それぞれＶＭＳＴＩ及びＶＭＣＬＩ）で置き換えるステップ
を備えることを特徴とする方法。
【請求項２９】
ＩＡ３２アーキテクチャを含むが、該アーキテクチャには限定されないｘ８６プロセッサアーキテクチャ上及び同等のアーキテクチャ上で合成命令を処理するためのシステムであって、
前記合成命令が前記ｘ８６プロセッサにおいて例外を生じさせた後、ゲストオペレーティングシステムによって発行された前記合成命令をトラップするためのサブシステムと、
前記ゲストオペレーティングシステムのために前記合成命令を処理するためのサブシステムと
を備えたことを特徴とするシステム。
【請求項３０】
スピンロック獲得が失敗した場合を特定するための合成命令（例えば、ＶＭＳＰＬＡＦ）がトラップされ、処理されるサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３１】
ＩＦをスタック上にプッシュするための合成命令（例えば、ＶＭＰＵＳＨＦＤ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３２】
ＩＦをポップしてスタックから外すための合成命令（例えば、ＶＭＰＯＰＦＤ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３３】
記述子テーブルエントリを更新する合成命令（例えば、ＶＭＷＲＤＥＳＣ）を処理するためのサブシステムをさらに備え、シャドー記述子テーブルを保持することに関連するオーバーヘッドを回避する
ことを特徴とする請求項２９に記載のシステム。
【請求項３４】
現在のＧＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＧＤＴ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３５】
現在のＬＤＴ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＬＤＴ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３６】
現在のＩＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＩＤＴ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３７】
現在のＴＲ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＴＲ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３８】
仮想化されたＩＦをクリアするための合成命令（例えば、ＶＭＣＬＩ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項３９】
仮想化されたＩＦを設定するための合成命令（例えば、ＶＭＳＴＩ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項４０】
ユーザレベルのゲストコードとして実行することができる前記プロセッサを停止させるための合成命令（例えば、ＶＭＨＡＬＴ）を処理するためのサブシステム
をさらに備えたことを特徴とする請求項２９に記載のシステム。
【請求項４１】
前記システムが、仮想化されたプロセッサ上で実行されているか、またはｘ８６プロセッサ上で直接に実行されているかを判定するためのサブシステムをさらに備え、
前記サブシステムは、
中央処理装置によってサポートされる機能のＩＤを表す値を戻すための合成命令（例えば、ＶＭＣＰＵＩＤ）を実行するためのサブシステムと、
値が戻されたかどうかを判定し、（ａ）戻された場合、オペレーティングシステムが、仮想化されたプロセッサ上で実行されていると結論付け、当該結論付けの後、合成命令を使用し、（ｂ）戻されない場合、オペレーティングシステムがｘ８６プロセッサ上で直接に実行されていると結論付け、当該結論付けの後、合成命令を利用することを控えるためのサブシステムとを含む
ことを特徴とする請求項２９に記載のシステム。
【請求項４２】
値が戻された場合、基礎にある仮想マシンモニタの機能または動作にアクセスするか、または該機能または該動作を変更するためのサブシステム
をさらに備えたことを特徴とする請求項４１に記載のシステム。
【請求項４３】
前記合成命令に関する１６進演算コードは、０ＦＣ７Ｃ８０１００である
ことを特徴とする請求項４１に記載のシステム。
【請求項４４】
前記合成命令は、直接実行を無効にするための合成命令（例えば、ＶＭＤＸＤＳＢＬ）を含む
ことを特徴とする請求項２９に記載のシステム。
【請求項４５】
前記合成命令は、直接実行を有効にする（または再び有効にする）ための合成命令（例えば、ＶＭＤＸＥＮＢＬ）を含む
ことを特徴とする請求項２９に記載のシステム。
【請求項４６】
前記合成命令は、
ＩＦをスタック上にプッシュするための合成命令（例えば、ＶＭＰＵＳＨＦＤ）と、
ＩＦをポップしてスタックから外すための合成命令（例えば、ＶＭＰＯＰＦＤ）とを含む
ことを特徴とする請求項２９に記載のシステム。
【請求項４７】
前記合成命令は、
現在のＧＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＧＤＴ）と、
現在のＬＤＴ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＬＤＴ）と、
現在のＩＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＩＤＴ）と、
現在のＴＲ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＴＲ）とをさらに含む
ことを特徴とする請求項４６に記載のシステム。
【請求項４８】
前記合成命令は、
仮想化されたＩＦをクリアするための合成命令（例えば、ＶＭＣＬＩ）と、
仮想化されたＩＦを設定するための合成命令（例えば、ＶＭＳＴＩ）とをさらに含む
ことを特徴とする請求項４６に記載のシステム。
【請求項４９】
前記合成命令は、トラップされ、処理されるスピンロック獲得が失敗した場合を特定するための合成命令をさらに含む
ことを特徴とする請求項４６に記載のシステム。
【請求項５０】
前記合成命令は、中央処理装置のＩＤを表す値を戻すための合成命令（例えば、ＶＭＣＰＵＩＤ）をさらに含む
ことを特徴とする請求項４６に記載のシステム。
【請求項５１】
前記合成命令に関する１６進演算コードは、０ＦＣ７Ｃ８０１００である
ことを特徴とする請求項５０に記載のシステム。
【請求項５２】
ＩＡ３２アーキテクチャを含むが、該アーキテクチャには限定されないｘ８６プロセッサアーキテクチャ及び同等のアーキテクチャにおけるプロセッサ仮想化を改良するためのコンピュータ可読命令を含むコンピュータ読み取り可能な記録媒体であって、
前記コンピュータ可読命令は、前記ｘ８６プロセッサにおいて例外を生じさせる合成命令を含み、該例外が、前記ｘ８６プロセッサ上で実行されている仮想マシンモニタによって前記仮想マシンモニタによる処理のためにトラップされる
ことを特徴とするコンピュータ読み取り可能な記録媒体。
【請求項５３】
ゲストオペレーティングシステムにおける少なくとも１つマルチプロセッサスピンロック命令は、スピンロック獲得が失敗した場合を特定するための合成命令（例えば、ＶＭＳＰＬＡＦ）で補足される
ことを特徴とする請求項４６に記載の方法。
【請求項５４】
中央処理装置のＩＤを表す値を戻すための合成命令（例えば、ＶＭＣＰＵＩＤ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項５５】
ＩＦをスタック上にプッシュする合成命令（例えば、ＶＭＰＵＳＨＦＤ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項５６】
ＩＦをポップしてスタックから外す合成命令（例えば、ＶＭＰＯＰＦＤ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項５７】
現在のＧＤＴのベース及び長さをＥＡＸに格納する合成命令（例えば、ＶＭＳＧＤＴ）をさらに含むことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項５８】
現在のＬＤＴ選択子をＥＡＸに格納する合成命令（例えば、ＶＭＳＬＤＴ）をさらに
含むことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項５９】
現在のＬＤＴのベース及び長さをＥＡＸに格納する合成命令（例えば、ＶＭＳＩＤＴ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６０】
現在のＴＲ選択子をＥＡＸに格納する合成命令（例えば、ＶＭＳＴＲ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６１】
仮想化されたＩＦをクリアする合成命令（例えば、ＶＭＣＬＩ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６２】
仮想化されたＩＦを設定する合成命令（例えば、ＶＭＳＴＩ）をさらに含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６３】
前記命令が、仮想化されたプロセッサ上で実行されているか、またはｘ８６プロセッサ上で直接に実行されているかを判定するための命令をさらに含み、
該命令は、
中央処理装置のＩＤを表す値を戻すための合成命令を実行するための命令と、
中央処理装置のＩＤに相当する値が戻されたかどうかを判定し、（ａ）戻された場合、合成命令を利用し、（ｂ）戻されない場合、合成命令の使用を中止するための命令とを含む
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６４】
前記合成命令に関する１６進演算コードは、０ＦＣ７Ｃ８０１００である
ことを特徴とする請求項４６に記載のコンピュータ可読命令。
【請求項６５】
ＩＡ３２アーキテクチャを含むが、該アーキテクチャには限定されないｘ８６プロセッサアーキテクチャ上及び同等のアーキテクチャ上で実行されている場合に合成命令を処理するためのシステムであって、
方法は、ゲストオペレーティングシステムにおいて、ＰＵＳＨ  ＣＳ、ＰＵＳＨ  ＳＳ、ＳＳからのＭＯＶ、ＣＡＬＬＦ、ＶＥＲＲ、ＶＥＲＷ、及びＬＡＲの事前定義された命令の１つまたは複数のインスタンスを削除する、置き換える、または補足するステップを含む
ことを特徴とするシステム。
【請求項６６】
ＩＡ３２アーキテクチャを含むが、該アーキテクチャには限定されないｘ８６プロセッサアーキテクチャ上及び同等のアーキテクチャ上で実行されている場合にプロセッサ仮想化を改良するようにゲストオペレーティングシステムを最適化するための方法であって、
前記ゲストオペレーティングシステムにおいて、ＰＵＳＨ  ＣＳ、ＰＵＳＨ  ＳＳ、ＳＳからのＭＯＶ、ＣＡＬＬＦ、ＶＥＲＲ、ＶＥＲＷ、及びＬＡＲの事前定義された命令の１つまたは複数のインスタンスを削除する、置き換える、または補足するステップと、
前記ゲストオペレーティングシステムにおけるＣＰＵＩＤ命令を仮想化されたＣＰＵＩＤ情報を読み取る合成命令（例えば、ＶＭＣＰＵＩＤ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるスピンロック命令をスピンロック獲得が失敗した場合を特定する合成命令（例えば、ＶＭＳＰＬＡＦ）で補足するステップと、
前記ゲストオペレーティングシステムにおけるＰＵＳＨＦ（Ｄ）命令をＩＦをスタック上にプッシュするための合成命令（例えば、ＶＭＰＵＳＨＦＤ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＰＯＰＦ（Ｄ）命令をＩＦをポップしてスタックから外すための合成命令（例えば、ＶＭＰＯＰＦＤ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＳＧＤＴ命令を現在のＧＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＧＤＴ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＳＬＤＴ命令を現在のＬＤＴ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＬＤＴ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＳＩＤＴ命令を現在のＩＤＴのベース及び長さをＥＡＸに格納するための合成命令（例えば、ＶＭＳＩＤＴ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＳＴＲ命令を現在のＴＲ選択子をＥＡＸに格納するための合成命令（例えば、ＶＭＳＴＲ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＣＬＩ命令を仮想化されたＩＦをクリアするための合成命令（例えば、ＶＭＣＬＩ）で置き換えるステップと、
前記ゲストオペレーティングシステムにおけるＳＴＩ命令を仮想化されたＩＦを設定するための合成命令（例えば、ＶＭＳＴＩ）で置き換えるステップと
を備えることを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサ仮想化を改良するための方法及び合成命令を処理するためのシステムに関する。より詳細には、本発明は、一般にオペレーティングシステムの分野に関し、より具体的には、仮想マシン（またはプロセッサ仮想化）が理解することができるが、事前定義されたプロセッサアーキテクチャ（例えば、ｘ８６アーキテクチャ）によって「イリーガル」であると定義される命令の使用に関し、仮想マシン環境内で実行された場合、その命令を利用して明確に定義された正当なアクションを実行するようにする、プロセッサ仮想化を改良するための方法、オペレーティングシステムがそのオペレーティングシステムが仮想化されたプロセッサ上で実行されているかまたはｘ８６プロセッサ上で直接に実行されているかを判定する方法、オペレーティングシステムコードを改良するための方法、合成命令を処理するためのシステム、記録媒体、合成命令を処理するためのシステム、及びプロセッサ仮想化を改良するようにゲストオペレーティングシステムを最適化するための方法に関する。ある意味で、本発明は、「合成」命令を既存の命令セットに追加する。
【背景技術】
【０００２】
仮想マシン 
コンピュータは、特定の１組のシステム命令を実行するように設計された汎用中央処理装置（ＣＰＵ）を含む。同様のアーキテクチャ仕様または設計仕様を有する一群のプロセッサは、同一のプロセッサファミリのメンバと見なすことができる。現在のプロセッサファミリの例には、アリゾナ州フェニックス市のモトローラ株式会社によって製造されるＭｏｔｏｒｏｌａ６８０Ｘ０（商標）プロセッサファミリ、カリフォルニア州サニーベール市のインテルコーポレーションによって製造されるＩｎｔｅｌ（登録商標）８０Ｘ８６（商標）プロセッサファミリ、及びモトローラ株式会社によって製造され、カリフォルニア州キューパーティーノ市のアップルコンピュータ株式会社によって製造されるコンピュータの中で使用されるＰｏｗｅｒＰＣ（商標）プロセッサファミリが含まれる。一群のプロセッサが、同様のアーキテクチャ及び設計の考慮のため、同一のファミリに属していても、プロセッサは、クロック速度及びその他のパフォーマンスパラメータに従ってファミリ内で大幅に異なっていることが可能である。
【０００３】
マイクロプロセッサの各ファミリは、プロセッサファミリに固有の命令を実行する。プロセッサ、またはプロセッサのファミリが実行することができる全体的な命令セットが、プロセッサの命令セットとして知られている。例として、Ｉｎｔｅｌ（登録商標）８０Ｘ８６（商標）プロセッサファミリによって使用される命令セットは、ＰｏｗｅｒＰＣ（商標）プロセッサファミリによって使用される命令セットと互換性がない。Ｉｎｔｅｌ（登録商標）８０Ｘ８６（商標）命令セットは、ＣＩＳＣ（Ｃｏｍｐｌｅｘ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）フォーマットに基づく。Ｍｏｔｏｒｏｌａ  ＰｏｗｅｒＰＣ（商標）命令セットは、ＲＩＳＣ（Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）フォーマットに基づく。ＣＩＳＣプロセッサは、一部がかなり複雑な機能を実行することができるが、一般に、実行するのに多くのクロックサイクルを要する多数の命令を使用する。ＲＩＳＣプロセッサは、より少数の利用可能な命令を使用して、はるかに高い速度で実行されるより単純な機能セットを実行する。
【０００４】
また、コンピュータシステム間におけるプロセッサファミリの固有性により、通常、コンピュータシステムのハードウェアアーキテクチャのその他の要素間で互換性がないことも生じる。Ｉｎｔｅｌ（登録商標）８０Ｘ８６（商標）プロセッサファミリからのプロセッサを使用して製造されたコンピュータシステムは、ＰｏｗｅｒＰＣ（商標）プロセッサファミリからのプロセッサを使用して製造されたコンピュータシステムのハードウェアアーキテクチャとは異なるハードウェアアーキテクチャを有する。プロセッサ命令セットの固有性、及びコンピュータシステムのハードウェアアーキテクチャのため、アプリケーションソフトウェアプログラムは、通常、特定のオペレーティングシステム上で実行されている特定のコンピュータシステム上で実行されるように書かれる。
【０００５】
コンピュータ製造業者は、コンピュータ製造業者の製品系列に関連するマイクロプロセッサファミリ上で、より少ないアプリケーションではなく、より多くのアプリケーションを実行させることにより、市場占有率を最大化することを望む。コンピュータシステム上で実行することができるオペレーティングシステム及びアプリケーションプログラムの数を拡大するため、ホストと呼ばれる１つのタイプのＣＰＵを有する所与のコンピュータが、ゲストと呼ばれる無関係のタイプのＣＰＵの命令をホストコンピュータがエミュレートすることを可能にするエミュレータプログラムを含む技術分野が開発されている。したがって、ホストコンピュータは、所与のゲスト命令に応答して１つまたは複数のホスト命令がコールされるようにするアプリケーションを実行する。したがって、ホストコンピュータは、独自のハードウェアアーキテクチャ向けのソフトウェア設計を実行することができるとともに、無関係のハードウェアアーキテクチャを有するコンピュータ向けに書かれたソフトウェアを実行することもできる。さらにより具体的な例として、例えば、アップルコンピュータによって製造されたコンピュータシステムは、ＰＣ（personal computer）ベースのコンピュータシステム向けに書かれたオペレーティングシステム及びプログラムを実行することができる。また、エミュレータプログラムを使用して、単一のＣＰＵ上で複数の互換性のないオペレーティングシステムを同時に動作させることも可能である。この構成では、各オペレーティングシステムは、互いに互換性がないが、エミュレータプログラムが、２つのオペレーティングシステムのどちらかをホストして、そうでなければ互換性のないオペレーティングシステムが同一のコンピュータシステム上で同時に実行されるのを可能にすることができる。
【０００６】
ゲストコンピュータがホストコンピュータシステム上でエミュレートされる場合、ゲストコンピュータシステムは、仮想マシンであるという言い方をされる。というのは、ホストコンピュータシステムは、ゲストコンピュータシステムのハードウェアアーキテクチャの動作のソフトウェア表現としてだけ存在するからである。エミュレータという用語と仮想マシンという用語は、ときとして、区別なく使用されて、コンピュータシステム全体のハードウェアアーキテクチャを模倣する、またはエミュレートする能力を表す。例として、カリフォルニア州サンマテオ市のコネクティクス（Ｃｏｎｎｅｃｔｉｘ）コーポレーションによって作られたＶｉｒｔｕａｌ  ＰＣ（商標）ソフトウェアは、Ｉｎｔｅｌ（登録商標）  ８０Ｘ８６（商標）  Ｐｅｎｔｉｕｍ（登録商標）プロセッサ、ならびに様々なマザーボードコンポーネント及びカードを含むコンピュータ全体をエミュレートする。それらのコンポーネントの動作は、ホストマシン上で実行されている仮想マシンにおいてエミュレートされる。ＰｏｗｅｒＰＣ（商標）プロセッサを有するコンピュータシステムなどのホストコンピュータのオペレーティングシステムソフトウェア及びハードウェアアーキテクチャ上で実行されているエミュレータプログラムは、ゲストコンピュータシステム全体の動作を模倣する。エミュレータプログラムは、ホストマシンのハードウェアアーキテクチャと、エミュレートされる環境内で実行されているソフトウェアによって伝送される命令の間のインターチェンジ（ｉｎｔｅｒｃｈａｎｇｅ）として動作する。
【０００７】
ｘ８６アーキテクチャ 
「ｘ８６」は、ｘ８６命令セットアーキテクチャ（ＩＳＡ；Instruction Set Architecture）を使用するシリーズすべてのマイクロプロセッサファミリの総称である。ＩＡ３２は、ｘ８６ＩＳＡを使用するインテルによって開発された特定のプロセッサアーキテクチャである。ｘ８６は、インテルの８０８６（商標）マイクロプロセッサから始まる。ｘ８６プロセッサには、とりわけ、インテルの８０８６（商標）、２８６（商標）、３８６（商標）、４８６（商標）、Ｐｅｎｔｉｕｍ（登録商標）、ＭＭＸを有するＰｅｎｔｉｕｍ（登録商標）、Ｐｅｎｔｉｕｍ（登録商標）ＰＲＯ、Ｐｅｎｔｉｕｍ（登録商標）ＩＩ、Ｐｅｎｔｉｕｍ（登録商標）ＩＩＩ、及びＰｅｎｔｉｕｍ（登録商標）４のプロセッサファミリ、ならびにアドバンストマイクロデバイス（Ａｄｖａｎｃｅｄ  Ｍｉｃｒｏ  Ｄｅｖｉｃｅ）（ＡＭＤ）のＫ５（商標）、Ｋ６（商標）、Ｋ６−２（商標）、Ｋ６−３（商標）、Ａｔｈｌｏｎ（商標）、Ｅｎｈａｎｃｅｄ  Ａｔｈｌｏｎ（商標）（別名、「サンダーバード（ｔｈｕｎｄｅｒｂｉｒｄ）（商標）」）、Ａｔｈｌｏｎ４（商標）、及びＡｔｈｌｏｎＭＰ（商標）、Ａｔｈｌｏｎ６４（商標）、Ｏｐｔｅｒｏｎ（商標）が含まれるが、以上には限定されない。
【０００８】
仮想マシンモニタ（ＶＭＭ）は、ハードウェアのすぐ上で実行されるソフトウェアレイヤであり、ＶＭＭは、ＶＭＭが仮想化しているハードウェアと同一であるインタフェースを公開することによってマシンのすべてのリソースを仮想化する（これにより、ＶＭＭが、ＶＭＭより上位で実行されているオペレーティングシステムレイヤに気付かれずに済むことが可能になる）。例えば、ＩＡ３２アーキテクチャなどを含むｘ８６アーキテクチャは、ＶＭＭ実装に関するいくつかの課題をもたらす多くの仮想化の穴を含む。第１に、ｘ８６アーキテクチャは、すべてのプロセッサ状態を特権状態か、または使用状態に分けるわけではなく、ここで、とりわけ、特権状態は、現在の特権レベル、ならびにユーザレベルのアプリケーションインスタンス間でリソース制御及び保護障壁を実施するために基礎にあるオペレーティングシステム（または「監督レイヤ」）の制御下になければならない他のリソースを示す制御フィールドまたはステータスフィールドを含まなければならない。第２に、ｘ８６アーキテクチャは、特権状態へのアクセス（読み取りであれ、書き込みであれ）がユーザレベルで試みられたすべてのケースでトラップ（ｔｒａｐ）を生じさせるわけではない。第３に、ｘ８６アーキテクチャは、ユーザレベルのコードが、仮想化されるべき非特権状態（例えば、タイマ値、パフォーマンスカウンタ、プロセッサ機能レジスタ）にアクセスしようと試みた際にトラップを生じさせるための手段を有さない。第４に、すべてのメモリ内のプロセッサ構造は、現在のアドレス空間の外部に格納されるか、またはＶＭ内部の誤った、または悪意のあるメモリアクセスから保護可能でなければならないが、ｘ８６アーキテクチャは、それを可能にしない。最後に第５に、ｘ８６アーキテクチャは、割り込みまたはトラップの時点におけるすべてのプロセッサを、割り込みまたはトラップが処理された後にトラップ前の状態に復元することができない。
【発明の開示】
【発明が解決しようとする課題】
【０００９】
従来のシステムには上述したような種々の問題があり、さらなる改善が望まれている。
【００１０】
本発明は、このような状況に鑑みてなされたもので、その目的とするところは、仮想マシンにおいて合成命令を使用するためのシステム及び方法を実現することにより、より改善された仮想化を可能とする、プロセッサ仮想化を改良するための方法及び合成命令を処理するためのシステムを提供することにある。
【課題を解決するための手段】
【００１１】
ｘ８６アーキテクチャの前述した欠点及び限界の多くは、トラップが所望される場合にトラップを生じさせることができない命令によってもたらされる。つまり、その命令が、代わりにトラップを生じさせる場合、仮想マシンモニタ（ＶＭＭ）は、その命令を正しく仮想化することができる。
【００１２】
本発明は、トラップを生じさせ、命令を安全な形で処理する機会を仮想マシン（ＶＭ）に与える「合成命令」を導入することにより、ｘ８６プロセッサアーキテクチャの欠点を補償する。ｘ８６アーキテクチャには「イリーガル」であるが、それでも、仮想マシンが理解することができる命令を使用することにより、本方法は、合成命令を使用して、ｘ８６プロセッサ上で実行される従来の命令によって実行された場合は問題のある明確に定義されたアクションを実行し、ｘ８６プロセッサシステムに関するはるかに改良されたプロセッサ仮想化を提供する。
【００１３】
以上の概要、及び好適実施形態の以下の詳細な説明は、添付の図面と併せて読むことでよりよく理解される。本発明を例示するため、図面には本発明の典型的な構成を示しているが、本発明は、開示する特定の方法及び手段（ｉｎｓｔｒｕｍｅｎｔａｌｉｔｉｅｓ）に限定されない。
【発明の効果】
【００１４】
本発明によれば、仮想マシンにおいて合成命令を使用するためのシステム及び方法を実現することにより、より改善された仮想化を可能にできる。
【発明を実施するための最良の形態】
【００１５】
以下、図面を参照して本発明を適用できる実施形態を詳細に説明する。本発明の主題は、法定要件を満たすように詳細に説明する。ただし、説明自体は、本特許の範囲を限定するものではない。むしろ、本発明者は、請求する主題が、本明細書で説明するものとは異なるステップ、または同様のステップの組み合わせを含むように、他の現在の技術、または将来の技術に関連する他の形でも実施できることを企図している。さらに、「ステップ」という用語は、本明細書で、使用される方法の異なる要素を意味するように使用される可能性があるが、この用語は、個々のステップの順序が明確に説明されていない限り、またそのような場合を除き、本明細書で開示する様々なステップの間における特定の順序を何ら暗示していると解釈してはならない。最後に、以下の説明は、ときとして、ＩＡ３２アーキテクチャ及び／またはｘ８６プロセッサファミリを中心に扱う可能性があるが、本明細書における開示のいずれの箇所も、これらの下位グループに限定されることを意図するものではなく、いずれのそのような説明も、すべてのｘ８６プロセッサアーキテクチャ及び等価形態を含み、特にＩＡ３２アーキテクチャ及びＩＡ６４アーキテクチャ、ならびにその等価形態、拡張形態、及び派生形態を含むが、以上には限定されない、本発明の様々な実施形態が適用され、かつ／または利用されることが可能なすべての妥当なプロセッサアーキテクチャを明確に含む。
【００１６】
コンピュータマイクロプロセッサ 
マイクロプロセッサは、マイクロチップ上のコンピュータプロセッサである。マイクロプロセッサは、レジスタと呼ばれる数を保持する小さい領域を使用する算術演算及び論理演算を実行するように設計されている。通常のマイクロプロセッサ動作には、加算、減算、２つの数を比較すること、及びある領域から別の領域に数をフェッチすることが含まれる。これらの動作は、マイクロプロセッサ設計の一部である命令セットの結果である。
【００１７】
命令は、コンピュータプログラムによってコンピュータプロセッサに与えられる命令である。最下レベルでは、各命令は、コンピュータが実行すべき物理的動作（「加算する」などの）、ならびに、特定の命令タイプに依存して、命令を実行するのに使用されるべきデータを含むことが可能なレジスタと呼ばれる特別な記憶域の指定、またはコンピュータメモリの中のデータの位置を記述する０と１の連続である。
【００１８】
レジスタは、コンピュータプロセッサの一部である小さな１組のデータ保持場所の１つである。レジスタは、コンピュータ命令、記憶アドレス、または任意の種類のデータ（ビットシーケンスまたは個々の文字などの）を保持することができる。一部の命令は、命令の一環としてレジスタを指定する。例えば、命令は、２つの定義されたレジスタの内容が足され、指定されたレジスタの中に入れられるべきことを指定することができる。レジスタは、命令を保持するだけ十分に大きくなければならず、例えば、３２ビット命令のコンピュータでは、レジスタは、３２ビットの長さでなければならない。一部のコンピュータ設計では、より短い命令用により小さいレジスタ、例えば、ハーフレジスタが存在する。プロセッサ設計及び言語規則に依存して、レジスタは、番号を付けられる、または任意の名前を有することが可能である。ただし、本明細書で使用する特定のレジスタ、特定の命令、ならびに本明細書で詳細に説明するその他の技術的要素は、ｘ８６アーキテクチャに基づき、このため、当業者には公知であり、よく理解されている。
【００１９】
仮想マシンアーキテクチャ 
図１は、ハードウェア１０２のすぐ上で実行されている仮想マシンモニタ（ＶＭＭ）ソフトウェアレイヤ１０４を含む仮想化されたコンピューティングシステムを示し、ＶＭＭ１０４は、ＶＭＭが仮想化しているハードウェアと同一であるインタフェースを公開することによってマシンのすべてのリソースを仮想化する（これにより、ＶＭＭが、ＶＭＭより上位で実行されているオペレーティングシステムレイヤに気付かれずに済むことが可能になる）。ＶＭＭ１０４の上には、２つの仮想マシン（ＶＭ）実施形態、仮想化されたＩｎｔｅｌ（登録商標）３８６（商標）プロセッサであるＶＭＡ１０８、及びＭｏｔｏｒｏｌａ６８０Ｘ０（商標）ファミリのプロセッサの１つまたは複数の仮想化されたバージョンであるＶＭＢ１１０が存在する。各ＶＭ１０８及び１１０の上には、それぞれ、ゲストオペレーティングシステム（ＯＳ）Ａ１１２及びＯＳＢ１１４が存在する。ゲストＯＳＡ１１２の上では、２つのアプリケーション、アプリケーションＡ１１１６及びアプリケーションＡ２１１８が実行されており、ゲストＯＳＢ１１４の上では、アプリケーションＢ１１２０が実行されている。
【００２０】
図２は、同様に仮想化されているが、コンピュータハードウェア１０２と直接にインタフェースをとるホスト（ネイティブ）オペレーティングシステムＸ１２２を有するコンピューティングシステム環境を示しており、ネイティブＯＳＸ１２２の上では、アプリケーションＸ１２４が実行されている。
【００２１】
図３は、コンピュータシステム３１０におけるエミュレートされた動作環境用のハードウェアアーキテクチャ及びソフトウェアアーキテクチャの論理レイヤの図である。エミュレーションプログラム３１４が、ホストオペレーティングシステム及び／またはハードウェアアーキテクチャ３１２の上で実行される。エミュレーションプログラム３１４は、ゲストハードウェアアーキテクチャ３１６及びゲストオペレーティングシステム３１８をエミュレートする。ソフトウェアアプリケーション３２０が、ゲストオペレーティングシステム３１８の上で実行される。図３のエミュレートされた動作環境では、エミュレーションプログラム３１４の動作のため、ソフトウェアアプリケーション３２０が、ホストオペレーティングシステム及びハードウェアアーキテクチャ３１２と全体的に互換性のないオペレーティングシステム上で実行されるように設計されてはいるものの、コンピュータシステム３１０の上で実行されることが可能である。
【００２２】
プロセッサ仮想化 
仮想マシン（ＶＭ）においてプロセッサ仮想化を提供するために次の２つの方法が存在する。すなわち、エミュレーション及び直接実行である。仮想マシンは、いずれかの方法、または両方の方法（「混成」）を使用してプロセッサ仮想化を提供することができる。
【００２３】
エミュレーションは、インタープリタ（ｉｎｔｅｒｐｒｅｔｅｒ）またはバイナリ変換機構の使用に関わり、ゲストプロセッサとホストプロセッサが大きく異なるシステム上でＶＭを実装する際の唯一の実行可能な選択肢でもある。例えば、Ｍａｃｉｎｔｏｓｈ用のＭｉｃｒｏｓｏｆｔ  Ｖｉｒｔｕａｌ  ＰＣ（商標）は、ＰｏｗｅｒＰＣ（商標）ベースのＭａｃｉｎｔｏｓｈシステム上でｘ８６ベースのＶＭ（ｘ８６プロセッサアーキテクチャをエミュレートする）を実装する。エミュレーションは、ゲストプロセッサとホストプロセッサが同じであるが、プロセッサが、不十分な仮想化サポートを提供する状況に関しても必要である。ｘ８６アーキテクチャの一部の動作モードが、このカテゴリに入る。
【００２４】
ただし、エミュレーションは、最も柔軟性があり、互換性がある仮想化機構ではあるが、通常、最速ではない。エミュレーションは、解釈またはバイナリ変換により、ランタイムオーバーヘッドを課す。実施するのが比較的容易な解釈の場合、オーバーヘッドは、しばしば、９０〜９５％ぐらいである（つまり、もたらされるパフォーマンスは、「ネイティブ」パフォーマンスの５〜１０％だけである）。他方、バイナリ変換機構は、インタープリタより複雑であり、したがって、実装するのがより困難であるが、そのような機構は、被るパフォーマンス損失がより少なく、２５〜８０％だけのオーバーヘッドを要することが可能である（すなわち、もたらされるパフォーマンスは、「ネイティブ」パフォーマンスの２０〜７５％である）。
【００２５】
一般に、直接実行の方が、いずれのアプローチを使用するエミュレーションよりも高速であり、効率的である。良好な直接実行の実施形態は、数パーセント点の差の範囲内で、ネイティブパフォーマンスとほぼ同等のパフォーマンスを実現することができる。ただし、当業者には周知であり、理解されるとおり、直接実行は、通常、プロセッサ保護機構を頼りにして仮想化されたコードがシステムを「乗っ取る（taking over）」のを防止する。より具体的には、直接実行は、プロセッサを頼りにしてユーザレベルの動作と特権レベルの動作（つまり、特権レベルのプロセッサリソースにアクセスするソフトウェア対ユーザレベルのリソースにアクセスするソフトウェア）を区別する。
【００２６】
特権モードで実行されるソフトウェア（つまり、信頼されたソフトウェア）は、レジスタ、モード、設定、メモリ内のデータ構造などを含む特権プロセッサリソースにアクセスすることができる。これとは対照的に、ユーザモードは、最新のシステムにおける計算作業の大半を実行する信頼されていないソフトウェア向けである。多くのプロセッサ（ただし、すべてではない）は、ユーザレベル状態と特権レベル状態（各モードに対応する）の厳密な区別を行い、プロセッサがユーザモードで動作している場合、特権レベル状態へのアクセスは許されない。この区別により、ホストオペレーティングシステム（または等価物）が、重要なリソースを保護し、バグのある、または悪意のあるユーザレベルソフトウェアが、システム全体をクラッシュさせるのを防止することができるようになる。
【００２７】
ユーザレベルコードの直接実行の場合、あらゆる特権違反は、ＶＭＭによって捕えられ、ゲストの例外処理ハンドラに送られる。ただし、特権レベルコードの直接実行には、特権レベルコードがプロセッサのすべての特権状態要素に完全なアクセスを有するという前提で特権レベルコードが書かれているという事実にもかかわらず、ユーザレベルで特権レベルコードを実行することが関わる。この不整合を解消するため、ＶＭはプロセッサを頼りにして、すべての特権命令（すなわち、特権状態に直接に、または間接的にアクセスする命令）に関してトラップを生成する。特権違反トラップは、仮想マシンモニタ（ＶＭＭ）内部のトラップハンドラを呼び出す。次に、ＶＭＭのトラップハンドラが、特権命令の暗示された状態変化をエミュレートし、制御を後続の命令に戻す。特権命令のこのエミュレーションには、しばしば、特定のＶＭインスタンスにプライベートなシャドー状態の使用が関わる。
【００２８】
例えば、プロセッサアーキテクチャが、特権モードでだけアクセスすることができる特権モードレジスタ（ＰＭＲ）を含む場合、ユーザレベルコードからＰＭＲからの読み取り、またはＰＭＲへの書き込みを行おうとするいずれの試みも、トラップを生じさせる。ＶＭＭのトラップハンドラが、トラップの原因を特定し、関連するＶＭのインスタンスにプライベートなＰＭＲシャドー値を参照する（このＰＭＲ値は、ホストプロセッサのＰＭＲの中に現在、保持されている値と異なることが可能である）。
【００２９】
トラップ命令の頻度、及びトラップを処理することの費用に依存して、この技術により、比較的小さいが、顕著なパフォーマンスペナルティが課せられる可能性がある。例えば、ＩＢＭ及びアムダール（Ａｍｄａｈｌ）によって開発された一部のＶＭＭは、ネイティブ速度の８０〜９８％で動作し、したがって、このトラッピング（ｔｒａｐｐｉｎｇ）オーバーヘッドに起因して２〜１５％のパフォーマンス損失がもたらされた。
【００３０】
ｘ８６／ＩＡ３２の限界 
仮想化向けの理想的なプロセッサは、厳密に仮想化可能（ｖｉｒｔｕａｌｉｚａｂｌｅ）であると言われる。つまり、厳密に仮想化可能なプロセッサは、以下の要件を満たす直接実行仮想化機構の実装を可能にする。すなわち、
（ａ）ＶＭＭは、プロセッサリソース及びシステムリソースを「支配し（in control）」つづけることができなければならない。
【００３１】
（ｂ）ＶＭ内部で実行されるソフトウェア（ユーザレベルでか、特権レベルでかにかかわらず）は、自らが仮想マシン内部で実行されていることを知ることができてはならない。
【００３２】
以上の要件を満たすため、厳密に仮想化可能なプロセッサは、以下の特性を示す。すなわち、
・メモリ管理装置（ＭＭＵ）または同様のアドレス変換機構を組み込む
・２つ以上の特権レベルを提供する
・すべてのプロセッサ状態を特権状態またはユーザ状態に分け、特権状態は、現在の特権レベルを示すあらゆる制御フィールドまたはステータスフィールドを含まなければならない。
【００３３】
・特権レベルへのアクセス（読み取りであれ、書き込みであれ）がユーザレベルで試みられた場合、トラップを生じさせる
・ユーザレベルコードが、仮想化されるべき非特権状態（例えば、タイマ値、パフォーマンスカウンタ、プロセッサ機能レジスタ）にアクセスしようと試みた場合、オプションとしてトラップを生じさせる手段を有する
・すべてのメモリ内のプロセッサ構造が、現在のアドレス空間の外部に格納されるか、またはＶＭ内部の誤った、または悪意のあるメモリアクセスから保護可能である。
【００３４】
・割り込み時またはトラップ時におけるいずれのプロセッサ状態も、割り込みまたはトラップが処理された後、トラップ前の状態に復元することができる
いくつかを挙げればＰｏｗｅｒＰＣ（商標）及びＤＥＣ  Ａｌｐｈａ（商標）を含むいくつかの最新のプロセッサは、以上の要件を満たす。ただし、ＩＡ３２は、以上の要件を満たさない。すなわち、ＩＡ３２は、初めの２つの要件だけを満たす。したがって、ＩＡ３２アーキテクチャは、ＶＭＭ実装に関するいくつかの課題をもたらす多くの仮想化の穴を含む。
【００３５】
第１に、ＩＡ３２アーキテクチャは、いくつかの事例においてユーザ状態／特権状態分離の要件に違反し、その最も重大なものは、図４に示すとおりユーザ状態と特権状態をともに含むＥＦＬＡＧＳレジスタに関わる。次のＥＦＬＡＧＳフィールドが、特権的であると見なされなければならない。すなわち、ＶＩＰ、ＶＩＦ、ＶＭ、ＩＯＰＬ、及びＩＦである。（他のすべてのフィールドは、ユーザ状態を表し、特権的である必要はない。）しかし、ＩＡ３２の場合、ＥＦＬＡＧＳレジスタの特権フィールド（ＰＵＳＨＦ／ＰＵＳＨＦＤ、ＰＯＰＦ／ＰＯＰＦＤ、及びＩＲＥＴ）に対して読み取りを行う命令、及び書き込みを行う命令は、ユーザモードから実行される場合、トラップせず、ＩＡ３２において、これらの命令がトラップするように強制する手段は存在しない。
【００３６】
さらに、ＩＡ３２では、ＰＵＳＨＦ命令及びＰＯＰＦ命令が、しばしば、ゲストカーネル（リング０）コード内部で使用されて、ＩＦ（割り込み有効フラグ（ｉｎｔｅｒｒｕｐｔ  ｅｎａｂｌｅ  ｆｌａｇ））の状態が保存され、復元される。仮想マシン内部で、このカーネルコードは、より高いリングレベルで（例えば、リング１で）実行され、ＩＯＰＬは、ＩＮ／ＯＵＴ命令がトラップするように設定される。ＶＭ内部で実行されているオペレーティングシステム（ＯＳ）が、ホストプロセッサ上の割り込みを無効にすることを許されてはならないため、実際のＩＦ値は、仮想マシンコードが実行されている間、仮想ＩＦの状態にかかわらず、１に設定される。したがって、ＰＵＳＨＦ命令は、ＩＦ＝１でＥＦＬＡＧＳ値を常にプッシュし、ＰＯＰＦ命令は、ポップされたＥＦＬＡＧＳ値のＩＦフィールドを常に無視する。
【００３７】
ＥＦＬＡＧＳレジスタに加えて、特権状態及びユーザ状態が混ざる２つのさらなる領域が、ＣＳレジスタ及びＳＳレジスタである。これらのレジスタの一番下の２ビットは、特権状態である現在の特権レベル（ＣＰＬ）を含み、他方、これらのレジスタの上位１４ビットは、特権的ではないセグメントインデックス−記述子テーブル選択子を含む。ＣＳ選択子またはＳＳ選択子（ＳＳ及びＰＵＳＨ  ＳＳからのＣＡＬＬＦ、ＭＯＶを含む）に明示的、または暗示的にアクセスする命令は、ユーザモードから実行された場合、トラップしない。その他の命令は、ＣＳまたはＳＳがスタック上にプッシュされるようにする（例えば、コールゲート（ｃａｌｌ  ｇａｔｅ）を介するＩＮＴ、ＩＮＴＯ、ＪＭＰＦ、コールゲートを介するＣＡＬＬＦ）が、それらの命令は、トラップされることが可能であり、ＶＭＭが、プッシュされたＣＰＬ値を仮想化することを可能にするということに留意されたい。
【００３８】
ユーザレベルコードが特権プロセッサ状態に直接にアクセスすることを許すｘ８６／ＩＡ３２保護モデルのさらなる欠点には、次の命令が含まれる。すなわち、ＳＧＤＴ、ＳＩＤＴ、ＳＬＤＴ、ＳＭＳＷ、及びＳＴＲである。様々な理由で、ＧＤＴ、ＬＤＴ、ＩＤＴ、及びＴＲのシャドーイングが、正しい仮想化のために必要であり、これは、ＴＲ、ＧＤＴＲ、及びＩＤＴＲが、ゲストオペレーティングシステムによって指定されたテーブルではなく、ＶＭＭのシャドーテーブルをポイントすることを意味する。しかし、非特権コードが、それらのレジスタから読み取りを行うことができるため、それらのレジスタの内容を正しく仮想化することが不可能である。さらに、ＧＤＴ内及びＬＤＴ内の記述子にアクセスするいくつかの命令は、ＬＡＲ、ＬＳＬ、ＶＥＲＲ、及びＶＥＲＷを含め、非特権状態から実行された場合、トラップしない。ＧＤＴ／ＬＤＴシャドーイングが必要なため、これら４つの命令は、ＶＭ内部で誤って実行される可能性がある。さらに、ＣＰＵＩＤ命令は、トラップしない。仮想マシン内部で新たなプロセッサ機能をシミュレートするため、またはプロセッサ機能を無効にするため、非特権モードから実行される場合、ＣＰＵＩＤ上でトラップすることができることが重要である。
【００３９】
さらに、ＶＭ環境におけるコンテキスト切り替えは、プロセッサの状態全体を保存し、復元する能力に依拠するが、ＩＡ３２アーキテクチャは、それを可能にしない。より具体的には、６つのセグメント（ＤＳ、ＥＳ、ＣＳ、ＳＳ、ＦＳ、及びＧＳ）のそれぞれに関するキャッシュに入れられたセグメント記述子状態は、セグメント再読み込みの時点でプロセッサ内部に格納され、この情報には、いずれのアーキテクチャとして定義された機構を介してしてもアクセスすることができない。したがって、これは、正しい仮想化への大きな障害である。例えば、あるコードが、あるセグメントを読み込み、次に、そのセグメントに対応するメモリ内の記述子を変更した場合、後のコンテキスト切り替えは、元のセグメント記述子情報を正しく復元することができない。同様に、プロセッサが、リアルモードで動作しており、次に、保護モードに切り替わった場合、セグメントは、保護モードＧＤＴ／ＬＤＴ内の記述子に対応する選択子を含まず、この時点におけるコンテキスト切り替えは、リアルモード内で最初に読み込まれたキャッシュに入れられた記述子を正しく復元することができない。
【００４０】
同様に、ＰＡＵＳＥ命令（スピンロック実行に関するハイパースレッドプロセッサヒント（ｈｙｐｅｒｔｈｒｅａｄｅｄ  ｐｒｏｃｅｓｓｏｒｓ  ｈｉｎｔ）を提供するように最近、追加されたＮＯＰ（no operation）の接頭辞が付いた形態（ｐｒｅｆｉｘｅｄ  ｆｏｒｍ））も、マルチプロセッサ（ＭＰ）ＶＭ上でスピンロックとともに使用された場合、パフォーマンス問題を被る。例えば、１つの仮想プロセッサが、第２の仮想プロセッサによって保持されるロック上でスピンすることが可能であり、第２の仮想プロセッサが、現在、実行されていないスレッド上で実行されている場合、第１の仮想プロセッサは、長い間、スピンする可能性があり、その結果、プロセッササイクルが浪費される。ＶＭＭが、別のＶＭが実行されるようにスケジュール設定する、または第２の仮想プロセッサスレッドがスケジュール設定されるように合図することを可能にするため、仮想マシンモニタが、ＶＭがスピンしているかどうかの通知を受けることができれば役に立つが、現在、利用できるそのような通知方法は存在しない。
【００４１】
一部のＶＭ環境は、いくつかの異なる技術を使用して、以上の欠点に対処し、一般に、エミュレーションと直接実行をともに混成の形で使用する。特定の技術は、プロセッサモード、ならびにＯＳ自体から導出された他の情報に基づいて選択される。そのようなシステムの場合、一般に、図５に示すとおり、ＶＭＭによって認識される４つの異なるプロセッサモード分類が存在する。リング０モード（ほとんどの最新のＯＳカーネルレベルコードに関して使用される）の場合、既定の動作を無効にすることが可能であり、望ましい。以下の説明の大部分は、直接実行機構を介してすべてのリング０コードを安全に実行するための要件を説明する。
【００４２】
多くのＶＭ環境は、「リング圧縮」と呼ばれる技術（ＶＡＸアーキテクチャを仮想化するためにＤＥＣ技術者によって最初に使用された）を使用する。リング圧縮は、ＶＭＭが、仮想化されたリソースにアクセスする一部の特権レベル命令に対してトラップすることを可能にするため、より小さい特権のリング（例えば、リング１）内でリング０コードを実行することに関わる。例えば、ＩＡ３２ページテーブルベースポインタが、ＣＲ３レジスタ内に格納される。ＣＲ３を読み取る命令は、リング０内でだけ実行可能である。リング１から実行される場合、この命令は、プロセッサが、トラップを生成するようにさせる（具体的には、タイプ６の「イリーガルな動作」の例外）。トラップの時点で、ＶＭＭは、命令を支配して、エミュレートし、ＶＭＭ（ホストプロセッサの）ＣＲ３ではなく、仮想化された（ゲストプロセッサの）ＣＲ３を戻す。
【００４３】
おおむね、ＶＭＭは、リング０において実行されることが意図されたコードが、実際には、異なるリングレベル内で実行されているという事実を隠すことができる。前述の例では、ＣＲ３にアクセスしたコードは、命令に関連する重要な状態変化のすべてがエミュレートされたため、トラップが行われたという事実に気付かなかった。ただし、ＩＡ３２仮想化の前述した欠点により、リング圧縮が完全に不透明になることが妨げられる。図６に示した命令群は、リング０コードが、より高いリングレベルで実行されていることを公開し、これらの命令を使用するコードは、問題があり、一般に、直接実行環境内で実行することが安全ではない。
【００４４】
さらに、ＩＡ３２アーキテクチャは、グローバル記述子テーブルとローカル記述子テーブル（それぞれ、ＧＤＴ及びＬＤＴ）をともに含む。これらのテーブルは、コードセグメント及びデータセグメント、ならびにリング間遷移を制御するゲートを含む。ゲストＯＳは、リング３とリング０の間の遷移を可能にするようにＧＤＴまたはＬＤＴをセットアップすることができる。しかし、ＶＭＭは、リング０への直接の遷移をまったく許すことができない。というのは、それにより、ホストプロセッサに対する直接の支配がゲストＯＳに与えられるからである。代わりに、ＶＭＭは、リング０へのいずれの遷移にも関与して、より低い特権リングレベルに実行を適切に向けなおすことができるようにしなければならない。これは、ＶＭＭが、ゲストのＧＤＴ及びＬＤＴを直接に使用できないことを意味する。むしろ、ＶＭＭは、ゲストのＧＤＴ及びＬＤＴの内容をプライベートテーブルにシャドーイング（shadow）して、いずれのリング０へ直接に向かう遷移も必要に応じて防止するように調整を行うことができなければならない。それらの調整は、ＤＰＬ（記述子特権レベル）フィールド、ならびに記述子タイプフィールドのコードビットに制限される。これらのささいな変更のため、シャドーイングされた（shadowed）記述子テーブルは、ゲスト記述子テーブルとはわずかに異なる可能性がある。
【００４５】
ほとんどの場合、これらの違いは、ソフトウェアには見えないが、その違いを公開する図７に示したいくつかの命令がＩＡ３２アーキテクチャには存在する。例えば、ＶＭＭは、ゲストＧＤＴ及びＬＤＴと重なり合う保護ページを書き、これらのテーブルを変更しようとするいずれの試みも、ＶＭＭ内部で書き込み保護エラーをもたらすようにする。これに応答して、ＶＭＭは、ゲストＧＤＴまたはＬＤＴに対する変更が、内部シャドーテーブルの中で反映されることを確実にする。ただし、現在、読み込まれている選択子に対応するＧＤＴエントリまたはＬＤＴエントリが変更された場合、対応するメモリ内の記述子に対する変更は、不可逆である。というのは、ＩＡ３２アーキテクチャは、現在、読み込まれているセグメント記述子を読み取る手段を提供しないからである。この状況では、ＶＭＭは、メモリ内の記述子が変更されることを許す前に、エミュレーションに頼らなければならない。
【００４６】
ＩＡ３２仮想化の１つの特定の問題となる態様は、ＥＦＬＡＧＳレジスタの中のＩＦ（割り込みマスクフラグ）に関わり、それは、この状態が、明確に特権的でなければならないが、非特権コードによって容易に読み取られることが可能であるという点においてである。さらに、非特権コード内からＩＦを変更しようとする試みが、トラップを生成する代わりに、単に無視される。つまり、ＩＦを操作する一部の命令（ＳＴＩ及びＣＬＩ）に対してトラップすることは可能であるが、ＩＦにアクセスする他の命令は、トラップしない（ｎｏｎ−ｔｒａｐｐｉｎｇ）。やはりトラップしない（ただし、仮想化の点からはトラップするべき）他の命令を図８に示している。
【００４７】
残念ながら、コードが仮想マシン内部で実行されている間、仮想化されたＩＦにおいて現実のＩＦをミラーリングすることは、実行可能ではない。というのは、それにより、ゲストＯＳが、割り込みを無期限にオフにすることが可能になる、つまり、バグのあるゲストＯＳが、ホストシステム全体をハングさせることが可能になるからである。この理由で、ゲストコードが実行されているとき、仮想化された（ゲスト）ＩＦがクリアされている場合でも、ホストＩＦは、常時、有効なままにされる（すなわち、割り込みは、マスクされない）。
【００４８】
同様に、ＳＴＩ／ＣＬＩ命令に対してトラップすることは、ＥＦＬＡＧＳのＩＯＰＬフィールドを調整することを要し、ＩＯＰＬは、ＩＦに関連する欠点と同様の欠点を伴って非特権コードに対して容易に公開される特権フィールドのさらに別の例である。ＩＦフィールド及びＩＯＰＬフィールドに関連する問題のある命令を図９に示している。
【００４９】
ＩＡ３２アーキテクチャは、ＴＳＳ、ＧＤＴ、ＬＤＴ、及びＩＤＴを含め、プロセッサによって使用される一部のデータ構造も定義し、それらのデータ構造は、ページテーブルによって定義された論理アドレス空間内に配置される。ゲストＯＳが仮想マシン内部で実行されている場合、ページテーブルにより、アドレス空間のいずれの領域が、メモリ、フレームバッファ、メモリマップレジスタ（ｍｅｍｏｒｙ  ｍａｐｐｅｄ  ｒｅｇｉｓｔｅｒ）などをマップするのに使用されるかが定義される。ほとんど常に、アドレス空間のいくらかの部分は、使用されないままにされる。ゲストＯＳが、独自のＴＳＳ、ＧＤＴ、ＬＤＴ、及びＩＤＴを保持する一方で、ＶＭＭは、それらのデータ構造の独自のプライベートバージョンを提供する。ただし、それらの構造は、ゲストＯＳによって支配されるアドレス空間内のどこかにマップされなければならない。また、ＶＭＭのコード及び内部データ構造も、同一のアドレス空間内にマップされなければならない。したがって、ＶＭＭは、ゲストＯＳによって現在、使用中でないアドレス空間のいくらかの（比較的小さい）部分を見つける必要がある。この領域は、「ＶＭＭ作業領域（ｗｏｒｋｉｎｇ  ａｒｅａ）」と呼ばれる。ＶＭＭは、ゲストＯＳページテーブルを能動的に監視して、ゲストＯＳが、ＶＭＭ作業領域によって現在、占められている領域にページをマップしようとしているかどうかを判定する。マップしようとしている場合、ＶＭＭは、アドレス空間の別の未使用部分を探し出し、自らを再配置する。
【００５０】
この技術により、広いゲストＯＳの互換性が可能になるが、ゲストアドレス空間全体が使用されている場合、この技術には問題がある。ゲストアドレス空間全体が使用されることは、大量の物理メモリが仮想マシンに割り当てられている場合、生じる可能性がある。この理由で、ＶＭＭは、ゲストＯＳが、特にＶＭＭ作業領域のためにアドレス空間の一部分を確保することができる機構を提供する。この空間が指定されると、ＶＭＭは、自らをこの空間に再配置し、変更を能動的に追跡することを止める（ゲストＯＳが、もはや確保された領域を使用しないという約束を守るという前提の下で）。
【００５１】
トラップ命令は、功罪相半ばする。一方で、命令は、トラップする場合、適切に仮想化することができる。他方で、トラップにより、非常に大きなパフォーマンスオーバーヘッドが課せられる。例えば、ＳＴＩ命令は、通常、実行されるのに１サイクルを要するが、ＳＴＩがＶＭ環境内で実行される場合、ＶＭＭによって処理されるトラップが生じさせられ、これは、Ｐｅｎｔｉｕｍ（登録商標）４プロセッサ上で、しばしば、実行するのに５００を超えるサイクルを要する。一部のＶＭは、高い頻度のトラップ命令を追跡し、可能な場合、仮想化された環境内で元の命令の意味を保つ等価の非トラップコードでそのトラップ命令をパッチする（ｐａｔｃｈ）ことにより、このオーバーヘッドを軽減しようと試みている。これは、ゲストＯＳカーネル空間内で割り振られるページングできない（ｎｏｎ−ｐａｇｅａｂｌｅ）「パッチバッファ」の使用を介して行われる。
【００５２】
ただし、動作の際、パッチ可能なトラップ命令は、長いＪＭＰ命令を可能にするのに少なくとも５バイトの長さを要する。つまり、この必須の５バイトなしでは、ＶＭＭは、トラップ命令の後に続く命令または命令群を上書きする必要がある。というのは、パッチされる命令の長さが、５バイトに満たない可能性があるからである。
【００５３】
改良された仮想化（例えば、ＩＡ３２） 
ＩＡ３２アーキテクチャの以上の欠点及び限界の多くは、トラップが所望される場合にトラップを生じさせることができない命令によってもたらされる。つまり、それらの命令が、代わりに、トラップを生じさせた場合、ＶＭＭは、それらの命令を正しくエミュレートすることができる。本発明は、それらの問題のある命令に関してトラップを効率的に生成する様々な実施形態を提供する。本発明の様々な実施形態は、ＯＳコードを最適化し、「合成命令」（以下により詳細に説明する）を使用することにより、ＩＡ３２アーキテクチャにおける仮想化を改良することを目的とする。本発明のいくつかの実施形態は、以下のとおりゲストＯＳを最適化する図１０に示した一連のステップを含む。すなわち、
・ゲストＯＳにおいて、リング０コード内のＳＳまたはＣＡＬＬＦから、ＰＵＳＨ  ＣＳ、ＰＵＳＨ  ＳＳ、ＭＯＶのあらゆる使用を探し出し、削除し、かつ／または置き換える。前述したとおり、これらの命令は、仮想マシン内部で実行されているリング０コードが、実際には、より低い特権リングレベルで実行されているという事実を公開する。ただし、これらの命令は、ほとんどのオペレーティングシステムにおいて非常に稀であり、一般に、完全に削除すること、あるいは他の既存の命令、またはグループの既存の命令で置き換えることができる。
【００５４】
・ゲストＯＳにおいて、ＶＥＲＲ、ＶＥＲＷ、またはＬＡＲのあらゆる使用を探し出し、それらの使用が、記述子タイプのＤＰＬまたはコードビットに依存しないことを確認する。やはり、これらの命令は、ほとんどのＯＳにおいて使用されない。
【００５５】
・ゲストＯＳにおいて、ＳＧＤＴ、ＳＬＤＴ、ＳＩＤＴ、またはＳＴＲのあらゆる使用を探し出し、これらの命令を削除するか、または対応するＶＭ合成命令で置き換える。このステップを実施するため、ゲストオペレーティングシステムにおける記述子テーブルエントリが、記述子テーブルエントリを更新する合成命令（例えば、ＶＭＷＲＤＥＳＣ）で置き換えられ、シャドー記述子テーブルを保持することに関連するオーバーヘッドが回避される。
【００５６】
・ゲストＯＳにおいて、ＣＰＵＩＤのあらゆる使用を探し出し、つまり、システムのすべての部分がＣＰＵＩＤ情報にアクセスするのに使用する共通サブルーチンによってＯＳにおいてＣＰＵＩＤにアクセスが行われる場合を探し出し、ＣＰＵＩＤを直接に読み取る代わりに、合成命令を使用して仮想化されたＣＰＵＩＤ情報にアクセスするようにＣＰＵＩＤを読み取る共通サブルーチンを変更する。ＣＰＵＩＤ仮想化は、ホストプロセッサによって戻される特定のＣＰＵＩＤ情報が、ゲスト機能と競合しない限り必要ないが、新たなプロセッサが、ＶＭＭがサポートを提供していなかった機能を実施する場合、仮想化されたＣＰＵＩＤ値により、その機能が存在していなかったことが示されるが、仮想化されていないＣＰＵＩＤ値は、その機能が存在していたことを示す。
【００５７】
・ゲストＯＳにおいて、あらゆるＭＰスピンロックを探し出し、それらを変更してＶＭＳＰＬＡＦ（スピンロック獲得失敗）合成命令を使用する。
【００５８】
・ゲストＯＳにおいて、ＰＵＳＨＦ（Ｄ）及びＰＯＰＦ（Ｄ）のあらゆるインスタンスを探し出し、それらの命令の使用が、プッシュされている、またはポップされているＩＦの値に依拠する場合、それらの命令を対応する合成命令で置き換える。このステップは、通常、ＯＳを「ＶＭクリーン」にすることに関わる作業の大部分である。
【００５９】
・ゲストＯＳにおいて、ＧＤＴエントリまたはＬＤＴエントリが変更される位置を特定し、変更の数を最小限に抑え、残りの変更をＶＭＷＲＤＥＳＣ合成命令で置き換える。（現在、読み込まれている選択子が変更される状況を回避するように特に注意を払う。）
・ゲストＯＳにおいて、ＧＤＴ及びＬＤＴが、他のデータ構造をまったく含まないページ上に配置されていることを確認し、そうなっていない場合、そうなるようにする。
【００６０】
・ゲストＯＳにおいて、リング０コード内のＳＴＩ及びＣＬＩのインスタンスを探し出し、それらを対応する５バイト長の合成命令で置き換える。合成形態を使用することにより、ＶＭＭは、コードをよりよくパッチして、トラップの必要性を減らすことができる。というのは、それぞれ５バイト未満の長さであるＳＴＩ命令及びＣＬＩ命令を直接にパッチすることは、通常のパッチ可能なトラップ命令が、長いＪＭＰ命令を可能にするのに少なくとも５バイトの長さを要することに起因して、ＶＭＭが、トラップ命令の後に続く命令または命令群を上書きすることを要求するからである。
【００６１】
・ＶＭＳＥＴＩＮＦＯ合成命令を以下に記すとおり利用する。以上９つの命令により、「ＶＭクリーニング」が完了しており、したがって、この合成命令は、リング０内で直接実行を有効にすることができる。
【００６２】
・「ＶＭ危険（ｕｎｓａｆｅ）」のままであるリング０コードの大きいブロックのまわりで直接実行を無効にし、その後で再び有効にすることを動的に行う。ゲストオペレーティングシステムが、直接実行を無効にし（例えば、ＶＭＤＸＤＳＢＬ）、再び有効にする（ＶＭＤＸＥＮＢＬ）ことを動的に行うための合成命令を提供することにより、ゲストオペレーティングシステムは、「ＶＭ危険」リング０コードの大きいブロックを回避することができる。
【００６３】
・ＶＭＭが「パッチバッファ」を使用することができるかどうかを確かめ、使用できる場合、カーネル空間内のパッチバッファを最良のパフォーマンスに割り当てる。このパッチバッファは、ページング不可能であり、リング０コードが実行されるすべてのアドレス空間コンテキストにマップされ、ＶＭＧＥＴＩＮＦＯ合成命令によって示されるサイズでなければならない。パッチバッファの位置及びサイズは、以下に記すとおり、ＶＭＳＥＴＩＮＦＯを使用して設定することができる。パッチバッファは、各仮想プロセッサにではなく、システム全体に一度に割り当てられなければならない。
【００６４】
・ＶＭＭが、「ＶＭＭ作業領域」を要するかどうかを判定し、要する場合、示されたサイズ及び配置のアドレス空間をゲストＯＳ内で割り当て、確保する。以下に説明するとおり、ＶＭＳＥＴＩＮＦＯ命令の使用を介して、この確保された領域のベースを設定する。
【００６５】
ＶＭ「合成命令」は、ＶＭに対して特別な意味を有するさもなければイリーガルなプロセッサ命令である。このため、合成命令は、合成命令をサポートしないＶＭ内部で、または非ＶＭ環境において実行される場合、タイプ６（イリーガルな動作）の例外を生じさせ、したがって、ＯＳが、合成命令を使用する前に、合成命令サポートを確認することが重要である。ＶＭ合成命令サポートを確認するため、ＯＳは、ＶＭＣＰＵＩＤ命令を実行し、この命令によりイリーガル命令エラーが生じた場合、合成命令がサポートされていないことが分かる。（ＶＭＣＰＵＩＤは、すべての特権レベルから実行することができ、したがって、ユーザレベルコードの中で使用して安全であることに留意されたい。）これと同じ試験を使用して、ＶＭ環境内で実行しているかどうかを判定することができ、そうである場合、その後、仮想マシンが、基礎にあるＶＭＭの機能または動作にアクセスする、または変更するのを許すことができる。以下は、トライ／エクセプト（ｔｒｙ／ｅｘｃｅｐｔ）機構及び構造化された例外処理を使用してそのような試験を実行する典型的なコードである。
【００６６】
【数１】
2005122711.tif 000003
【００６７】
合成命令を使用して、ｘ８６プロセッサ上の仮想化に悪影響を与えるｘ８６ＩＳＡ命令を、ｘ８６プロセッサにおいて例外を生じさせる合成命令で置き換える、または補足することができ、その例外は、前記ｘ８６プロセッサ上で実行される仮想マシンによって、前記仮想マシンによる処理のためにトラップされる。同様に、第１の仮想マシンが第２の仮想マシン上で実行される再帰的な仮想化の場合、ｘ８６プロセッサにおいて例外を生じさせる合成命令で置き換えられた、または補足された命令を第２の仮想マシンの中を通過させて、前記第１の仮想マシンによって処理のためにトラップされるようにすることができる。
【００６８】
本発明のいくつかの実施形態では、合成命令は、すべて５バイトの長さであり、合成命令をＪＭＰ命令でパッチしてトラップオーバーヘッドを小さくすることを可能にしている。（他の実施形態では、合成命令の長さは、より長いことも、より短いことも可能である。）合成命令の１６進符号化は、次のフォーマットを使用する。すなわち、０ＦＣ７Ｃ８ＸＸＸＸ（ここで、「ＸＸ」は、特定の合成命令を識別するための２桁の１６進変数である）。この命令は、ＣＭＰＸＣＨＧ８Ｂ命令として復号化されるが、指定された宛先オペランドがレジスタである（したがって、トラップをもたらす）ため、「イリーガル」と見なされる。ただし、本発明のいくつかの実施形態では、合成命令は、いずれの形態の命令接頭辞（例えば、ＬＯＣＫ、ＲＥＰ、セグメントオーバーライド、オペランドサイズオーバーライド、アドレスサイズオーバーライド）もサポートせず、そのような実施形態において接頭辞を使用しようとする試みは、イリーガルな命令の例外（ＵＤ＃）をもたらす。
【００６９】
合成命令 
本発明の様々な実施形態に関する合成命令のサブセットを以下に詳細に説明する。以下にリストアップしないさらなる合成命令は、本明細書で前にも説明している。また、本明細書で明示的に説明しないさらなる合成命令は、それでも、本発明の様々な実施形態によって予期されており、本明細書のいずれの箇所も、本発明を明示的に明らかにする特定の合成命令に限定するものと受け止めてはならない。
【００７０】
ＶＭＧＥＴＩＮＦＯ−ＶＭ情報を獲得する 
ＶＭＧＥＴＩＮＦＯは、特定のＶＭ情報をフェッチして、それをＥＤＸ：ＥＡＸの中に入れる。戻される情報は、ＥＣＸにおけるインデックスに依存する。指定されたインデックスが、仮想プロセッサによってサポートされていない情報を指している場合、ＧＰ（０）が生成される。インデックスが、サポートされている情報を指している場合、ＥＤＸ：ＥＡＸは、その情報値に設定される。（この命令のために使用されるレジスタ規則は、ＲＤＭＳＲ命令と同様であることに留意されたい。）この命令は、システム全体の状態に影響を与えることで、ほとんどのプロセッサ命令とは異なる。複数のプロセッサを有するシステム上で、ＶＭＧＥＴＩＮＦＯを使用してアクセスされる状態は、「グローバル」であると見なされる。例えば、１つのプロセッサ上でＶＭＳＥＴＩＮＦＯを使用してＶＭＭ作業領域ベースを設定することにより、第２のプロセッサ上でＶＭＧＥＴＩＮＦＯを使用して同一の値が読み返されることが可能になる。
【００７１】
ＶＭＳＥＴＩＮＦＯ−ＶＭ情報を設定する 
ＶＭＳＥＴＩＮＦＯは、ＥＤＸ：ＥＡＸにおいて指定されるとおり特定のＶＭ情報を設定する。設定される情報は、ＥＣＸにおけるインデックスに依存する。指定されたインデックスが、仮想プロセッサによってサポートされていない、または書き込み可能でない情報を指している場合、ＧＰ（０）が生成される。（この命令のために使用されるレジスタ規則は、ＷＲＭＳＲ命令と同様であることに留意されたい。）この命令は、システム全体の状態に影響を与えることで、ほとんどのプロセッサ命令とは異なる。複数のプロセッサを有するシステム上で、ＶＭＳＥＴＩＮＦＯを使用して設定された状態は、「グローバル」であると見なされる。例えば、１つのプロセッサ上でＶＭＳＥＴＩＮＦＯを使用してＶＭＭ作業領域ベースを設定することにより、第２のプロセッサ上でＶＭＧＥＴＩＮＦＯを使用してそのデータを読み返すことができるようになる。
【００７２】
ＶＭＤＸＤＳＢＬ−直接実行を無効にする 
ＶＭＤＸＤＳＢＬは、ＶＭＤＸＥＮＢＬの使用を介して直接実行が次回に有効にされるまで、直接実行を無効にする。この命令は、リング０コード内からだけ実行することができ、直接実行が長期間にわたって無効にされるのを防止するように割り込み（または任意の形態の先取り（ｐｒｅｅｍｐｔｉｏｎ））が無効にされている場合にだけ、実行されるべきである。この命令は、「ＶＭ安全」でない（すなわち、いくつかの仮想化可能でない命令、またはＶＭ環境内で、直接実行で実行されている場合、破られる前提を含む）コードの小さいブロックを保護するのに使用することができる。この命令は、命令が実行されるプロセッサだけに影響を与える。この命令は、仮想マシンにおけるその他の仮想プロセッサに影響を与えない。直接実行が既に無効にされている場合、この命令は、何も行わない。
【００７３】
ＶＭＤＸＥＮＢＬ−直接実行を有効にする 
ＶＭＤＸＥＮＢＬは、可能な場合、直接実行を有効にする。この命令は、リング０コード内からだけ実行することができ、割り込み（または何らかの形態の先取り）が無効にされている場合にだけ、実行されるべきである。この命令は、ＶＭＤＸＤＳＢＬ命令と併せて使用して、「ＶＭ安全」でない（すなわち、いくつかの仮想化可能でない命令、またはＶＭ環境内で、直接実行で実行されている場合、破られる前提を含む）コードの小さいブロックを保護することができる。この命令は、命令が実行されるプロセッサだけに影響を与える。この命令は、仮想マシンにおけるその他の仮想プロセッサに影響を与えない。直接実行が既に有効にされている場合、この命令は、何も行わない。
【００７４】
ＶＭＣＰＵＩＤ−仮想化されたＣＰＵ情報 
ＶＭＣＰＵＩＤは、シャドーイングされた（shadowed）ＣＰＵ情報を戻すこと以外は、現実のＣＰＵＩＤ命令と同様である。
【００７５】
ＶＭＨＬＴ−停止 
ＶＭＨＬＴは、リング３及びｖ８６モードを含め、任意のプロセッサモードから実行することができること以外は、通常のＨＬＴ命令と同様である。ＶＭＨＬＴを任意の「アイドルループ」の中に挿入して、仮想マシン内部のプロセッサ利用率を低減することができる。一部の実施形態では、プロセッサを停止させるためのこの合成命令（例えば、ＶＭＨＡＬＴ）は、ユーザレベルのゲストコードとして実行することができる。
【００７６】
ＶＭＳＰＬＡＦ−スピンロック獲得失敗 
スピンロックは、しばしば、対称型マルチプロセシングをサポートするオペレーティングシステム内で使用される。これらのロックは、通常、プロセッサ間で共用される重要なリソースを保護する。これらのロックは、ロックが別のプロセッサによって比較的少ないサイクル間にわたって保持されることに依拠している。マルチプロセッサＶＭシステム内部では、他の仮想プロセッサが一時停止されたプロセッサによって保持されるリソースを待っている間、スピンロックを保持する仮想プロセッサに一時的に割り込みがかけられ、実行されていない場合、通常のスピンロック動作により、劣悪なパフォーマンス及び高いＣＰＵ利用率がもたらされる可能性がある。この状況を回避するため、ＶＭＳＰＬＡＦ命令を使用して、ＯＳが、獲得することに失敗したスピンロックを待っていることをＶＭＭに通知することができる。これに応答して、ＶＭＭは、実行する別の仮想プロセッサをスケジュール設定するか、あるいは現在の仮想プロセッサを一時停止して、リソースが開放された時点で後に実行されるようにスケジュール設定することができる。
【００７７】
ＶＭＰＵＳＨＦＤ−仮想化されたフラグレジスタをプッシュする 
ＶＭＰＵＳＨＦＤは、「ＶＭ安全」であること以外は、通常のＰＵＳＨＦＤ命令と同様である。ＶＭＰＵＳＨＦＤは、３２ビットのオペランドサイズと３２ビットのスタックポインタの両方を前提にしている。ＣＳ及びＳＳが、現在、３２ビットではない場合、ＶＭＰＵＳＨＦＤの動作は、未定義である。また、ＶＭＰＵＳＨＦＤは、セグメントバウンド（ｂｏｕｎｄ）または書き込み検査を現実のＰＵＳＨＦＤ命令が行うのと同じ形で実行することも保証されていない。スタック上にプッシュされたＥＦＬＡＧＳレジスタの値は、シャドーイングされたＩＦ値を含む。ただし、ＩＯＰＬフィールドの値は、正しくない可能性がある。ＩＯＰＬを読み取ることを要するコードは、ＩＮＴ命令、外部割込み、または例外に応答してスタック上にプッシュされたＥＦＬＡＧＳの値を使用しなければならない。この命令は、リング０コード内でだけ使用することができる。
【００７８】
ＶＭＰＯＰＦＤ−仮想化されたフラグレジスタをポップする 
ＶＭＰＯＰＦＤは、「ＶＭ安全」であること以外は、通常のＰＯＰＦＤ命令と同様である。ＶＭＰＯＰＦＤは、３２ビットのオペランドサイズと３２ビットのスタックポインタの両方を前提にしている。ＣＳ及びＳＳが、現在、３２ビットではない場合、ＶＭＰＯＰＦＤの動作は、未定義である。また、ＶＭＰＯＰＦＤは、セグメントバウンドまたは書き込み検査を現実のＰＵＳＨＦＤ命令が行うのと同じ形で実行することも保証されていない。ポップされたＥＦＬＡＧＳ内のＩＦフィールドの値は、遵守される（honored）。ただし、ＩＯＰＬフィールドの値は、無視される可能性がある。ＩＯＰＬを調整することを要するコードは、ＩＲＥＴＤ命令またはＶＭＩＲＥＴＤ命令を使用しなければならない。この命令は、リング０コード内でだけ使用することができる。
【００７９】
ＶＭＣＬＩ−割り込みフラグをクリアする 
ＶＭＣＬＩは、５バイト長であり、ＶＭＭの中にトラップすることを回避するようにパッチされることが可能であること以外は、通常のＣＬＩ命令と同様である。この命令は、リング０コード内でだけ使用することができる。
【００８０】
ＶＭＳＴＩ−割り込みフラグを設定する 
ＶＭＳＴＩは、５バイト長であり、ＶＭＭの中にトラップすることを回避するようにパッチされることが可能であること以外は、通常のＳＴＩ命令と同様である。ＶＭＳＴＩは、次の命令が完了する前に割り込みが行われることを防止しない点でも、通常のＳＴＩと異なっている。この規則に対する唯一の例外は、ＶＭＳＴＩの後にＳＹＳＥＸＩＴ命令が続く場合だけであり、ＳＹＳＥＸＩＴ命令は、ＶＭＳＴＩと一緒に原子として（ａｔｏｍｉｃａｌｌｙ）実行される。この命令は、リング０コード内でだけ使用することができる。
【００８１】
ＶＭＩＲＥＴＤ−割り込みから戻る 
ＶＭＩＲＥＴＤは、「ＶＭ安全」であること以外は、通常のＩＲＥＴＤ命令と同様である。通常のＩＲＥＴＤ命令とは異なり、この命令は、３２ビットのオペランドサイズ及び３２ビットのスタックポインタを常に前提にしている。ＶＭＩＲＥＴＤの動作は、ＣＳ及びＳＳの現在のサイズが３２ビットではない場合、未定義である。この命令は、リング０コード内でだけ使用することができる。ＶＭＩＲＥＴＤは、ｖ８６モードに戻るためにＩＲＥＴＤが使用される可能性がある場合には、いつでも使用されなければならない。ＶＭＩＲＥＴＤの使用により、ＣＰＬ＞０からｖ８６モードに戻る場合のＩＡ３２プロセッサの遺憾な動作が回避される。（リング圧縮により、リング０コードが、ＶＭ環境内で、より小さい特権のリングレベルにおいて実行されることになることに留意されたい。）
ＶＭＳＧＤＴ−グローバル記述子テーブルを格納する 
ＶＭＳＧＤＴは、シャドーイングされたＧＤＴのベース及び長さを格納すること以外は、現実のＳＧＤＴ命令と同様である。ＶＭＳＧＤＴは、メモリオペランドに関するアドレス指定モードがＤＳ：［ＥＡＸ］であり、ＤＳが、大きく開かれた書き込み可能なセグメントであることを前提にする。ＤＳが大きく開かれた書き込み可能なセグメントではない場合、ＶＭＳＧＤＴの動作は、未定義である。
【００８２】
ＶＭＳＩＤＴ−割り込み記述子テーブルを格納する 
ＶＭＳＩＤＴは、シャドーイングされたＩＤＴのベース及び長さを格納すること以外は、現実のＳＩＤＴと同様である。ＶＭＳＩＤＴは、メモリオペランドに関するアドレス指定モードがＤＳ：［ＥＡＸ］であり、ＤＳが、大きく開かれた書き込み可能なセグメントであることを前提にする。ＤＳが大きく開かれた書き込み可能なセグメントではない場合、ＶＭＳＩＤＴの動作は、未定義である。
【００８３】
ＶＭＳＬＤＴ−ローカル記述子テーブルを格納する 
ＶＭＳＬＤＴは、シャドーイングされたＬＤＴ選択子を格納すること以外は、現実のＳＬＤＴ命令と同様である。ＶＭＳＬＤＴは、宛先オペランドが、ＥＡＸレジスタであることを前提とする。
【００８４】
ＶＭＳＴＲ−タスクレジスタを格納する 
ＶＭＳＴＲは、シャドーイングされたＬＤＴ選択子を格納すること以外は、現実のＳＴＲ命令と同様である。ＶＭＳＴＲは、宛先オペランドがＥＡＸレジスタであることを前提とする。
【００８５】
ＶＭＳＤＴＥ−記述子テーブルエントリに格納する 
ＶＭＳＤＴＥは、ＧＤＴ内またはＬＤＴ内の記述子エントリを更新するのに使用される。使用するには、選択子をＥＣＸに読み込む。ＥＣＸの上位の１６ビット及び下位の２ビット（ビット０及び１）は、無視される。ＥＣＸのビット２により、選択子がグローバル記述子テーブルを指すか、またはローカル記述子テーブルを指すかが示される。残りの部分（ビット３ないし１５）は、選択子、すなわち、オフセットを符号化して記述子テーブルに入れる。ＥＤＸ：ＥＡＸが、指定された記述子テーブルエントリに書き込む値とともに読み込まれなければならない。この命令は、記述子テーブルを直接に変更する代わりに、ＶＭＭのシャドー記述子テーブルが同時に更新されることが可能であるように使用されなければならない。現在、読み込まれているセグメント選択子に対応する記述子エントリを変更してはならない。それにより未定義の動作がもたらされる。ＶＭＭによって推奨されない場合（ＶＭＧＥＴＩＮＦＯ命令によって戻されるＶＭＭ情報ビット４によって示される）、この命令を使用してはならない。推奨されない場合にこの命令を使用することにより、将来のＶＭＭ実施形態上で実行している場合、劣悪なパフォーマンスがもたらされる可能性がある。この命令は、リング０コードからだけ使用することができる。
【００８６】
結論 
本明細書で説明する様々なシステム、方法、及び技術は、ハードウェアで、またはソフトウェアで、または適切な場合、ハードウェアとソフトウェアの組み合わせで実施することができる。したがって、本発明の方法及び装置、または本発明の一部の態様または部分は、フロッピー（登録商標）ディスケット、ＣＤ（compact disc）−ＲＯＭ（read only memory）、ハードドライブ、または他の任意のマシン可読記憶媒体などの実体のある媒体の中で実現されたプログラムコード（すなわち、命令）の形態をとることが可能であり、プログラムコードが、コンピュータなどのマシンに読み込まれ、マシンによって実行された場合、そのマシンが、本発明を実施するための装置になる。プログラマブルコンピュータ上のプログラムコード実行の場合、コンピュータは、一般に、プロセッサ、そのプロセッサによって読み取り可能な記憶媒体（揮発性のメモリ及び／または記憶要素、及び不揮発性のメモリ及び／または記憶要素を含む）、少なくとも１つの入力デバイス、及び少なくとも１つの出力デバイスを含む。１つまたは複数のプログラムは、好ましくは、コンピュータシステムと通信する高レベルの手続き言語、またはオブジェクト指向プログラミング言語で実装される。ただし、プログラムは、所望される場合、アセンブリ言語、または機械語で実装することもできる。いずれにしても、言語は、コンパイルされる言語、または解釈される言語であることが可能であり、ハードウェア実施形態と組み合わせることができる。
【００８７】
また、本発明の方法及び装置は、電気配線またはケーブル配線を介して、光ファイバを介して、または他の任意の形態の伝送を介してなど、何らかの伝送媒体を介して伝送されるプログラムコードの形態で実施してもよく、プログラムコードが、ＥＰＲＯＭ（erasable programmable read-only memory）、ＰＬＤ（programmable logic device）、クライアントコンピュータ、ビデオレコーダなどのマシンによって受信され、読み込まれ、実行された際、そのマシンが、本発明を実施するための装置となる。汎用プロセッサ上に実装される場合、プログラムコードは、プロセッサと組み合わさって、本発明のインデックス作成（ｉｎｄｅｘｉｎｇ）機能を実行するように動作する独特の装置を提供する。
【００８８】
本発明を様々な図の好適実施形態に関連して説明してきたが、本発明を逸脱することなく、本発明と同一の機能を実行するために、他の同様の実施形態を使用すること、または説明した実施形態に対して変更及び追加を行うことも可能であることを理解されたい。例えば、本発明の典型的な実施形態は、パーソナルコンピュータの機能をエミュレートするデジタルデバイスの状況で説明したが、本発明は、本明細書で説明したそのようなデジタルデバイスに限定されず、有線であれ、無線であれ、ゲームコンソール、ハンドヘルドコンピュータ、ポータブルコンピュータ、その他などのいくつもの既存の、または出現するコンピューティングデバイスまたはコンピューティング環境に適用することができ、通信ネットワークを介して接続され、そのネットワークを介して対話するいくつものそのようなコンピューティングデバイスに適用することができることが、当業者には認識されよう。さらに、特に無線ネットワーク化されたデバイスの数が増えつづけているので、ハンドヘルドデバイスオペレーティングシステム、及びその他のアプリケーション特有のハードウェア／ソフトウェアインタフェースシステムを含め、様々なコンピュータプラットフォームが、本明細書で企図されていることも強調されなければならない。したがって、本発明は、いずれの単一の実施形態にも限定されず、むしろ、特許請求の範囲に従う広さと範囲で解釈されなければならない。
【００８９】
最後に、本明細書で説明する開示した実施形態は、他のプロセッサアーキテクチャ、コンピュータベースのシステム、またはシステム仮想化における使用にも適合させることができ、そのような実施形態は、本明細書で行った開示によって明確に予期されており、したがって、本発明は、本明細書で説明した特定の実施形態に限定されず、代わりに、最も広く解釈されなければならない。同様に、プロセッサ仮想化以外の目的での合成命令の使用も、本明細書で行った開示によって予期されており、プロセッサ仮想化以外の状況における合成命令のいずれのそのような利用も、最も広い形で、本明細書で行った開示に読み込まれなければならない。
【図面の簡単な説明】
【００９０】
【図１】本発明を適用できる実施形態のコンピュータシステムを表すブロック図である。
【図２】本発明を適用できる実施形態のネットワークを表す概略図である。
【図３】ホストコンピュータシステムにおいて実行されているエミュレートされたコンピュータシステムの要素の論理関係を示す図である。
【図４】ｘ８６プロセッサ（特にＩＡ３２アーキテクチャに関する）のＥＦＬＡＧＳレジスタを示す図である。
【図５】仮想マシンモニタ（ＶＭＭ）によって通常、認識される４つの異なるプロセッサモード分類を示す図である。
【図６】従来のｘ８６プロセッサ仮想化アプローチが抱える問題である、リング０コードであるはずのものが実際にはより高いリングレベルで実行されていることを公開するｘ８６命令を示すテーブルの図である。
【図７】仮想マシンがゲストオペレーティングシステムに関するあるｘ８６レジスタ情報をシャドーイングしていることを公開する命令を示すテーブルの図である。
【図８】仮想化のためにはトラップすべきであるが、ｘ８６アーキテクチャではトラップしない命令を示すテーブルの図である。
【図９】ｘ８６アーキテクチャにおけるＩＦフィールド及びＩＯＰＬフィールドに関係する問題のある命令を示すテーブルの図である。
【図１０】ＯＳコードを最適化し、「合成命令」を使用することによってＩＡ３２アーキテクチャにおける仮想化を改良するための方法の一実施形態を示す流れ図である。
【符号の説明】
【００９１】
１０２  コンピュータハードウェア
１０４  仮想マシンモニタ
１０６  ホストオペレーティングシステム
１０８  仮想マシンＡ
１１０  仮想マシンＢ
１１２  ゲストＯＳＡ
１１４  ゲストＯＳＢ
１１６  アプリケーションＡ１
１１８  アプリケーションＡ２
１２０  アプリケーションＢ１
１２２  ネイティブＯＳＸ
１２４  アプリケーションＸ１
３１２  ホストオペレーティングシステムおよびハードウェアアーキテクチャ
３１４  エミュレーションプログラム
３１６  ゲストハードウェアアーキテクチャ
３１８  ゲストオペレーティングシステム
３２０  ソフトウェアアプリケーション
【図１】
2005122711.tif 000004
【図２】
2005122711.tif 000005
【図３】
2005122711.tif 000006
【図４】
2005122711.tif 000007
【図５】
2005122711.tif 000008
【図６】
2005122711.tif 000009
【図７】
2005122711.tif 000010
【図８】
2005122711.tif 000011
【図９】
2005122711.tif 000012
【図１０】
2005122711.tif 000013