以下、本発明の一実施形態を添付図面に基づいて説明する。
図1は、第1の実施形態を示し、本発明を適用する計算機システムのブロック図である。物理サーバ(物理計算機)101は、仮想化支援機能を備えて演算処理を実行する物理CPU(プロセッサ)104、104nと、データやプログラムを格納するメモリ105と、物理サーバ101の外部の装置等とデータの送受信を行うためのI/O装置106と、を主体にして構成される。
物理CPU104、104nは、メモリコントローラを備えたノースブリッジ4に接続されてメモリ105にアクセスする。ノースブリッジ4は、I/O装置106と接続するサウスブリッジ5に接続されており、物理CPU104、104nは、I/O装置106にアクセスする。I/O装置106のひとつは接続線を介してハードディスクドライブ(HDD)6に接続される。HDD6には、後述する仮想マシンマネージャやOSまたはアプリケーション等のプログラムが格納されており、物理CPU104、104nはHDD6のプログラムをメモリ105にロードし、実行イメージをメモリ105上に展開してから実行する。I/O装置106は、ネットワークインターフェースやホストバスアダプタ等で構成される。
また、物理CPU104は、任意の数(ソケット)のCPUで構成しても良いし、複数の演算コアを備えたプロセッサで構成しても良い。また、物理CPU104の仮想化支援機能(VMX:Virtual Machine Extensions)は、上述のVT−x(Virtualization Technology for IA−32 Processors)を含むものである。なお、仮想化支援機能を利用する動作モードをVMXモードとし、仮想化支援機能を利用しない通常の特権レベルによる動作モードは通常動作モードとする。
図2は、本発明を適用する仮想計算機システムのブロック図である。図2において、図1に示した物理CPU104で仮想計算機を実行する例を示す。
物理サーバ101では、複数の仮想サーバ102a、102bを稼動させるため、物理サーバ101の物理的な計算機資源を仮想化した計算機資源に変換し、各仮想サーバ102a、102bへ仮想計算機資源を割り当てるホストVMM(仮想マシンマネージャ:Virtual Machine Manager)103が実行される。このホストVMM103(第1の仮想化部)は、メモリ105に読み込まれて物理CPU104で実行されるプログラムとして提供される。
ホストVMM103は、各仮想サーバ102a〜102bに対して、仮想CPU108a〜108nを提供し、また、メモリ105とI/O装置106を各仮想サーバ102a〜102bに割り当てる。なお、各仮想サーバ102a〜102bに、物理サーバ101の計算機資源を割り当てる手法については、周知または公知のものを適宜用いればよいので、ここでは詳述しない。
物理サーバ101は、ユーザーインターフェースを提供する管理コンソール107に接続され、管理者などが仮想サーバ102a、102bに対する計算機資源の割り当てなどの設定をユーザーインターフェースを介してホストVMM103へ入力する。また、ユーザーインターフェースは、ホストVMM103から受信した設定状態等を管理コンソール107の表示装置へ出力する。
物理サーバ101のホストVMM103上で稼動する仮想サーバ102a〜102bは、ユーザプログラム110a〜110bとして、孫(ゲストVMM109のゲストOS)OS111a〜111bがそれぞれ稼動し、各孫OS111a〜111b上ではアプリケーション112a〜112bが実行されている。各孫OS111a〜111bは、ホストVMM103が提供する仮想CPU108a〜108b上で実行される。なお、仮想CPU108a〜108bは、一つの仮想サーバに対して複数の仮想CPUを割り当てるようにすることができる。
仮想サーバ102aでは、孫OS111aとして仮想化機能(ゲストVMM109)を統合した新世代OSが実行され、仮想サーバ102bでは、孫OS111bとして仮想化機能を利用しない既存のOS(例えば、NTサーバ)が実行される。
ホストVMM103は、既存のOSを実行する仮想サーバ102bに対しては、仮想CPU108bと、管理コンソール107から設定された計算機資源を割り当て、既存の孫OS111bと、アプリケーション112bを実行する。
一方、ホストVMM103は、新世代OS111aを実行する仮想サーバ102aへ割り当てる仮想CPU108aに、仮想化支援機能を提供する。仮想CPU108a上ではゲストVMM(第2の仮想化部)109が稼働し、このゲストVMM109は仮想CPU208a〜208iを提供する。新世代OSが稼働する仮想サーバ102aでは、第1の仮想CPU108a上で第2の仮想CPU208a〜208iが複数提供され、各仮想CPU208a〜208iでは、複数のユーザプログラム110a(孫OS111a及びアプリケーション112a)〜110i(孫OS111i及びアプリケーション112i)が実行される。なお、ホストVMM103がゲストVMM109を生成するようにしてもよい。
以下、本第1実施形態では、物理CPU104にVT−x機能を備え、仮想サーバ102aの孫OS111aが仮想化機能(ゲストVMM109)を統合した新世代OSの例について説明する。
VT−x機能を利用するホストVMM103は、メモリ105の所定の領域に仮想サーバ102a〜102bの状態と、物理CPU104を制御するための制御情報を格納するホストVMM保持データ11を格納する。そして、ホストVMM保持データ11には、物理CPU104を制御するための物理CPU制御データ13が格納される。物理CPU制御データ13は、仮想化支援機能を利用する仮想CPU108aのステータスを示すデータ構造で、VMCS(Virtual Machine Control Structure)という。なお、本実施形態では、ホストVMM保持データ11内の物理CPU制御データ13を、図3で示すようにシャドウVMCS130(#0〜#n−1)とし、ゲストVMM109が操作する仮想CPU制御データ114をゲストVMCS22(だい1のプロセッサ制御情報)として区別する。また、物理CPU104は、物理CPU制御データ13のシャドウVMCS130(#0〜#n−1)を参照するためのポインタ115を備える。さらに、本発明のシャドウVMCS130は、図5で示すように、一つのゲストVMM109に対して、VMXルートモードでアクセス可能なシャドウVMCS#0と、VMXノンルートモードでアクセス可能なシャドウVMCS#1を提供する。なお、以下の説明では、シャドウVMCSの総称をシャドウVMCS130とし、個々のシャドウVMCSを特定するときには、シャドウVMCS#0〜#n−1として表記する。
ホストVMM103は、物理CPU制御データ13内のシャドウVMCS130(#0〜#n−1)を書き換えることで、物理CPU104の動作モードを、ユーザプログラム110aまたはゲストVMM109を実行する動作モード(VMXノンルートモード)と、ホストVMM103を実行する動作モード(VMXルートモード)の何れかに設定する。
仮想サーバ102aでは、ホストVMM103が提供する仮想CPU108a上で、新世代OSである孫OS111aに統合された仮想化機能(仮想化ソフトウェア)が、ゲストVMM109として稼動する。
ゲストVMM109には、仮想CPU108aの仮想化支援機能を制御するためのゲストVMCS22を含む仮想CPU制御データ114と、シャドウVMCS130の更新状態を示す更新ビットマップ227と、ゲストVMCS22に対する読み書きをエミュレートする命令コード230を備える。ゲストVMCS22と更新ビットマップ227は、ホストVMM103によって割り当てられたメモリ105上の所定の領域に格納される。
また、仮想CPU108aは、ゲストVMM109の仮想CPU制御データ114(ゲストVMCS22)を参照するためのポインタ116を備える。このポインタ116は、VT−x機能に対応する孫OS111aが保持する仮想CPU108aの制御データ構造(ゲストVMCS22)へのポインタであり、孫OS111aからのVMPTRLD(VMCS用に確保したメモリをプロセッサに読み込ませる命令)命令発行時に初期化される。なお、ポインタ116の初期化は、ゲストVMM109が実行する。
図2において、新世代OSが稼動する仮想サーバ102aの仮想CPU208a〜208iは、新世代OS111aに統合されたゲストVMM109が提供するものであり、各仮想CPU208a〜208i上でユーザプログラム110a〜110iを実行することができる。なお、仮想サーバ102aのゲストVMM109は、孫OS111aのアドインソフトウェアとして機能するものであっても良い。
<本発明の概要>
仮想化を支援するVT−x機能では、ホストVMM103が物理サーバ101のメモリ105上に確保するシャドウVMCS130を用いて、物理CPU104の動作モードを制御する。仮想化支援機能としてVT−x機能を備えた物理CPU104は、通常の動作モードと仮想化支援機能を提供するVMX(Virtual Machine Extensions)モードを備え、VMXモードでは、ホストVMM103が動作するホストモード(以下、VMXルートモード)と、ゲストVMM109またはユーザプログラム(孫OS111aまたはアプリケーション112a)が動作するゲストモード(以下、VMXノンルートモード)の何れかに切り替える。
物理CPU制御データ13のシャドウVMCS130中には仮想サーバ102a上のユーザプログラム110aの動作状態を規定するフィールド(ゲスト状態エリア131)が1種類しかなく、単純には新世代OSの仮想化機能であるゲストVMM109と、ユーザプログラム110a(孫OS111aまたはアプリケーション112a)を区分できない。
そこで、本発明では、1つの仮想CPUが、ゲストVMM109とユーザプログラム110aを同時に実行することがないことに着目し、ホストVMM103が仮想化機能を統合した孫OS111aを実行する仮想サーバ102aのゲストVMM109と、ユーザプログラム110aの実行の切替を監視して、動作モードの切替時にホストVMM保持データ11のシャドウVMCS130(#0〜#n−1)内のゲスト状態エリア131を書き換えることにより、仮想サーバ102a上で仮想化機能を稼動させるものである。
このため、ホストVMM103は、仮想化機能を統合した新世代OSである孫OS111aを監視して、物理CPU104の動作モードを、ホストVMM103が動作する期間ではVMXルートモードに、ゲストVMM109またはユーザプログラム110aが動作する期間ではVMXノンルートモードとなるよう制御する。ホストVMM103は、所定の条件(VM−exit)でVMXルートモードになるとホストVMM103がゲストVMM109や孫OSの命令をエミュレートする。これにより、孫OS111aに対して、仮想CPU108aが仮想化支援機能を提供するように見せかける。
また、物理CPU104の、VMXルートモードからVMXノンルートモードへの遷移をVM−entryといい、逆に、VMXノンルートモードからVMXルートモードへの遷移は、VM−exitという。このVM−exitは、孫OS111a〜111bが特権命令(例えば、ページフォルトなど)を発行したときなどの所定の要因で物理CPU104がホストVMM103へVM−exitを通知する。ホストVMM103は、上記VM−exitまたはVM−entryをイベントとして検出して所定の処理を行う。
ここで、VMXモードのVMXルートモードとVMXノンルートモードの遷移については、上記非特許文献1に記載されるとおりである。ここでは、概要のみについて説明する。通常動作モードからVMXモードへ移行する際には、ホストVMM103がVMXON命令を発行し、物理CPU104の動作モードをVMXモードに移行させる。そして、VMXモードへ移行したホストVMM103は、該当する仮想CPU108a〜108bのシャドウVMCS130(#0〜#n−1)にユーザプログラム110aを実行させるための情報を書き込んでからVM−entry命令(VMLAUNCH命令またはVMRESUME命令)を発行し、VMXルートモードからVMXノンルートモードへ移行する。
一方、VM−exitは孫OS111a〜111bが特権命令を発行したときなどの所定の要因で発生するイベントであり、本イベントを契機に物理CPU104がホストVMM103へVM−exitを通知し、同時に動作モードをVMXノンルートモードからVMXルートモードに切り替える。
ホストVMM103のCPU制御部12がVM−exitを検知すると、所定のエミュレーションを行ってゲストVMM109または孫OSの処理を完了した後、シャドウVMCS130を必要に応じて書き換えてから再びVM−entry命令(第1制御命令)を発行してVMXルートモードからVMXノンルートモードへ切り替える。
上記のように、仮想サーバ102aで実行されるユーザプログラム110aがゲストVMM109と孫OS111aの間で切り替わる際に、ゲストVMCS22の内容を、物理CPU104のポインタ115で指示されるシャドウVMCS130に同期させる。ゲストVMM109は仮想的なゲストVMCS22にアクセスすることで、シャドウVMCS130にアクセスすることなくユーザプログラム110a中のステータスやイベントの内容を取得し、更新することができる。
VT−x機能を備えた物理CPU104は、シャドウVMCS130に対する読み書きを行う命令として、シャドウVMCS130を読み込むVMREAD命令と、シャドウVMCS130に書き込みを行うVMWRITE命令を提供している。ただし、これらのシャドウVMCS130に対する読み込み(VMREAD命令)と、書き込み(VMWRITE命令)は、VMXルートモードでのみ使用することができる。
ここで、ゲストVMM109からゲストVMCS22にアクセスする場合、物理的なVMREAD命令またはVMWRITE命令でゲストVMCS22のアクセスを要求するのに代わって、ゲストVMM109内部の命令コード230に予め設定されたVMREADエミュレータ231またはVMWRITEエミュレータ232を起動する。以下の説明では、ゲストVMM109がVMREAD命令またはVMWRITE命令に代わってVMREADエミュレータ231またはVMWRITEエミュレータ232を起動することを、仮想VMREAD命令または仮想VMWRITE命令を発行する、という。本命令の実装は、ユーザ権限で動作する分岐命令や関数コール命令、SYSCALL/SYSENTER、ソフトウェア割込み(INT3、INTO、INTx)などが考えられるが、その他物理的なVM−exitを発生させない命令であれば代替可能である。
ゲストVMM109はゲストVMCS22を読み出す際に仮想VMREAD命令を発行し、ゲストVMCS22に情報を書き込む際に仮想VMWRITE命令を発行する。
ゲストVMM109が仮にVMXノンルートモードでVMREAD命令またはVMWRITE命令を発行した場合、上記従来例では、物理CPU104でVM−exitが発生して、一旦、VMXルートモードに移行してからゲストVMM109がゲストVMCS22を読み込むことになる。そして、ゲストVMM109からVMREAD命令が複数発行されると、VMREAD命令の度にVM−exitが発生してしまい、VMXルートモードへの切り換えが頻発することになり、物理CPU104の負荷が増大する恐れがある。この結果、仮想計算機システムの性能の低下が懸念される。
シャドウVMCS130には、多数の情報が格納されているが、ゲストVMM109からVMREAD命令またはVMWRITE命令でアクセスされる情報は限られており、かつ、アクセスされる情報はVM−exitの要因情報(Basic Reason)から予測可能である。例えば、孫OS111aでページフォルトなどの特権例外が発生した場合、VMREAD命令で参照される情報は、Basic Reasonに加えてIDT Interruption Information、IDT Vectoring information程度に限られる。
一方、VMWRITE命令でアクセスされる情報については、書き込みのタイミングと参照のタイミングが異なる。例えば、ゲストVMM109がVMWRITE命令でゲストVMCS22へ書き込むと、次のVM−entryで孫OS111aに遷移するときにゲストVMCS22が参照されることになる。
そこで、本発明では、ゲストVMM109に物理VMREAD命令または物理VMWRITE命令に代わって仮想VMREAD命令または仮想VMWRITE命令を発行させ、ゲストVMM109の命令コード230に用意されたVMREADエミュレータ231またはVMWRITEエミュレータ232を起動し、VM−exitを発生することなくゲストVMCS22のアクセスを実現する。
そして、VMREADエミュレータ231は、ゲストVMCS22の値がシャドウVMCS130の値で更新されていなかったときのみ、実際にVM−exitを発生してシャドウVMCS130の値をゲストVMCS22に反映させて、仮想VMREAD命令が要求するデータを所定のデスティネーションに反映させる。所定のデスティネーションとしては、汎用レジスタもしくはメモリが指定される。
上記VM−exitが発生した際には、ホストVMM103は、VM−exitの要因情報からアクセスする情報を予測して複数の情報を先読みしてゲストVMCS22に反映させておき、次回の仮想VMREAD命令のときには、VM−exitの発生を抑制する。
VM−exitの発生後に、VMXノンルートモードで動作するゲストVMM109が仮想VMREAD命令で要求するデータは、ユーザプログラム110aの動作状態を示すデータである。本情報は、VM−exitを契機にシャドウVMCS#1に格納されているため、ホストVMM103はシャドウVMCS#1を対象に先読みを行う。
ここで、図5は、物理CPU104が利用するシャドウVMCS#0、#1とVT−x機能の動作モードの関係を示すマップである。ホストVMM保持データ11のシャドウVMCS130には、仮想サーバ102aが利用する領域として、VMX(仮想機能)ルートモードのときに物理CPU104が利用するシャドウVMCS#0と、VMX(仮想機能)ノンルートモードのときに物理CPU104が利用するシャドウVMCS#1が予め設定されている。
ホストVMM103は、物理CPU104のポインタ115の値を切り替えることで、シャドウVMCS#0と#1を切り替える。シャドウVMCSは#0、#1いずれもホストVMM103からのみアクセスできる。一方、VMXノンルートモードで動作するゲストVMMはゲストVMCS22のみがアクセス可能である。
<VMMの構成>
図2において、ホストVMM103は、上述のホストVMM保持データ11の他に、仮想サーバ102a〜102bを監視して、物理CPU104の動作モードをVMXルートモードとVMXノンルートモードの何れかに切り替えるCPU(プロセッサ)制御部12を備える。
さらに、ホストVMM103は、CPU制御部12が仮想サーバ102a〜102bの状態を取得し、各仮想サーバ102a〜102bへ指令を送信するためのインターフェースである制御・通信インターフェース17a、17bと、CPU制御部12が物理CPU104へ命令を発行するための命令発行インターフェース18と、物理CPU104がメモリ105に格納された物理CPU制御データ13を参照または更新するための参照・更新インターフェース19a、19bと、I/O装置106からの割り込み要求などを受け付けて、この要求に応答するためのI/O要求・応答インターフェース16を備える。
図3は、ホストVMM103とゲストVMM109の機能を示すブロック図である。ホストVMM103は、物理CPU104の仮想化支援機能(VT−x機能)を利用するため、メモリ105の所定の領域にホストVMM保持データ11を設定する。
ホストVMM保持データ11は、孫OS111a〜111bの仮想化支援機能の利用の有無や、仮想CPU108a〜108nの状態を示すフラグ類を格納する領域と、仮想CPU108a〜108b毎のステータス等を格納するシャドウVMCS130(#0〜#n−1)を保持する物理CPU制御データ13の領域を含んで構成される。
ホストVMM保持データ11の孫OSや仮想CPUの状態を示すフラグとしては、例えば、孫OS111a〜111b毎に物理CPU104の仮想化支援機能を利用可能か否かを識別する仮想化機能有効フラグ141と、仮想CPU108a〜108b毎に仮想化支援機能を利用中か否かを設定するVMXONフラグ142と、仮想CPU108a〜108bの仮想化支援機能がVMXルートモードまたはVMXノンルートモードの何れで動作しているのかを示す動作モードフラグ143が挙げられる。
仮想化機能有効フラグ141は、孫OS111a〜111b毎に設定されて「1」であれば該当する孫OSが仮想化支援機能を利用可能であることを示し、「0」であれば孫OSが仮想化支援機能を利用しない(または利用できない)ことを示す。この仮想化機能有効フラグ141は、孫OS111a〜111b毎に管理コンソール107から設定したり、あるいは、予め設定したファイルなどから設定する。
VMXONフラグ142は、各仮想CPU108a〜108b毎にVMXモードの動作状態を示すフラグで、「1」のときには該当する仮想CPU108a〜108bの動作モードがVMXモードであることを示し、「0」のときには該当する仮想CPU108a〜108bの動作モードが仮想化支援機能を利用しない通常動作モードであることを示す。VMXONフラグ142は、孫OS111a〜111bがVMXON命令を発行したときにホストVMM103が「1」をセットし、孫OS111a〜111bがVMXOFF命令を発行したときにホストVMM103が「0」にリセットする。
動作モードフラグ143は、仮想CPU108a〜108b上で動作するプログラムの動作モードを追跡するフラグである。この動作モードフラグ143は、孫OS111a〜111bへのVM−entry時にホストVMM103が「1」にセットし、孫OSのVM−exit時にホストVMM103が「0」にリセットする。つまり、この動作モードフラグ143は、VMXONフラグ142が「1」のときに各仮想CPU108a〜108b毎のVMXモードの種別を示すもので、動作モードフラグ143が「0」のときには仮想CPU108a〜108bがゲストVMM109を実行する状態(仮想CPUのVMXルートモード)を示し、動作モードフラグ143が「1」のときには仮想CPUがユーザプログラム110a(孫OS111aまたはアプリケーション112a)を実行する状態(仮想CPUのVMXノンルートモード)を示す。
本発明では、新世代OSである孫OS111aのVM−entryの際に、ホストVMM103がゲストVMCS22のゲスト状態エリア221とホスト状態エリア222を読み込んで、孫OS111aの動作に応じた一方のエリアの内容をシャドウVMCS#0のゲスト状態エリア131へ設定することで、仮想サーバ102aで孫OS111aの仮想化機能を実現するのである。
VT−x機能では以上のような、VM−entryとVM−exitの遷移により、ホストVMM103とゲストVMM109またはユーザプログラム110aを切り替える。このため、VM−entryとVM−exitの前後の物理CPU104のステータス等を保持するために、物理CPU制御データ13のデータ構造であるシャドウVMCS#0〜#n−1を使用する。
物理CPU制御データ13は、仮想CPU108a〜108b毎にシャドウVMCS#0〜#n−1が設定され、上述したように、ホストVMM103は、ひとつのゲストVMM109に対して2つのシャドウVMCS#0と#1を割り当てる。そして、ホストVMM103は、図5で示すように、ひとつのシャドウVMCS#0を仮想VMXルートモードで使用し、他方のシャドウVMCS#1を仮想VMXノンルートモードで使用する。すなわち、仮想VMXルートモードのときには、ホストVMM103がポインタ115にシャドウVMCS#0のアドレスを設定し、図5で示すように、ゲストVMM109の動作時にはシャドウVMCS#0の設定が物理CPUに反映される。一方、仮想VMXノンルートモードのときには、ホストVMM103がポインタ115にシャドウVMCS#1のアドレスを設定し、孫OS111a(またはアプリケーション112a)の動作時にはシャドウVMCS#1の設定が用いられる。
各シャドウVMCS130には、ゲスト状態エリア131と、ホスト状態エリア132と、VM実行制御領域133と、VM−exit制御領域134と、VM−entry制御領域135と、VM−exit情報領域136を備える。
ゲスト状態エリア131には、図4で示すように、仮想CPU108a〜108bのレジスタ状態や非レジスタ状態などのステータスが格納される。すなわち、後述するように、ゲストVMM109のステータスまたはユーザプログラム110aのステータスが選択的に格納される。
ホスト状態エリア132には、図4で示すように、ホストVMM103の物理CPU104のレジスタ状態などのステータスが格納される。VM実行制御領域133には、仮想サーバ102a〜102bの設定情報が格納され、例えば、例外ビットマップやI/Oビットマップなどの情報が含まれる。VM−exit制御領域134には、VM−exitの発生要因(Exit Reason)やIDT−Vectoring infomationなどの情報が格納される。VM−entry制御領域135には、VM−entryの動作を制御するための情報が格納される。そして、VM−exit情報領域136には、VM−exitを発生した要因(命令またはイベント)を格納する。VM−exitを発生させる要因としては、例えば、図7に示す「description」に示すものがVM−exit情報領域136に設定される。なお、図7は、図6に示すVM−exit情報領域136のBasic VM-exit Informationに含まれる要因情報(Exit Reason)1360の詳細を示す。
以上のようなシャドウVMCS130(#0〜#n−1)により、ホストVMM103は各仮想サーバ102a〜102bの制御を行う。
次に、ホストVMM103のCPU制御部12の構成について説明する。図3において、CPU制御部12は、管理コンソール107からの入力などに基づいて各仮想サーバ102a〜102bへ物理サーバ101の計算機資源を割り当てるリソース管理部(図示省略)に加えて、孫OS111aの仮想化機能(ゲストVMM109)を稼動させるため、仮想CPU108aのステータスのアクセス先を選択する状態エリア選択部121と、エミュレータ122と、シャドウVMCS参照・更新部123と、VM−exitハンドラ124と、VM−entry命令発行部125と、ユーザインターフェースとを備える。なお、リソース管理部については、上述のように公知または周知の技術を適用すればよいので、本実施形態では詳述しない。
VM−exitハンドラ124は、物理CPU104からVM−exitを受信して、エミュレータ122を起動する。
エミュレータ122は、VM−exitハンドラ124から受信したVM−exitの発生要因となった命令またはイベントを特定し、後述するように特定した発生要因に対応するモジュールを起動してゲストVMM109やユーザプログラム110aに代わって処理を実行する。
エミュレータ122が、仮想CPU108aの動作モードの変更(VMXルートとVMXノンルートの切り替え)を検出した場合は、特定した要因に応じたモジュール(VM−entry命令実行モジュール1221、VMCLEAR命令実行モジュール1223、CPUID命令実行モジュール1224、VM−exit命令実行モジュール1222)を起動して、状態エリア選択部121を起動する。
一方、エミュレータ122が、VM−exitハンドラ124から受信したVM−exitの発生要因が、ゲストVMCS22を読み込むVMREAD命令またはゲストVMCS22に情報を書き込むVMWRITE命令の場合は、シャドウVMCS#1の内容を一括して読み書きを行うVMREAD/VMWRITE命令実行モジュール1225を起動する。なお、VMREAD/VMWRITE命令実行モジュール1225の詳細については後述するように、ゲストVMM109のVMREADエミュレータ231から呼び出すことができる。
シャドウVMCS参照・更新部123は、状態エリア選択部121が選択したアクセス先に対応するシャドウVMCS#130にアクセスを行い、アクセス結果をエミュレータ122へ通知する。
シャドウVMCS参照・更新部123は、エミュレータ122のVMREAD/VMWRITE命令実行モジュール1225で利用する先行読み出しエントリ情報1231と、仮想VM−exit契機情報1232を含む。
仮想VM−exit契機情報1232は、後述するようにVM−exit命令実行モジュール1222がシャドウVMCS130から取得したVM−exitの発生要因を記憶する。
図9、図10は、先行読み出しエントリ情報1231の一例を示すマップである。先行読み出しエントリ情報1231は、図9、図10で示すように、VMREAD/VMWRITE命令実行モジュール1225が、シャドウVMCS130から一括して読み込む要素を予め定義したビットマップで構成され、メモリ105に保持される。
先行読み出しエントリ情報1231は、図3に示したゲスト状態エリア221〜VM−exit情報領域226に対応するエリア名12311と、エリア名12311を構成するフィールド名12312と、VM−exitの発生要因(Exit Reason)毎のエントリ12313から構成され、各エントリには0または1が設定される。なお、図9、図10では、シャドウVMCS130のフィールドの一部を省略したが、VT−xで規定されるフィールドを適宜設定することができる。
先行読み出しエントリ情報1231は、発生要因(Exit Reason)毎のエントリ12313の値に「1」が設定されたフィールド名12312またはエリア名12311を、VMREAD/VMWRITE命令実行モジュール1225でまとめて読み出すことを示している。一方、エントリ12313の値が「0」の場合には、該当するフィールド名12312の値を読み出す必要がないことを示している。
例えば、VM−exitの発生要因が「CPUID」のエントリ12313では、ゲスト状態エリア131の「RFLAGS」、「RIP」のフィールドと、VM−exit情報領域136の「Exit Reason」、「VM−exit instruction length」のフィールドに対応するエントリ12313の値に「1」が設定されており、VMREAD/VMWRITE命令実行モジュール1225が一括して読み込むべきフィールドであることを示している。
また、先行読み出しエントリ情報1231は、後述するホストVMM103のVMREAD/VMWRITE命令実モジュール1225が読み出したフィールドを学習し、VM−exitの発生要因に対して読み込むべきフィールド名12312を追加することができる。
本例では、先読み対象エントリをExit Reason毎に定義することとしたが、更に詳細な条件を設定する実施例があっても構わない。例えば、Exit Reasonに加えて、IDT−vectoring Informationをキーとした場合、例外および外部割込みのベクタ番号別に先読み対象を詳細に設定可能である。紙面の都合上詳細は割愛するが、いずれも同業者であれば容易に理解できる変形例であり本発明に含むものとする。
なお、先行読み出しエントリ情報1231は、上述のようにメモリ105に保持して書き換え可能とした例を示したが、先行読み出しエントリ情報1231を固定データとしてホストVMM103のプログラムに組み込んでも良いし、あるいは、物理サーバ101のROM(図示省略)にハードコードとして実装しても良い。
<ゲストVMMの構成>
一方、仮想サーバ102aのゲストVMM109が管理する仮想CPU制御データ114には、上記物理CPU制御データ13のシャドウVMCS#0と同様のデータ構造であるゲストVMCS22が格納される。
ゲストVMM109は、ユーザプログラム110a(孫OS111aまたはアプリケーション112a)を実行する仮想CPU108aのレジスタ状態などのステータス等を格納するゲスト状態エリア221と、ゲストVMM109を実行する仮想CPU108aのレジスタ状態などのステータスを格納するホスト状態エリア222と、仮想サーバ102aの設定情報を格納するVM実行制御領域223と、仮想サーバ102aにおけるVM−exitの要因などの情報を格納するVM−exit制御領域224と、仮想サーバ102aにおけるVM−entryの動作を制御するための情報を格納するVM−entry制御領域225と、仮想サーバ102aにおけるVM−exitの原因を特定する情報を格納するVM−exit情報領域226とを備える。
ゲスト状態エリア221には、上記図4と同様に、仮想CPU108aのレジスタ状態などのステータスが格納される。すなわち、後述するように、孫OS111aのステータスまたはアプリケーション112aのステータスが選択的に格納される。
仮想サーバ102aの状態を制御するホストVMM103のシャドウVMCS#0では、ゲスト状態エリア131にゲストVMM109のステータスまたはユーザプログラム110a(孫OS111aまたはアプリケーション112a)のステータスが格納され、ホスト状態エリア132にはホストVMM103のステータスが格納される。
一方、ゲストVMM109のゲストVMCS22では、ゲスト状態エリア221に孫OS111aのステータスまたはアプリケーション112aのステータスが格納され、ホスト状態エリア222にはゲストVMM109のステータスが格納される点でシャドウVMCS130と相違する。
ゲストVMM109は、さらに、ゲストVMCS22への読み書きを行う命令コード230として、VMREADエミュレータ231と、VMWRITEエミュレータ232を備える。
これらのVMREADエミュレータ231、VMWRITEエミュレータ232はVMXノンルートモードでゲストVMCS22の読み書きを代行し、VM−exitの発生を抑止する。
また、ゲストVMM109は、VMREADエミュレータ231またはVMWRITEエミュレータ232にゲストVMCS22がシャドウVMCS130からの更新状況を通知するための更新ビットマップ227を備える。
更新ビットマップ227は、ホストVMM103によって更新され、図11で示すようにゲストVMCS22の各エリアを構成するフィールド毎に更新状況が格納される。
図11は、更新ビットマップ227の一例を示すマップである。更新ビットマップ227は、図3に示したゲスト状態エリア221〜VM−exit情報領域226に対応するエリア名2271と、エリア名2271を構成するフィールド名2272と、当該エントリのフィールド名2272またはエリア名2271に対応するゲストVMCS22の値に、シャドウVMCS#0の値がホストVMM103によって更新されたか否かを示すアップデート状態(図中Updated)2273と、当該エントリのフィールド名2272またはエリア名2271に対応するゲストVMCS22の値がゲストVMM109によって更新されたか否かを示すダーティ状態(図中Dirty)2274からひとつのエントリが構成される。なお、図11では、シャドウVMCS130のフィールドの一部を省略したが、VT−xで規定されるフィールドを適宜設定することができる。
フィールド名2272またはエリア名2271に対応するゲストVMCS22の値がホストVMM103によって更新されていればアップデート状態2273には「1」がセットされ、更新されていなければ「0」が格納される。
フィールド名2272またはエリア名2271に対応するゲストVMCS22の値がゲストVMM109によって更新されていればダーティ状態2274には「1」がセットされ、更新されていなければ「0」が格納される。
エミュレータを提供する命令コード230のVMREADエミュレータ231は、更新ビットマップ227を参照して、ホストVMM103によって更新済の値をゲストVMCS22から読み込んで、ゲストVMM109に応答する。
また、VMREADエミュレータ231は、更新ビットマップ227を参照してゲストVMCS22の更新状況を確認する。ホストVMM103によって更新されていないゲストVMCS22の要素についてはホストVMM103にシャドウVMCS130の読み込みを依頼する。この場合は、VM−exitを発生してホストVMM103にシャドウVMCS130を読み込ませ、VMREADの対象となるフィールドに対応するゲストVMCS22の値、およびアップデート状態2273を更新する。以上により、VMREADエミュレータ231は、ゲストVMCS22の全ての要素についてシャドウVMCS130の値で更新済の値をゲストVMM109に応答する。
エミュレータを提供する命令コード230のVMWRITEエミュレータ232は、仮想VMWRITE命令が指示する値をゲストVMCS22に書き込む。そして、ゲストVMCS22に書き込んだエリア名2271及びフィールド名2272に対応するエントリのダーティ状態2274を1にセットし、ホストVMM103が参照したときにゲストVMM109が更新したことを明示する。
なお、ゲストVMM109からのVMREADエミュレータ231またはVMWRITEエミュレータ232を呼び出す方法としては、VMMコードのバイナリ変換(例えば、VMREAD命令やVMWRITE命令をMOVE命令に置き換えてシャドウVMCSを読み込む)、もしくは準仮想化によるVMMコードの静的改変によってVMREAD命令及びVMWRITE命令を変換しておき、物理CPU104でVM−exitの発生を抑止する。
<ホストVMMの動作の概要>
ここで、VM−exitの発生要因は、図6、図7に示すように、シャドウVMCS#0のVM−exit情報領域136の「Exit reason」に設定されたものである。図7に示すVM−exitの要因リストには、VM−entry命令の発行に起因する要因1361と、VMCLEAR命令(第4制御命令)の発行に起因する要因1362と、ゲストVMM109へのVM−exit通知の有無を設定した通知条件1363が予め設定される。なお、図7では、VMREAD命令、VMWRITE命令等を省略したが、VT−xで規定されるVM−exitの発生要因を適宜設定することができる。
例えば、仮想CPU108aの動作モードを切り替える際のVM−exitの要因として、VM−entry命令(VMLAUNCH命令またはVMRESUME命令)を検出した場合には、図7の要因1361に該当するので、ホストVMM103はVM−entry命令実行モジュールでエミュレーションを行い、ゲストVMM109またユーザプログラム110aに代わって処理を行う。
あるいは、VM−exitの要因が、図7の通知条件1363に該当するゲストVMMへの通知条件の場合には、VM−exit命令実行モジュール1222を起動して同様にエミュレーションを行う。
状態エリア選択部121は、ホストVMM保持データ11からVM−exitを発生した仮想CPU(この例では108a)の動作モードフラグ143を読み込んで、VMXルートモードとVMXノンルートモードの何れであるかを判定する。動作モードフラグ143が「0」のVMXルートモードであればゲストVMM109が動作していたので、状態エリア選択部121は、VM−exitを発生した仮想サーバ(この例では102a)のゲストVMCS22からホスト状態エリア222を読み込む。
一方、動作モードフラグ143が「1」のVMXノンルートモードであればユーザプログラム110aが動作していたので、状態エリア選択部121は、該当する仮想サーバ102aのゲストVMCS22からゲスト状態エリア221を読み込む。
ゲストVMCS22からの読み込みが完了すると、CPU制御部12ではシャドウVMCS参照・更新モジュール123を起動する。シャドウVMCS参照・更新モジュール123は、状態エリア選択部121が読み込んだゲストVMCS22の情報を、VM−exitの処理対象である仮想CPU108aに対応するシャドウVMCS#0のゲスト状態エリア131に書き込んでシャドウVMCSを更新する。
シャドウVMCS#0のゲスト状態エリア131の更新が完了すると、CPU制御部12は仮想CPU108aの動作モードをVMXルートモードからVMXノンルートモードへ切り替えるため、動作モードフラグ143を「1」に更新し、物理CPU104のポインタ115に操作対象の仮想CPU108aのシャドウVMCS#0のアドレスをセットする。
そして、CPU制御部12は、VM−entry命令発行モジュール125を起動して、物理CPU104に対してVM−entry命令(VMRESUME命令)を発行する。
物理CPU104はVM−entry命令を受け付けると、ポインタ115が指し示すシャドウVMCS#0のゲスト状態エリア131を読み込んで、状態エリア選択部121が選択した仮想サーバ102aのゲストVMM109またはユーザプログラム110aを実行する。
一方、上記ゲストVMM109のVMREADエミュレータ231がゲストVMCS22を参照したときに、仮想VMREAD命令で指定されたデータがシャドウVMCS130の値で更新されていなければ(更新ビットマップのアップデート状態2273が「0」)には、ゲストVMM109がVMXルートモードでVMREAD命令を発生要因とするVM−exitが発生する。
この場合には、ホストVMM103のVMREAD/VMWRITE命令実行モジュール1225でエミュレータ処理が行われ、シャドウVMCS#1からデータを読み込んで、ゲストVMCS22に反映する。そして、ゲストVMCS22に反映したデータについて先行読み出しが行われていなかったので、先行読み出しエントリ情報1231の該当フィールドに「1」をセットして、次回以降の仮想VMREAD命令でVM−exitが発生するのを抑止する。
また、ユーザプログラム110aからVMXノンルートモードでVM−exitが発生し、かつゲストVMMに対するVM−exit通知条件を満たしている場合には、ホストVMM103のVM−exit命令実行モジュール1223により先行読み出しが行われる。これにより、ゲストVMM109のゲストVMCS22がシャドウVMCS130の最新の値で更新される。
上記のような仮想VMREAD命令または仮想VMWRITE命令によるVM−exitの発生を抑制するための処理は、図16で示すようになる。図16は、シャドウVMCS#0,#1とゲストVMCS22に対するホストVMM103とゲストVMM109のアクセスの一例を示すタイムチャートである。
時刻T1では、ユーザプログラム110aの命令実行中に仮想CPU108aの動作モードを切り替える仮想的なVM−exitに相当する、物理的なVM−exitが発生した場合を示す。仮想的なVM−exitの例としては、ユーザプログラム110aによるゲストVMM109の明示的な呼び出し命令であるVMCALL命令の発行が挙げられる。
このVMXノンルートモードでのVM−exitによりホストVMM103へ制御が移る。ホストVMM103は、VM−exitの発生要因がゲストVMM109に対するVM−exitの通知条件に一致するので、図3のVM−exit命令実行モジュール1222を起動する。
VM−exit命令実行モジュール1222は、後述の図12で示すようにシャドウVMCS#1の一括読み出しを実行する。すなわち、VM−exit命令実行モジュール1222は、VM−exitの発生要因から先行読み出しエントリ情報1231を参照し、シャドウVMCS#1からエントリ12313の値が「1」のフィールドを一括して読み込む。ホストVMM103のVM−exit命令実行モジュール1222は、一括して読み込んだフィールドの値をゲストVMCS22に書き込んでから、更新ビットマップ227のアップデート状態2273を「1」にセットする。
この後、時刻T3では、ホストVMM103は、物理CPU104に対してVM−entryを発行してゲストVMM109に制御を移す。
時刻T4〜T5の間では、ゲストVMM109のVMREADエミュレータ231またはVMWRITEエミュレータ232が動作した例を示し、仮想VMREAD命令または仮想VMWRITE命令によって、ゲストVMCS22の読み込みまたは書き込みが行われる。すなわち、仮想VMREAD命令の場合には、時刻T2〜T3の先行読み出しによって、仮想VMREAD命令を代行するVMREADエミュレータ231は、VM−exitを発生することなくゲストVMCS22の読み込みを実施できる。
また、仮想VMWRITE命令を代行するVMWRITEエミュレータ232は、VM−exitを発生することなくゲストVMCS22に書き込みを行う。このとき、VMWRITEエミュレータ232は、更新したフィールドについて、更新ビットマップ227のダーティ状態2274を「1」にセットする。
次に、時刻T5でゲストVMM109の動作中にVM−entry命令が発行されてVM−exitが発生したとする。この場合、VMXルートモードであるので、ホストVMM103はVM−entry命令実行モジュール1221を起動する。
VM−entry命令実行モジュール1221は、時刻T6でゲストVMCS22のゲスト状態エリア221を読み込む。そして、VM−entry命令実行モジュール1221は、操作対象の仮想CPUに対応するシャドウVMCS#1をアクティブに設定し、上記読み込んだゲスト状態エリア221の情報で操作対象のシャドウVMCS#1のゲスト状態エリア131を更新する。このとき、VM−entry命令実行モジュール1221は、更新ビットマップ227のダーティ状態2274が「1」のフィールドのみを更新することで、シャドウVMCS#1のゲスト状態エリア131の更新を高速で実行することが可能となる。
この後、時刻T7でVM−entry命令実行モジュール1221は、VM−entry命令を発行して、制御をホストVMM103からユーザプログラム110aに移す。
以上のように、時刻T2でシャドウVMCS#1のデータを先行読み出しエントリ情報1231の定義によって一括して読み込んで、ゲストVMCS22を更新しておくことで、ゲストVMM109のVMREADエミュレータ231はVM−exitを発生させることなくゲストVMCS22の読み込みを実現できる。
また、ゲストVMM109のVMWRITEエミュレータ232はVM−exitを発生させることなくゲストVMCS22への書き込みを実現できる。そして、次回のユーザプログラム110aへの制御移行時に、ゲストVMCS22に書き込んだデータをシャドウVMCS#1に反映させることができるのである。
<ホストVMMの処理の詳細>
次に、ホストVMM103のCPU制御部12で行われる処理について、図8を参照しながら以下に説明する。図8は、ホストVMM103のCPU制御部12が仮想サーバ102a〜102bの稼動稼働中に物理CPU104からのVM−exitを受信したときに実行する処理の一例を示すフローチャートである。
まず、ステップS1では、ホストVMM103のCPU制御部12は、ホストVMM保持データ11の仮想化機能有効フラグ141を参照し、VM−exitを発生した孫OS111a〜111b(以下、孫OSとする)がVT−x機能を利用可能であるか否かを判定する。操作対象の孫OSがVT−x機能を利用可能である場合にはステップS2へ進む。一方、操作対象の孫OSがVT−x機能を利用しない(または利用できない)場合(NTサーバまたは2000サーバなど)には、ステップS15へ進んで、ホストVMM103は前記従来例に示した特許文献1または非特許文献1に記載されるような仮想マシン処理を行う。
ステップS2では、ホストVMM103がVMXONフラグ142を参照し、VM−exitの要因となった仮想CPU108a〜108b(以下、仮想CPUとする)がVMXモードであるか否かを判定する。VMXONフラグ142が「1」であれば仮想CPUはVMXモードであるのでステップS3へ進む。一方、VMXONフラグ142が「0」の場合には、仮想CPUが通常の動作モードであるので、上記と同様にステップS15へ進み、ホストVMM103は既存の仮想マシン処理を実行する。
ステップS3では、ホストVMM103のCPU制御部12が、操作対象の仮想CPUの動作モードフラグ143を参照し、仮想CPUの動作モードがVMXルートモードとVMXノンルートモードの何れであるかを判定する。動作モードフラグ143が「0」の場合には仮想CPUがVMXルートモードであると判定してステップS4へ進む。一方、動作モードフラグ143が「1」の場合には、仮想CPUがVMXノンルートモードであると判定してS11へ進む。
ステップS4では、CPU制御部12が物理CPU104から受信したVM−exitの発生要因を特定する。ステップS4では、仮想CPUの動作モードがVMXルートモードであるので、CPU制御部12は、ゲストVMM109の状態(ステータス)を格納したシャドウVMCS130(この例ではシャドウVMCS#0とする)を特定し、シャドウVMCS#0のゲスト状態エリア131を参照して、VM−exitの発生要因を特定する。CPU制御部12は、VM−exitの発生要因としてVM−entry命令(仮想VM−entry命令=第1のイベント)を検出した場合にはステップS5の処理へ進み、VM−exitの発生要因としてVMREAD命令を検出した場合にはステップS16の処理へ進み、その他の場合にはステップS11の処理へ進む。
VM−exitの発生要因がVM−entry命令の場合のステップS5では、CPU制御部12は、エミュレータ122からVM−entry命令実行モジュール1221を実行し、操作対象の仮想CPUをVMXノンルートモードへ切り替えるのに必要な所定の処理(状態エリア選択部121の起動など)をゲストVMM109に代わってエミュレートする。
次に、ステップS6ではホストVMM103のCPU制御部12は、仮想CPUの動作モードをVMXルートモードからVMXノンルートモードへ移行させるので、操作対象の仮想CPUの動作モードフラグ143を「1」に更新する。
ステップS7では、CPU制御部12が操作対象のゲストVMM109の仮想CPU制御データ114のゲストVMCS22からゲスト状態エリア221に格納されている孫OSまたはアプリケーションのステータスを読み込む。
次に、ステップS8において、CPU制御部12は、物理CPU104に対してVMPTLDR命令を発行して、操作対象の仮想CPUに対応するシャドウVMCS#0をアクティブに設定し、アクティブにしたシャドウVMCS#0のアドレスをポインタ115に設定する。このVMPTLDR命令(第2制御命令)により、ホストVMM103は、複数のシャドウVMCS#0〜#n−1の中から操作対象の仮想CPU(仮想サーバ)のシャドウVMCSを選択する。
ステップS9では、CPU制御部12が、上記ステップS7で読み込んだゲスト状態エリア221の情報と後述する更新ビットマップ227に基づいて、操作対象のシャドウVMCS#0のゲスト状態エリア131を更新する。このシャドウVMCS#0の更新処理については、図14のサブルーチンにて詳述する。
そして、S10でCPU制御部12は、物理CPU104に対してVM−entry命令を発行する。
VM−entry命令を受け付けた物理CPU104は、ポインタ115で指定されたシャドウVMCS#0のゲスト状態エリア131の内容に基づいて、操作対象の仮想サーバのゲストVMM109またはユーザプログラム110a(以下、ユーザプログラムとする)を実行する。
一方、上記S3で動作モードフラグ143が「1」と判定された場合は、操作対象の仮想CPUがユーザプログラムを実行中のVMXノンルートモードであるので、S11の処理を行う。
S11では、CPU制御部12が図7のVM−exitの要因リストを参照し、ゲストVMMへのVM−exit通知条件1363を検索する。ユーザプログラムを実行中のVM−exitの発生要因がVM−exit通知条件1363に一致していれば、ゲストVMM109にVM−exitの通知を行うためステップS12へ進む。一方、ユーザプログラムを実行中のVM−exitの発生要因がVM−exit通知条件1363に一致していなければ、ステップS15に進んで従来と同様の仮想マシン処理を行う。
ゲストVMM109にVM−exitの通知を行うステップS12では、CPU制御部12が図3のVM−exit命令実行モジュール1222を実行し、操作対象の仮想CPUをVMXルートモードへ切り替えるのに必要な所定の処理(状態エリア選択部121の起動など)をエミュレートする。
図12は、上記ステップS12でホストVMM103が実行するVM−exit命令実行モジュール1222のエミュレーション処理のサブルーチンを示すフローチャートである。このフローチャートは、VMXノンルートモードで、図3に示したVM−exit命令実行モジュール1222が行う処理を示す。
ステップS21では、ホストVMM103のVM−exit命令実行モジュール1222が、仮想CPU制御データ114の更新ビットマップ227のアップデート状態2273とダーティ状態2274の全エントリを0でクリアする。
ステップS22では、ホストVMM103がVM−exitの発生要因となったユーザプログラムに対応するシャドウVMCS#1から発生要因1360を取得する。なお、VMXノンルートモードのときに、図8のステップS12の処理が行われるので、ホストVMM103は、VMXノンルートモードで用いるシャドウVMCS#1を読み込む。
そして、ホストVMM103は、CPU制御部12のシャドウVMCS参照・更新部123の仮想VM−exit契機情報1232に、上記取得した発生要因1360を格納する。
次に、ステップS23ではホストVMM103が、シャドウVMCS参照・更新部123の先行読み出しエントリ情報1231を参照し、上記取得した発生要因1360に対応する列(対象エントリ12313)を取得する。
ステップS24ではホストVMM103が、ステップS23で取得した先行読み出しエントリ情報1231の列の先頭のエントリ(例えば、図9のゲスト状態エリアのCSに対応するエントリ12313)を参照する。
そして、ステップS25では、ホストVMM103が参照したエントリの値が「1」であるか否かを判定する。当該エントリの値が「1」であればステップS26に進む。
ステップS26では、ホストVMM103が先行読み出しエントリ情報1231のエリア名12311及びフィールド名12312で指定されるシャドウVMCS#1のフィールドの値を取得する。すなわち、図12の処理は、図8のステップS3、S11、S12で行われるので、VMXノンルートモードでのVM−exitであり、図5で示したように、シャドウVMCS#1を参照する。一方、当該エントリの値が「0」であればステップS30に進んで、ホストVMM103は次のエントリを参照して上記ステップS25の処理を繰り返す。
ステップS27では、ホストVMM103が上記S26で取得したフィールドの値を、先行読み出しエントリ情報1231のエリア名12311及びフィールド名12312で指定されるゲストVMCS22の該当フィールドに書き込んで更新する。
次に、ステップS28では、ホストVMM103は現在参照している先行読み出しエントリ情報1231に対応する更新ビットマップ227のアップデート状態2273を「1」にセットして、ゲストVMCS22の該当フィールドを更新したことを明示する。
そして、ステップS28では、ステップS23で取得した先行読み出しエントリ情報1231の列のエントリ12313のうち値が「1」に設定された全てのエントリについて、シャドウVMCS#1の値でゲストVMCS22の値を更新したか否かをホストVMM103が判定する。取得した列の全てのエントリについて処理が完了していれば図12のサブルーチンを終了して、図8の処理に戻る。一方、取得した列の全てのエントリについて処理が完了していなければステップS30に進んで、次のエントリを参照してから上記S25〜S28の処理を繰り返す。
上記図12の処理によって、VMXノンルートモードでVM−exitが発生した場合、かつ発生要因1360がゲストVMMへのVM−exit通知条件1361に合致する場合には、図12のVM−exit命令実行モジュール1222によって、VM−exitの発生要因に応じた先行読み出しエントリ情報1231の列(エントリ12313)を選択し、当該列の値が「1」のエントリの全てのフィールドについて、シャドウVMCS#1から一括して読み出して、ゲストVMCS22を更新することができる。
すなわち、VM−exitの発生要因からシャドウVMCS#0のどのフィールドを読み出す必要があるか否かを先行読み出しエントリ情報1231に定義しておくことで、VMXノンルートモードのときに1回のVM−exitの発生でシャドウVMCS#1の複数のフィールドの値を一括して読み込んでおき、ゲストVMCS22をシャドウVMCS#1の値で更新することができる。これにより、VM−exitの発生要因から、ゲストVMM109が仮想VMREAD命令で参照する確率の高いシャドウVMCS#1のフィールドの値をゲストVMCS22に書き込んでおくことでゲストVMCS22を参照する際のVM−exit多発を抑止できる。
上記図12のサブルーチンが完了すると、図8のステップS13の処理に進む。
次に、S13では、操作対象の仮想CPUの動作モードをVMXノンルートモードからVMXルートモードへ移行させるため、CPU制御部12が操作対象の仮想CPUの動作モードフラグ143を「1」から「0」にリセットする。そして、ステップS14では、CPU制御部12が操作対象のゲストVMM109の仮想CPU制御データ114からホスト状態エリア221に格納されているゲストVMM109のステータスを読み込む。
ステップS14の処理が完了すると、ステップS8b、S9b、S10の処理を順に実施する。S8bでは、VMPTRLD命令を発行してシャドウVMCS#1から#0に切り替える。S9bでは、上記S14で読み込んだホスト状態エリア222の情報で操作対象のシャドウVMCS130のゲスト状態エリア131を更新し、ゲストVMM109のステータスをセットする。なお、ゲストVMM109がホスト状態エリアを変更しないことが判明している場合、本処理をスキップする実装があっても構わない。
S10で物理CPU104に対してVM−entry命令を発行する。
この結果、VM−entry命令を受け付けた物理CPU104は、ポインタ115で指定されたシャドウVMCS130のゲスト状態エリア131の内容に基づいて、操作対象の仮想サーバのゲストVMM109を実行する。
上記処理により、孫OS111aが仮想化機能を統合した新世代OSである場合、ホストVMM103は、仮想CPU108aの動作モードと、発生したVM−exitの要因に応じてシャドウVMCS130のゲスト状態エリア131に書き込むステータスを、ゲストVMMまたはユーザプログラムの何れか一方から選択する。そして、ホストVMM103が物理CPU104(第1の仮想CPU)に対してVM−entry命令を発行することで、仮想サーバ上でゲストVMMと、このゲストVMMが提供する第2の仮想CPU上で稼動するユーザプログラムを切り替えて実行することが可能となり、ゲストVMMは仮想サーバ上に複数の仮想化環境(ユーザプログラム)を提供することができる。
次に、ゲストVMM902による仮想VMREAD命令または仮想VMWRITE命令によってVM−exitが多発するのを抑制するための処理について以下に説明する。
上記図8のステップS4では、VMXルートモードで、かつVM−exitの発生要因がVMREAD命令の場合には、ステップS16に進んで、VMREAD/VMWRITE命令実行モジュール1225のエミュレータ処理を実行する。なお、VMREAD/VMWRITE命令実行モジュール1225のエミュレータ処理ついては、図15のサブルーチンにて詳述する。
ステップS16でシャドウVMCS#1の読み出しが終了すると、上記ステップS10に進んで、ゲストVMM109のステータスをセットしてから物理CPU104に対してVM−entry命令を発行する。本VM−entry命令の発行後、物理CPU104は図13のS45からVMREADエミュレータの処理を再開する。
図14は、上記図8のステップS9で行われるシャドウVMCSの更新処理の一例を示すサブルーチンのフローチャートである。この処理は、図8のステップS5に続いて実行され、ステップS6でVMXノンルートモードに変更されるので、ホストVMMはシャドウVMCS#1を参照する。
仮想VMWRITE命令でゲストVMCS22に書き込まれたデータを、シャドウVMCS130のゲスト状態エリア131に書き込んで更新する処理が行われる。この処理は、CPU制御部12のVMREAD/VMWRITE命令実行モジュール1225が行う。
ステップS51では、ホストVMM103がゲストVMM109の更新ビットマップ227を参照する。ステップS52では、ホストVMM103が更新ビットマップ227の先頭エントリ(例えば、図11のCS)のダーティ状態2274を参照する。ステップS53では、参照したダーティ状態2274が「1」であるか否かを判定する。ホストVMM103は、参照したダーティ状態2274が「0」であれば、ゲストVMCS22の該当フィールドは更新されていないので、ステップS57で次のエントリを参照してからステップS53の処理を繰り返す。
一方、ホストVMM103は、参照したダーティ状態2274が「1」であれば、ゲストVMCS22の該当フィールドが更新されているので、ステップS54に進んで、ダーティ状態2274に対応するフィールドの値をゲストVMCS22から読み込む。
次に、ステップS55では、ホストVMM103が上記ステップS54で読み込んだフィールドの値を、シャドウVMCS130の該当フィールドに書き込んで更新する。
ステップS56では、ホストVMM103が更新ビットマップ227の全てのエントリについて処理が完了していればサブルーチンを終了して図8に復帰する。一方、更新ビットマップ227の全てのエントリについて処理が完了していなければ、ステップS57に進んで、上記ステップS53〜S56の処理を繰り返す。
上記の処理により、更新ビットマップ227のダーティ状態2274が「1」となっているゲストVMCS22のフィールドの値が、シャドウVMCS130に反映される。
次に、図15は上記図8のステップS16で行われるVMREAD命令処理の一例を示すフローチャートである。このフローチャートは、図3のVMREAD/VMWRITE命令実行モジュール1225で行われる処理を示す。この処理は、後述するゲストVMM109のVMREADエミュレータ231によってVM−exitが発生した場合に実行される処理で、VMXルートモードで発生したVM−exitの発生要因がVMREAD命令である。
ステップS61では、ホストVMM103のVMREAD/VMWRITE命令実行モジュール1225がシャドウVMCS#0のVM−exit情報領域136を参照し、ゲストVMM109のVMREADエミュレータ231が発行したVMREAD命令の命令アドレスを取得する。
ステップS62では、ホストVMM103が上記ステップS61で取得した命令アドレスのVMREAD命令をデコードして、オペランド情報を取得する。ここで、オペランド情報は、例えば、第1のオペランド情報がVMREAD命令の結果を返すレジスタ番号を示し、第2のオペランド情報がVMREAD命令で参照すべきシャドウVMCS#0のフィールド情報を示す。
ステップS63では、上記ステップS62で取得した第2のオペランド情報からVMREAD命令で読み込むシャドウVMCS#0のフィールドを特定する。
ステップS64では、ホストVMM103がVMPTRLD命令を物理CPU104に発行して、シャドウVMCS130をユーザプログラム用であるVMXノンルートモードのシャドウVMCS#1に切り替える。すなわち、ゲストVMM109のVMREADエミュレータ231は、ユーザプログラム110aがどのように動いていたか、というステータスを取得したいので、ホストVMM103は読み込む対象のシャドウVMCS130をVMXノンルートモードのシャドウVMCS#1に切り替える。
ステップS65では、ホストVMM103がVMREAD命令を発行し、上記ステップS63で特定したフィールドの情報を、上記切り替えたシャドウVMCS#1から読み込む。
次に、ステップS66では、ホストVMM103は、ステップS65で取得したシャドウVMCS#1のフィールドの値をゲストVMCS22に書き込んでフィールドの情報を更新する。
ステップS67では、ホストVMM103がVMPTRLD命令を物理CPU104に発行して、シャドウVMCS130をゲストVMM109用であるVMXルートモードで用いるシャドウVMCS#0に切り替えて、本来ホストVMM103が操作すべきシャドウVMCS130に戻す。
ステップS68では、ホストVMM103が上記ステップS63で特定したフィールドに対応する更新ビットマップ227のアップデート状態2273を「1」にセットし、シャドウVMCS#1の値をゲストVMCS22に反映したことを記録する。
ステップS69、S70では、ゲストVMM109のVMREADエミュレータ231からのVM−exitの発生要因は、上記ステップS63で特定したフィールドが先行読み出しエントリ情報1231で「1」になっていないため、と推定される。このため、次回のVMREAD命令でVM−exitが発生しないように、学習を行う。
まず、ステップS69では、仮想VMREAD命令による仮想VM−exitの発生要因を仮想VM−exit契機情報として特定する。そしてホストVMM103は、先行読み出しエントリ情報1231のうち、仮想VM−exit契機情報に対応するエントリ12313の列を特定する。
次に、ステップS70では、上記特定された列のうち、上記ステップS63で特定したフィールドに対応するエントリ12313を「1」にセットとして終了する。
上記の処理により、まず、ゲストVMM109のVMREADエミュレータ231が発行したVMREAD命令をVMREAD/VMWRITE命令実行モジュール1225で実行し、シャドウVMCS#1の値をゲストVMCS22に反映させる。次に、VMREAD/VMWRITE命令実行モジュール1225は、先行読み出しエントリ情報1231のうち、ゲストVMM109がVMREAD命令を発行する契機となった仮想VM−exit契機情報に対応するエントリ12313に「1」をセットすることで、今回ホストVMM103で実行したVMREAD命令の対象フィールドを、先行読み出しの対象に設定することで、次回以降のVM−exitの発生を抑止する。
<ゲストVMMの処理の詳細>
図13は、ゲストVMM109で行われるエミュレータ処理の一例を示すフローチャートである。図13は、図3に示したゲストVMM109の命令コード230のVMREADエミュレータ231及びVMWRITEエミュレータ232の処理の一例を示し、図13において、ステップS42〜S45がVMREADエミュレータ231を示し、ステップS46〜S48がVMWRITEエミュレータ232を示す。この処理では、ゲストVMM109がVMREAD命令またはVMWRITE命令の実行に代わってこれらのエミュレータを起動する。
ゲストVMM109は仮想VMREAD命令または仮想VMWRITE命令のいずれであるかを判定し、仮想VMREAD命令であればステップS42へ進んでVMREADエミュレータ231を起動し、仮想VMWRITE命令であればステップS46に進んでVMWRITEエミュレータ232を起動する。
VMREADエミュレータ231の処理では、ステップS42でゲストVMM109は、仮想CPU制御データ114の更新ビットマップ227を参照する。次に、ステップS43では、仮想VMREAD命令が指定する読み込み対象のフィールドについてアップデート状態2273が「1」であるか否かを判定する。
アップデート状態2273が「1」であれば、仮想VMREAD命令の対象フィールドは、先行読み出しによってシャドウVMCS130の最新の値でゲストVMM109が更新されているので、ステップS45に進む。
一方、アップデート状態2273が「0」であればゲストVMCS22の該当フィールドは、シャドウVMCS130の最新の値が反映されていないので、ステップS44に進む。
ステップS44では、ゲストVMM109が上記仮想VMREAD命令で指定されたフィールドをシャドウVMCS130から読み込むため、実際のVMREAD命令(物理VMREAD命令)を物理CPU104に対して発行する。
ゲストVMM109がVMREAD命令を実際に発行することで、物理CPU104はVM−exitを発生して、ホストVMM103に制御を移す。そして、上記図15の処理によって、仮想VMREAD命令で要求されたフィールドの値を、シャドウVMCS#1からゲストVMCS22に反映し、上述の学習制御を行ってからVM−entry命令でゲストVMM109に制御を移す。
ゲストVMM109は、次に、ステップS45でシャドウVMCS130の値で更新されたゲストVMCS22の対象フィールドの値を読み込んで、所定のデスティネーションに反映させる。所定のデスティネーションとしては、汎用レジスタもしくはメモリが指定される。
一方、仮想VMWRITE命令の発行時には、ステップS46で、ゲストVMM109は仮想CPU制御データ114の更新ビットマップ227を参照する。ステップS47でゲストVMM109が仮想VMWRITE命令で指定されたフィールドに対応するダーティ状態2274を「1」にセットする。
そして、ゲストVMM109は、仮想VMWRITE命令で指定されたゲストVMCS22のフィールドに、仮想VMWRITE命令で指定されたデータを書き込む。
以上の処理により、ゲストVMM109はVMREADエミュレータ231もしくはVMWRITEエミュレータ232を介して、VM−exitを発生することなくゲストVMCS22の読み込みまたは書き込みを行う。ただし、更新ビットマップ227が「0」の場合のみ、ゲストVMM109がVMREAD命令を発行し、これにより物理CPU104はVM−exitを発生してホストVMM103が上述のVMREAD/VMWRITE命令実行モジュール1225を起動してシャドウVMCS#1の値でゲストVMCS22を更新するのである。
<まとめ>
なお、上記S1の判定で孫OSが仮想化機能を利用しない場合、または上記S2の判定で、仮想CPUが物理CPU104のVT−x機能を利用しない場合は、S15において、前記従来例に示した特許文献1または非特許文献1の記載に準じた仮想マシン処理をホストVMM103で行えばよい。
S15の仮想マシン処理は、例えば、図2に示した仮想サーバ102bの孫OS111bは、既存のOSであり、この孫OS111bまたはアプリケーション112b(ユーザプログラム)が特権命令などの所定の命令を実行すると、上述したように物理CPU104はVM−exitの発生をホストVMM103に通知する。
ホストVMM103は、物理CPU104からのVM−exitの通知を受けると、ユーザプログラム(仮想CPU108b)のステータスをシャドウVMCS#n−1のゲスト状態エリア131に格納する。そして、ホストVMM103は、ポインタ115のアドレスをホストVMM103のステータスを格納したホスト状態エリアに設定して、所定の処理を実行する。
ホストVMM103は、特権命令など所定の処理が完了すると、ホストVMM103のステータスをホスト状態エリア132へ格納し、ポインタ115のアドレスにゲスト状態エリア131を設定してから、VM−entry命令(VMRESUME命令)を発行して、制御を仮想CPU108bに移動してユーザプログラムの実行を再開する。
このように、本発明によれば、仮想化機能を統合した新世代OSと、既存のOSをひとつの物理サーバ101へ統合することが可能となって、物理サーバの数を削減してサーバの運用管理コストを削減することが可能となる。
さらに、上述のように、ホストVMM103は新世代OSに対して仮想CPUがVT−x機能を提供するように見せかけることができ、仮想化ソフトウェアを統合したOSを確実に稼動稼働させることが可能となる。また、本発明のホストVMM103によれば、前記従来例のシミュレータのように、命令列の変換などのオーバーヘッドがなく、仮想計算機の性能を低下させることなく、仮想化機能を統合したOSを仮想サーバで実行することが可能となるのである。
そして、ゲストVMCS22を参照または更新する際には仮想VMREAD命令または仮想VMWRITE命令を発行し、VM−exitが頻繁に発生するのを抑制しながらアクセスを行うことが可能となって、仮想サーバの処理能力を向上させることができる。
そして、VM−exitが発生したときには、VMXノンルートモードのときに先行読み出しを行ってゲストVMCS22の内容をシャドウVMCS#1の内容で一括して更新し、さらに、今回のVM−exitの発生要因についても先行読み出しを実施するように先行読み出しエントリ情報1231で学習を行うことで、VM−exitの発生を低減できるのである。
また、本発明では、複数の仮想CPU108a〜108bに対応して、複数のシャドウVMCS130(#0〜#n−1)を設けたので、物理サーバ101で複数のゲストVMM109を実行する場合でも、シャドウVMCS130(#0〜#n−1)を切り替えるだけで迅速に処理を切り替えることが可能となる。これにより、物理サーバ101に複数の新世代OSを統合した場合でも、仮想サーバの性能を維持することが可能となる。
以上のように、本発明によれば、ホストVMM103が孫OSやアプリケーションの状態と仮想CPUの状態を監視してシャドウVMCS130のゲスト状態エリア131を書き換えることで、仮想サーバの性能を低下させることなく、仮想化ソフトウェアを統合したOSを確実に稼動させることが可能となる。そして、ひとつの物理サーバ101で仮想化機能を統合した新世代OSと、既存のOSを共存させることが可能となって、サーバ統合を効率よく行うことで、サーバの運用コストを削減することが可能となる。
また、仮想VMREAD命令または仮想VMWRITE命令を用いることで、物理CPU104がVM−exitを発生する頻度を抑制し、仮想サーバの処理能力を向上させることができる。
なお、上記各実施形態において、物理CPU104、104bとして記載したプロセッサは、マルチコアプロセッサの構成でも良く、また、ホモジニアスなプロセッサやヘテロジニアスのプロセッサを採用することができる。すなわち、物理CPU104、104a、104bとして複数の汎用プロセッサコア(CPU)と特定用途プロセッサコアを含むヘテロジニアス・マルチコア・プロセッサを用いる場合は、汎用プロセッサコアが仮想化支援機能を備えていれば本発明を適用することができる。
<補足>
1.物理プロセッサとメモリを備えた物理計算機上で複数の仮想プロセッサを提供する仮想計算機システムの制御方法であって、
前記仮想計算機システムは、
第1の仮想プロセッサを提供する第1の仮想化部と、前記第1の仮想プロセッサで実行されて第2の仮想プロセッサを提供する第2の仮想化部と、前記第2の仮想プロセッサで実行されるユーザプログラムと、を有し、
前記第2の仮想化部が、当該第2の仮想化部または前記ユーザプログラムを実行する際の第1の仮想プロセッサの状態を含む第1のプロセッサ制御情報を保持するステップと、
前記第1の仮想化部が、前記第2の仮想化部を実行する際の物理プロセッサの状態を含む第2のプロセッサ制御情報と、前記ユーザプログラムを実行する際の前記物理プロセッサの状態を含む第3のプロセッサ制御情報と、前記第3のプロセッサ制御情報から一括して先読みを行う情報を予め設定した先行読出しエントリ情報と、を保持するステップと、
前記第1の仮想化部が、前記第2の仮想プロセッサ上で前記ユーザプログラムから前記第2の仮想化部へ制御を移行させる第1のイベントを検出するステップと、
前記第1の仮想化部が、前記第1のイベントを検出したときに前記第3のプロセッサ制御情報のうち前記先行読出しエントリ情報に設定された情報を読み込むステップと、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち、前記先行読出しエントリ情報に基づいて読み込んだ情報を更新するステップと、
前記第1の仮想化部が、前記物理プロセッサに対して、前記第2のプロセッサ制御情報を設定して前記第2の仮想化部へ制御を移行させるステップと、
前記第2の仮想化部が、前記第1のプロセッサ制御情報を参照するステップと
を含むことを特徴とする仮想計算機システムの制御方法。
2.上記1.に記載の仮想計算機システムの制御方法において、
前記第2の仮想化部が、前記第1のプロセッサ制御情報へ書き込みを行うステップと、
前記第1の仮想化部が、前記第2の仮想化部から前記ユーザプログラムへ制御を移行させる第2のイベントを検出するステップと、
前記第1の仮想化部が、前記第2のイベントを検出したときに前記第1のプロセッサ制御情報のうち前記更新されたデータを読み込むステップと、
前記第1の仮想化部が、前記読み込んだデータを前記第3のプロセッサ制御情報に反映させるステップと、
を更に含むことを特徴とする仮想計算機システムの制御方法。
3.上記1.に記載の仮想計算機システムの制御方法において、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち、前記先行読出しエントリ情報に基づいて読み込んだ情報を更新するステップは、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち更新した情報について更新ビットマップを設定するステップを含み、
前記第2の仮想化部が、前記第1のプロセッサ制御情報を参照するステップは、
前記第1のプロセッサ制御情報のうち参照の対象を特定するステップと、
前記更新ビットマップを参照して前記特定された参照対象の情報が更新されたか否かを判定するステップと、
前記更新ビットマップで前記情報が更新されていると判定したときには、前記第1のプロセッサ制御情報を読み込むステップと、
前記更新ビットマップで前記情報が更新されていないと判定したときには、第1の制御命令を発行して、前記第1の仮想化部に前記第3のプロセッサ制御情報から前記特定された参照対象の情報を前記第1のプロセッサ制御情報に反映させるステップと、
をさらに含むことを特徴とする仮想計算機システムの制御方法。
4.
前記請求項3に記載の仮想計算機の制御方法において、
前記物理プロセッサは、インテル・アーキテクチャー32の命令セットに準拠するプロセッサであって、
前記第1のプロセッサ制御情報と第2のプロセッサ制御情報及び第3のプロセッサ制御情報が、前記インテル・アーキテクチャー32に規定されるVirtual Machine Control Structureであり、
前記第1の制御命令が、インテル・アーキテクチャー32の命令セットに規定されるVMREAD命令であり、
前記第1のイベントが、インテル・アーキテクチャー32の命令セットに規定されるVMRESUME命令またはVMLAUNCH命令に起因するVM−exit命令であることを特徴とする仮想計算機システムの制御方法。
5.
前記上記1.に記載の仮想計算機の制御方法において、
前記第1の仮想化部は、前記先行読出しエントリ情報を前記メモリに固定データとして保持することを特徴とする仮想計算機システムの制御方法。
6.
前記3.に記載の仮想計算機制御方法において、
前記第1の仮想化部は、前記先行読出しエントリ情報を前記メモリ上で書き換え可能なデータとして保持し、
前記第1の仮想化部に前記第3のプロセッサ制御情報から前記特定された参照対象の情報を前記第1のプロセッサ制御情報に反映させるステップは、
前記第1の仮想化部が、前記更新ビットマップで前記第1のプロセッサ制御情報のうち更新ビットマップで更新されていないと判定された情報を、前記第3のプロセッサ制御情報から読み込んで前記第1のプロセッサ制御情報に反映するステップと、
前記第1の仮想化部が、前記第3のプロセッサ制御情報から読み込んで前記第1のプロセッサ制御情報に反映した情報について、前記先行読出しエントリ情報に追加するステップと、
を含むことを特徴とする仮想計算機システムの制御方法。
7.物理プロセッサとメモリを備えた物理計算機で実行されて、複数の仮想プロセッサを提供する仮想化プログラムにおいて、
第1の仮想化部が第1の仮想プロセッサを生成する手順と、
第2の仮想化部が第2の仮想プロセッサを生成し、当該第2の仮想プロセッサでてユーザプログラムを実行させる手順と、
前記第2の仮想化部が、当該第2の仮想化部または前記ユーザプログラムを実行する際の第1の仮想プロセッサの状態を含む第1のプロセッサ制御情報を保持する手順と、
前記第1の仮想化部が、前記第2の仮想化部を実行する際の物理プロセッサの状態を含む第2のプロセッサ制御情報と、前記ユーザプログラムを実行する際の前記物理プロセッサの状態を含む第3のプロセッサ制御情報と、前記第3のプロセッサ制御情報から一括して先読みを行う情報を予め設定した先行読出しエントリ情報と、を保持する手順と、
前記第1の仮想化部が、前記第2の仮想プロセッサ上で前記ユーザプログラムから前記第2の仮想化部へ制御を移行させる第1のイベントを検出する手順と、
前記第1の仮想化部が、前記第1のイベントを検出したときに前記第3のプロセッサ制御情報のうち前記先行読出しエントリ情報に設定された情報を読み込む手順と、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち、前記先行読出しエントリ情報に基づいて読み込んだ情報を更新する手順と、
前記第1の仮想化部が、前記物理プロセッサに対して、前記第2のプロセッサ制御情報を設定して前記第2の仮想化部へ制御を移行させる手順と、
前記第2の仮想化部が、前記第1のプロセッサ制御情報を参照する手順と
を物理プロセッサに実行させることを特徴とする仮想化プログラム。
8.上記7.に記載の仮想化プログラムにおいて、
前記第2の仮想化部が、前記第1のプロセッサ制御情報へ書き込みを行う手順と、
前記第1の仮想化部が、前記第2の仮想化部から前記ユーザプログラムへ制御を移行させる第2のイベントを検出する手順と、
前記第1の仮想化部が、前記第2のイベントを検出したときに前記第1のプロセッサ制御情報のうち前記更新されたデータを読み込む手順と、
前記第1の仮想化部が、前記読み込んだデータを前記第3のプロセッサ制御情報に反映させる手順と、
を更に含むことを特徴とする仮想化プログラム。
9.上記7.に記載の仮想化プログラムにおいて、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち、前記先行読出しエントリ情報に基づいて読み込んだ情報を更新する手順は、
前記第1の仮想化部が、前記第1のプロセッサ制御情報のうち更新した情報について更新ビットマップを設定する手順を含み、
前記第2の仮想化部が、前記第1のプロセッサ制御情報を参照する手順は
前記第1のプロセッサ制御情報のうち参照の対象を特定する手順と、
前記更新ビットマップを参照して前記特定された参照対象の情報が更新されたか否かを判定する手順と、
前記更新ビットマップで前記情報が更新されていると判定したときには、前記第1のプロセッサ制御情報を読み込む手順と、
前記更新ビットマップで前記情報が更新されていないと判定したときには、第1の制御命令を発行して、前記第1の仮想化部に前記第3のプロセッサ制御情報から前記特定された参照対象の情報を前記第1のプロセッサ制御情報に反映させる手順と、
をさらに含むことを特徴とする仮想化プログラム。
10.上記9.に記載の仮想化プログラムにおいて、
前記物理プロセッサは、インテル・アーキテクチャー32の命令セットに準拠するプロセッサであって、
前記第1のプロセッサ制御情報と第2のプロセッサ制御情報及び第3のプロセッサ制御情報が、前記インテル・アーキテクチャー32に規定されるVirtual Machine Control Structureであり、
前記第1の制御命令が、インテル・アーキテクチャー32の命令セットに規定されるVMREAD命令であり、
前記第1のイベントが、インテル・アーキテクチャー32の命令セットに規定されるVMRESUME命令またはVMLAUNCH命令に起因するVM−exit命令であることを特徴とする仮想化プログラム。
11.上記7.に記載の仮想化プログラムにおいて、
前記第1の仮想化部は、前記先行読出しエントリ情報を前記メモリに固定データとして保持することを特徴とする仮想化プログラム。
12.上記9.に記載の仮想化プログラムにおいて、
前記第1の仮想化部は、前記先行読出しエントリ情報を前記メモリ上で書き換え可能なデータとして保持し、
前記第1の仮想化部に前記第3のプロセッサ制御情報から前記特定された参照対象の情報を前記第1のプロセッサ制御情報に反映させる手順は、
前記第1の仮想化部が、前記更新ビットマップで前記第1のプロセッサ制御情報のうち更新ビットマップで更新されていないと判定された情報を、前記第3のプロセッサ制御情報から読み込んで前記第1のプロセッサ制御情報に反映する手順と、
前記第1の仮想化部が、前記第3のプロセッサ制御情報から読み込んで前記第1のプロセッサ制御情報に反映した情報について、前記先行読出しエントリ情報に追加する手順と、
を含むことを特徴とする仮想化プログラム。
13.物理プロセッサとメモリを備えた物理計算機上で複数の仮想プロセッサを提供する仮想計算機システムにおいて、
前記物理プロセッサ上で動作して、第1の仮想プロセッサを提供する第1の仮想化部と、
前記第1の仮想プロセッサ上で動作して、ユーザプログラムを実行する第2の仮想プロセッサを提供する第2の仮想化部と、を備え、
前記第2の仮想化部は、
前記ユーザプログラムまたは第2の仮想化部を実行する際の第1の仮想プロセッサの状態を保持する第1のプロセッサ制御情報と、
前記第1のプロセッサ制御情報の参照を行う読み込み代行部と、
前記第1のプロセッサ制御情報への書込みを行う書込み代行部と、を有し、
前記第1の仮想化部は、
前記第2の仮想化部を実行する際の物理プロセッサの状態を保持する第2のプロセッサ制御情報と、
前記ユーザプログラムを実行する際の前記物理プロセッサの状態を保持する第3のプロセッサ制御情報と、
前記第3のプロセッサ制御情報から一括して先読みを行う情報を予め設定した先行読出しエントリ情報と、
前記第2の仮想プロセッサ上で前記ユーザプログラムから前記第2の仮想化部へ制御を移行させる第1のイベントを検出したときに前記第3のプロセッサ制御情報のうち前記先行読出しエントリ情報に設定された情報を読み込んで、前記第1のプロセッサ制御情報のうち、前記先行読出しエントリ情報に基づいて読み込んだ情報を更新する一括読み込み部と、
を有することを特徴とする仮想計算機システム。