(57)【要約】【課題】仮想マシンの状態に応じて、システムの状態を取得する。【解決手段】本技術のプログラムを情報処理装置が実行することにより、所定のフックポイントに達したことを通知する仮想ハードウエアと、仮想ハードウエアから通知されたフックポイントに対応するフック関数を実行するフック実行部とを含む仮想マシンが、情報処理装置上で実現される。本技術は、例えば、仮想マシンを用いたデバッガ等に適用できる。【選択図】図１
2013152652.tif 000002
【特許請求の範囲】
【請求項１】
所定のフックポイントに達したことを通知する仮想ハードウエアと、
前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部と
を含む仮想マシンをコンピュータに実行させるためのプログラム。
【請求項２】
前記フック実行部は、前記フック関数の記述に従って例外の発生を前記仮想マシン上で動作するカーネルに通知する
請求項１に記載のプログラム。
【請求項３】
前記カーネルは、前記フック実行部から通知される前記例外に応じて、前記仮想マシンおよび前記カーネルを含むシステムの状態を取得する
請求項２に記載のプログラム。
【請求項４】
前記フックポイントで実行される前記フック関数を記述したフックプログラムを解析し、前記フックポイントと前記フック関数の対応関係を求める解析部を
さらに含み、
前記フック実行部は、前記仮想ハードウエアから前記フックポイントに達したことが通知されたとき、前記解析部により前記フックポイントに対応付けられている前記フック関数を実行する
請求項１に記載のプログラム。
【請求項５】
前記仮想ハードウエアは、予め設定されている前記フックポイントを前記解析部に通知し、
前記解析部は、前記仮想ハードウエアから通知された前記フックポイントのうち、前記フックプログラムに出現する前記フックポイントを前記仮想ハードウエアに通知し、
前記仮想ハードウエアは、前記解析部から通知された前記フックポイントに達したとき、前記フックポイントに達したことを通知する
請求項４に記載のプログラム。
【請求項６】
前記フック実行部は、前記フック関数を実行することにより、タイマの起動または停止をすることが可能であり、前記タイマの計測時間が所定の時間以上になったときに例外の発生を前記仮想マシン上で動作するカーネルに通知する
請求項１に記載のプログラム。
【請求項７】
前記フックポイントは、compare-and-swap命令の実行時に不一致が起きたときを含む
請求項１に記載のプログラム。
【請求項８】
請求項１に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項９】
仮想マシンに含まれる仮想ハードウエアが、所定のフックポイントに達したことを通知し、
前記仮想マシンに含まれるフック実行部が、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行する
ステップを含む情報処理方法。
【請求項１０】
所定のフックポイントに達したことを通知する仮想ハードウエアと、
前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部と
を含む仮想マシンを実行する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、プログラム、記録媒体、情報処理装置、および、情報処理方法に関し、特に、仮想マシンを実行する場合に用いて好適なプログラム、記録媒体、情報処理装置、および、情報処理方法に関する。
【背景技術】
【０００２】
従来、プログラムのソースコードを改変せずに、プログラムの実行過程をトレースすることが可能な技術が提案されている（例えば、特許文献１参照）。そのようなトレース技術として、例えば、Solaris（登録商標）のDTraceや、Linux（登録商標）のSystemTap等が実用化されている。
【０００３】
このような従来のトレース技術では、カーネル等のプログラムの特定のポイント（例えば、関数の先頭など）にフックポイントを予め設定しておき、各フックポイントに達したときにシステムの状態（例えば、レジスタや変数の値、実行中のプロセス等）が取得される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−２３７６１０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来のトレース技術では、プログラム内にフックポイントが設定されるため、プログラムが実行されていないタイミングでシステムの状態を取得することができない。従って、例えば、ハードウエア割り込みが発生してから一定時間内に特定のレジスタの書込みがない場合に、そのレジスタの書込みを行うはずのプロセスの状態を取得することはできない。
【０００６】
そこで、本技術は、仮想マシンの状態に応じて、システムの状態を取得できるようにするものである。
【課題を解決するための手段】
【０００７】
本技術の一側面のプログラムまたは記録媒体に記録されているプログラムは、所定のフックポイントに達したことを通知する仮想ハードウエアと、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部とを含む仮想マシンをコンピュータに実行させる。
【０００８】
前記フック実行部には、前記フック関数の記述に従って例外の発生を仮想マシン上で動作するカーネルに通知させることができる。
【０００９】
前記カーネルには、前記フック実行部から通知される前記例外に応じて、前記仮想マシンおよび前記カーネルを含むシステムの状態を取得させることができる。
【００１０】
前記フックポイントで実行される前記フック関数を記述したフックプログラムを解析し、前記フックポイントと前記フック関数の対応関係を求める解析部をさらに設け、前記フック実行部には、前記仮想ハードウエアから前記フックポイントに達したことが通知されたとき、前記解析部により前記フックポイントに対応付けられている前記フック関数を実行させることができる。
【００１１】
前記仮想ハードウエアには、予め設定されている前記フックポイントを前記解析部に通知させ、前記解析部には、前記仮想ハードウエアから通知された前記フックポイントのうち、前記フックプログラムに出現する前記フックポイントを前記仮想ハードウエアに通知させ、前記仮想ハードウエアには、前記解析部から通知された前記フックポイントに達したとき、前記フックポイントに達したことを通知させることができる。
【００１２】
前記フック実行部には、前記フック関数を実行することにより、タイマの起動または停止することを可能にし、前記タイマの計測時間が所定の時間以上になったときに例外の発生を前記仮想マシン上で動作するカーネルに通知させることができる。
【００１３】
前記フックポイントは、compare-and-swap命令の実行時に不一致が起きたときを含むようにすることができる。
【００１４】
本技術の一側面の情報処理方法は、仮想マシンに含まれる仮想ハードウエアが、所定のフックポイントに達したことを通知し、前記仮想マシンに含まれるフック実行部が、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するステップを含む。
【００１５】
本技術の一側面の情報処理装置は、所定のフックポイントに達したことを通知する仮想ハードウエアと、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部とを含む仮想マシンを実行する。
【００１６】
本技術の一側面においては、仮想マシンに含まれる仮想ハードウエアにより、所定のフックポイントに達したことが通知され、前記仮想マシンに含まれるフック実行部により、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数が実行される。
【発明の効果】
【００１７】
本技術の一側面によれば、仮想マシンの状態に応じて、システムの状態を取得することができる。
【図面の簡単な説明】
【００１８】
【図１】本技術を適用した情報処理システムのハードウエアおよびソフトウエアの構成例を示すブロック図である。
【図２】仮想マシン起動処理を説明するためのフローチャートである。
【図３】仮想ＣＰＵ初期化処理の詳細を説明するためのフローチャートである。
【図４】仮想ＣＰＵのフックポイントリストの例を示す図である。
【図５】仮想メモリ初期化処理の詳細を説明するためのフローチャートである。
【図６】仮想メモリのフックポイントリストの例を示す図である。
【図７】仮想デバイス初期化処理の詳細を説明するためのフローチャートである。
【図８】仮想デバイスのフックポイントリストの例を示す図である。
【図９】フック登録処理を説明するためのフローチャートである。
【図１０】フックプログラムパース処理１の詳細を説明するためのフローチャートである。
【図１１】フックプログラムの例を示す図である。
【図１２】フックプログラムパース処理２の詳細を説明するためのフローチャートである。
【図１３】仮想ハードウエアの処理を説明するためのフローチャートである。
【図１４】仮想ＣＰＵの処理を説明するためのフローチャートである。
【図１５】フックパーサのフック通知対応処理を説明するためのフローチャートである。
【図１６】フック実行部の処理を説明するためのフローチャートである。
【図１７】フック関数Ａ実行処理を説明するためのフローチャートである。
【図１８】フック関数Ｂ実行処理を説明するためのフローチャートである。
【図１９】フック関数Ｃ実行処理を説明するためのフローチャートである。
【図２０】例外発行処理の詳細を説明するためのフローチャートである。
【図２１】カーネルの処理を説明するためのフローチャートである。
【図２２】例外処理の詳細を説明するためのフローチャートである。
【図２３】カーネルフック関数実行処理の例を説明するためのフローチャートである。
【図２４】カーネルフックプログラムの例を示す図である。
【図２５】コンピュータの構成例を示すブロック図である。
【発明を実施するための形態】
【００１９】
以下、本技術を実施するための形態（以下、実施の形態という）について説明する。なお、説明は以下の順序で行う。
１．実施の形態
２．変形例
【００２０】
＜１．実施の形態＞
［情報処理システム１０１の構成例］
図１は、本技術の一実施の形態である情報処理システム１０１のハードウエアおよびソフトウエアの構成例を示すブロック図である。
【００２１】
情報処理システム１０１は、コンピュータ１１１、入力部１１２、および、表示部１１３を含むように構成される。
【００２２】
コンピュータ１１１で実行されるソフトウエアは、仮想マシン１２１およびゲスト環境１２２を含むように構成される。
【００２３】
仮想マシン１２１は、ソフトウエアによりコンピュータをシミュレートしたものであり、コンピュータ１１１上で所定のプログラムを実行することにより実現される。仮想マシン１２１は、仮想ハードウエア１３１、モニタ１３２、フックパーサ１３３、および、フック実行部１３４を含むように構成される。
【００２４】
仮想ハードウエア１３１は、ソフトウエアによりシミュレートされるハードウエアの集合体であり、仮想ＣＰＵ１４１、仮想メモリ１４２、仮想デバイス１４３を含む。
【００２５】
仮想ＣＰＵ１４１は、ソフトウエアによりＣＰＵをシミュレートしたものである。
【００２６】
仮想メモリ１４２は、ソフトウエアによりメモリをシミュレートしたものである。
【００２７】
仮想デバイス１４３は、入出力装置、記憶装置、バス、CODEC（COmpression／DECompression）等の各種のハードウエアデバイスをソフトウエアによりシミュレートしたものである。
【００２８】
そして、仮想ＣＰＵ１４１、仮想メモリ１４２、および、仮想デバイス１４３は、それぞれフックポイントリストをフックパーサ１３３に登録する。
【００２９】
なお、詳細については後述するが、フックポイントリストは、仮想ＣＰＵ１４１、仮想メモリ１４２、および、仮想デバイス１４３に予め設定されているフックポイントをそれぞれ一覧にしたものである。また、フックポイントは、プログラムの実行過程をトレースするためのフック関数を実行可能なポイントであり、例えば、所定の処理を実行したとき、あるいは、所定の処理を実行する前に設定される。
【００３０】
また、仮想ＣＰＵ１４１、仮想メモリ１４２、および、仮想デバイス１４３は、それぞれ有効なフックポイントに達したときに、当該フックポイントに達したことをフックパーサ１３３に通知する。
【００３１】
なお、以下、仮想ＣＰＵ１４１、仮想メモリ１４２、および、仮想デバイス１４３を個々に区別する必要がない場合、仮想ハードウエア１３１と総称する。
【００３２】
モニタ１３２は、仮想マシン１２１全体の制御を行う。また、モニタ１３２は、入力部１１２を介して、ユーザにより入力されたフックプログラムをフックパーサ１３３に供給する。詳細については後述するが、フックプログラムには、各フックポイントで実行されるフック関数を含む情報が記述されている。さらに、モニタ１３２は、必要に応じて、仮想マシン１２１の状態等を表示部１１３に表示させる。
【００３３】
フックパーサ１３３は、フックプログラムを解析し、フックポイントとフック関数の対応関係を示す対応表を生成する。なお、以下、フック関数が対応付けられ、当該フック関数が実行されるフックポイントを有効なフックポイントと称し、フック関数が対応付けられていないフックポイントを無効なフックポイントと称する。
【００３４】
また、フックパーサ１３３は、有効なフックポイントを仮想ＣＰＵ１４１、仮想メモリ１４２、仮想デバイス１４３、および、フック実行部１３４に通知する。さらに、フックパーサ１３３は、対応表に登録したフック関数をフック実行部１３４に登録する。また、フックパーサ１３３は、仮想ＣＰＵ１４１、仮想メモリ１４２、または、仮想デバイス１４３から到達したフックポイントが通知されたとき、当該フックポイントに対応するフック関数の実行をフック実行部１３４に指令する。
【００３５】
フック実行部１３４は、例えば、インタプリタやJIT（Just In Time）コンパイラ等により構成され、フックパーサ１３３からの指令に従って、フック関数を実行する。また、フック実行部１３４は、フック関数の記述に従って例外の発生をゲスト環境１２２のカーネル１６１に通知する。
【００３６】
さらに、フック実行部１３４は、仮想マシン１２１内の時計またはホスト環境内の時計に同期したタイマ１５１を備えており、フック関数を実行することにより、タイマ１５１の起動または停止を行う。また、フック実行部１３４は、タイマ１５１の計測時間が所定の時間以上になりタイムアウトした場合、当該タイマ１５１のタイムアウトに対してフックポイントが設定されているとき、例外の発生をゲスト環境１２２のカーネル１６１に通知する。
【００３７】
なお、フック実行部１３４は、後述するように、仮想ＣＰＵ１４１のレジスタに例外情報を保存し、仮想ＣＰＵ１４１の状態を例外ありに変更することにより、例外の発生をカーネル１６１に通知する。
【００３８】
なお、図中、タイマ１５１の数を１つのみ図示しているが、タイマ１５１を複数設けることが可能である。
【００３９】
ゲスト環境１２２は、仮想マシン１２１上で動作するソフトウエアのシステムである。ゲスト環境１２２では、カーネル１６１およびアプリケーションプログラム１６２が実行される。
【００４０】
なお、図中、ゲスト環境１２２の数を１つのみ図示しているが、ゲスト環境１２２を複数設けることが可能である。
【００４１】
カーネル１６１は、仮想ハードウエア１３１とアプリケーションプログラム１６２の中間の層に位置するソフトウエア（関数の集合体）である。カーネル１６１は、一般的なオペレーティングシステムのカーネルと同様に、仮想ハードウエア１３１（あるいは、実際のハードウエア）の制御、資源の管理、割り込み処理、プロセス間通信等の機能を実行する。カーネル１６１は、デバイスドライバ１７１およびカーネルフック機構１７２を含むように構成される。
【００４２】
デバイスドライバ１７１は、仮想ハードウエア１３１（あるいは、実際のハードウエア）の制御を行う。
【００４３】
カーネルフック機構１７２は、例えば、上述したDtraceやSystemTap等の従来のカーネルフック機構により構成される。カーネルフック機構１７２は、カーネル１６１の処理が所定のフックポイントに達したときに、仮想マシン１２１およびゲスト環境１２２を含むシステムの状態を取得する。そして、カーネルフック機構１７２は、取得したシステムの状態を表示部１１３に表示させる。
【００４４】
アプリケーションプログラム１６２は、カーネル１６１上で動作し、カーネル１６１を利用して所定の機能を実現する。
【００４５】
なお、図中、アプリケーションプログラム１６２の数を１つのみ図示しているが、ゲスト環境１２２では、複数のアプリケーションプログラム１６２を実行させることが可能である。
【００４６】
入力部１１２は、例えば、キーボード、マウス等の各種の入力デバイスにより構成される。
【００４７】
表示部１１３は、例えば、ディスプレイ等の各種の表示デバイスにより構成される。
【００４８】
［情報処理システム１０１の処理］
次に、情報処理システム１０１の処理について説明する。
【００４９】
（仮想マシン初期化処理）
まず、図２のフローチャートを参照して、仮想マシン１２１の初期化処理について説明する。なお、この処理は、例えば、仮想マシン１２１の起動時に実行される。
【００５０】
ステップＳ１において、仮想ＣＰＵ１４１は、仮想ＣＰＵ初期化処理を実行する。ここで、図３のフローチャートを参照して、仮想ＣＰＵ初期化処理の詳細について説明する。
【００５１】
ステップＳ２１において、仮想ＣＰＵ１４１は、仮想ＣＰＵ１４１のフックポイントリストをフックパーサ１３３に登録する。
【００５２】
図４は、仮想ＣＰＵ１４１のフックポイントリストの例を示している。なお、この例では、フックポイントリストは、フックポイント名とその説明の２項目を含んでいるが、説明の項目は省略することが可能である。
【００５３】
memory_barrier_instructionは、仮想ＣＰＵ１４１によりメモリバリア命令が実行されたときに対応するフックポイントである。
【００５４】
miss_compare_and_swapは、仮想ＣＰＵ１４１によるcompare-and-swap操作で（compare-and-swap命令の実行時に）不一致が起きたときに対応するフックポイントである。
【００５５】
なお、仮想ＣＰＵ１４１のフックポイントの数や種類は、この例に限定されるものではなく、さらに多くの種類のフックポイントを設定することが可能である。例えば、仮想ＣＰＵ１４１から呼び出される命令に対応した関数内にフックポイントを設定することが可能である。
【００５６】
ステップＳ２２において、仮想ＣＰＵ１４１は、その他の初期化処理を実行する。
【００５７】
その後、仮想ＣＰＵ初期化処理は終了する。
【００５８】
図２に戻り、ステップＳ２において、仮想メモリ１４２は、仮想メモリ初期化処理を実行する。ここで、図５のフローチャートを参照して、仮想メモリ初期化処理の詳細について説明する。
【００５９】
ステップＳ４１において、仮想メモリ１４２は、仮想メモリ１４２のフックポイントリストをフックパーサ１３３に登録する。
【００６０】
図６は、図４と同様に、仮想メモリ１４２のフックポイントリストの例を示している。
【００６１】
read_memoryは、特定のメモリが読まれたときに対応するフックポイントである。
【００６２】
write_memoryは、特定のメモリに書き込まれたときに対応するフックポイントである。
【００６３】
なお、仮想メモリ１４２のフックポイントの数や種類は、この例に限定されるものではなく、さらに多くの種類のフックポイントを設定することが可能である。例えば、メモリから読み出された値が所定の条件を満たすとき（例えば、所定の値と一致するとき、所定の範囲内であるとき、特定のビットが所定の値と一致するとき等）をフックポイントに設定することが可能である。同様に、例えば、メモリに書き込む値が所定の条件を満たすときをフックポイントに設定することが可能である。また、例えば、所定の制御関数（例えば、フォーマット関数、ブロック消去関数等）にフックポイントを設定することが可能である。
【００６４】
ステップＳ４２において、仮想メモリ１４２は、その他の初期化処理を実行する。
【００６５】
その後、仮想メモリ初期化処理は終了する。
【００６６】
図２に戻り、ステップＳ３において、仮想デバイス１４３は、仮想デバイス初期化処理を実行する。ここで、図７のフローチャートを参照して、仮想デバイス初期化処理の詳細について説明する。
【００６７】
ステップＳ６１において、仮想デバイス１４３は、仮想デバイス１４３のフックポイントリストをフックパーサ１３３に登録する。
【００６８】
図８は、図４と同様に、仮想デバイス１４３のフックポイントリストの例を示している。
【００６９】
serial_interruptは、シリアル割り込みが発生したとき（例えば、外部から信号を受信したとき、データの読み出しや書き込みの指令があったとき等）に対応するフックポイントである。
【００７０】
buffer_emptyは、バッファが空になったときに対応するフックポイントである。
【００７１】
buffer_fullは、バッファが満杯になったときに対応するフックポイントである。
【００７２】
dma_startは、dma（direct memory access）を開始する直前に対応するフックポイントである。
【００７３】
dma_stopは、dma（direct memory access）を終了したときに対応するフックポイントである。
【００７４】
なお、仮想デバイス１４３のフックポイントの数や種類は、この例に限定されるものではなく、さらに多くの種類のフックポイントを設定することが可能である。例えば、上述した以外の仮想デバイス１４３がシミュレートしている各種のハードウエアの状態の変化に対応したフックポイントを設定することが可能である。
【００７５】
ステップＳ６２において、仮想デバイス１４３は、その他の初期化処理を実行する。
【００７６】
その後、仮想デバイス初期化処理は終了する。
【００７７】
図２に戻り、ステップＳ４において、仮想マシン１２１は、その他の起動処理を実行する。
【００７８】
その後、仮想マシン起動処理は終了する。
【００７９】
このようにして、各仮想ハードウエア１３１に設定されている全てのフックポイントが、フックパーサ１３３に通知される。
【００８０】
（フック登録処理）
次に、図９のフローチャートを参照して、フック登録処理について説明する。なお、この処理は、入力部１１２およびモニタ１３２を介して、フックパーサ１３３にフックプログラムが入力されたとき開始される。
【００８１】
ステップＳ１０１において、仮想マシン１２１は、フックプログラムパース処理１を実行する。ここで、図１０のフローチャートを参照して、フックプログラムパース処理１の詳細について説明する。
【００８２】
ステップＳ１２１において、フックパーサ１３３は、フックプログラムからフックポイントを検出する。
【００８３】
図１１は、フックプログラムの例を示している。このフックプログラムは、ブロック＃０乃至＃３の４つのブロックにより構成される。
【００８４】
ブロック＃０では、タイマ１５１（timer1）の利用が宣言されている。
【００８５】
ブロック＃１において、シリアル割り込みが発生することによりserial_interruptという名称のフックポイントにフックがかかったとき、タイマ１５１（timer1）が起動される。
【００８６】
なお、フックがかかるとは、フックポイントに達したこと、換言すれば、フックポイントに対応する条件が満たされたことをいう。
【００８７】
ブロック＃２において、データが読み出されることによりserial_dataという名称のフックポイントにフックがかかったとき、タイマ１５１（timer1）が停止される。
【００８８】
ブロック＃３において、タイマ１５１（timer1）が指定時間になり、タイムアウトしたときに、フック実行部１３４からカーネル１６１に例外VM_EXCEPTION_1の発生が通知される。
【００８９】
従って、図１１のフックプログラムの例では、serial_interrupt、serial_data、および、timer1のタイムアウトの３つのフックポイントが検出される。
【００９０】
ステップＳ１２２において、フックパーサ１３３は、ステップＳ１２１の処理の結果、新たなフックポイントが検出されたか否かを判定する。新たなフックポイントが検出されたと判定された場合、処理はステップＳ１２３に進む。
【００９１】
ステップＳ１２３において、フックパーサ１３３は、検出されたフックポイントをフックポイントリストから検索する。
【００９２】
ステップＳ１２４において、フックパーサ１３３は、ステップＳ１２３の処理の結果に基づいて、フックポイントリストに一致するフックポイントが存在するか否かを判定する。フックポイントリストに一致するフックポイントが存在すると判定された場合、処理はステップＳ１２５に進む。
【００９３】
ステップＳ１２５において、フックパーサ１３３は、対応する仮想ハードウエア１３１、すなわち、検出されたフックポイントが設定されている仮想ハードウエア１３１にフックポイントが有効になったことを通知する。なお、フックパーサ１３３は、タイマ１５１のタイムアウトに対応するフックポイントについては、フック実行部１３４に当該フックポイントが有効になったことを通知する。
【００９４】
その後、処理はステップＳ１２１に戻る。
【００９５】
一方、ステップＳ１２４において、フックポイントリストに一致するフックポイントが存在しないと判定された場合、処理はステップＳ１２６に進む。
【００９６】
ステップＳ１２６において、仮想マシン１２１は、エラー出力を行う。具体的には、フックパーサ１３３は、検出したフックポイントがフックポイントリストに登録されていないことをモニタ１３２に通知する。モニタ１３２は、例えば、当該フックポイントがフックポイントリストに登録されていないことを示すメッセージを表示部１１３に表示させる。
【００９７】
その後、処理はステップＳ１２１に戻る。
【００９８】
その後、ステップＳ１２２において、新たなフックポイントが検出されなかったと判定されるまで、ステップＳ１２１乃至Ｓ１２６の処理が繰り返し実行される。これにより、フックプログラムに出現するフックポイントが全て検出され、そのうち有効になったフックポイントが仮想ハードウエア１３１およびフック実行部１３４に通知される。
【００９９】
一方、ステップＳ１２２において、新たなフックポイントが検出されなかったと判定された場合、フックプログラムパース処理１は終了する。
【０１００】
図９に戻り、ステップＳ１０２において、仮想マシン１２１は、フックプログラムパース処理２を実行する。ここで、図１１のフローチャートを参照して、フックプログラムパース処理２の詳細について説明する。
【０１０１】
ステップＳ１４１において、フックパーサ１３３は、フックプログラムからフック関数を検出する。例えば、上述した図１１のフックプログラムからは、先頭から順に"start timer1 1000000000/9600"、"stop timer1"、および、"exception VM_EXCEPTION_1"の３つのフック関数が検出される。
【０１０２】
ステップＳ１４２において、フックパーサ１３３は、ステップＳ１４１の処理の結果、新たなフック関数が検出されたか否かを判定する。新たなフック関数が検出されたと判定された場合、処理はステップＳ１４３に進む。
【０１０３】
ステップＳ１４３において、フックパーサ１３３は、検出したフック関数を検査する。
【０１０４】
ステップＳ１４４において、フックパーサ１３３は、ステップＳ１４３の処理の結果に基づいて、フック関数の文法に誤りがないか否かを判定する。フック関数の文法に誤りがないと判定された場合、処理はステップＳ１４５に進む。
【０１０５】
ステップＳ１４５において、フックパーサ１３３は、検出したフック関数をフック実行部１３４に登録する。
【０１０６】
その後、処理はステップＳ１４１に戻る。
【０１０７】
一方、ステップＳ１４４において、フック関数の文法に誤りがあると判定された場合、処理はステップＳ１４６に進む。
【０１０８】
ステップＳ１４６において、仮想マシン１２１は、エラー出力を行う。具体的には、フックパーサ１３３は、検出したフック関数の文法に誤りがあることをモニタ１３２に通知する。モニタ１３２は、例えば、当該フック関数の文法に誤りがあることを示すメッセージを表示部１１３に表示させる。
【０１０９】
その後、処理はステップＳ１４１に戻る。
【０１１０】
その後、ステップＳ１４２において、新たなフック関数が検出されなかったと判定されるまで、ステップＳ１４１乃至Ｓ１４６の処理が繰り返し実行される。これにより、フックプログラムに出現するフック関数が全て検出される。そして、検出されたフック関数の文法に誤りがない場合、当該フック関数がフック実行部１３４に登録される。一方、検出されたフック関数の文法に誤りがある場合、エラー出力が行われる。
【０１１１】
一方、ステップＳ１４２において、新たなフック関数が検出されなかったと判定された場合、フックプログラムパース処理２は終了する。
【０１１２】
図９に戻り、ステップＳ１０３において、フックパーサ１３３は、フックプログラムから検出されたフックポイントと、そのフックポイントにフックがかかったときに実行するフック関数の対応関係を対応表に登録する。
【０１１３】
ステップＳ１０４において、フックパーサ１３３は、フックポイントまたはフック関数の少なくとも一方にエラーが発生した登録を対応表から削除する。これにより、フックポイントおよびフック関数の両方が有効な組み合わせのみ対応表に登録される。また、フックパーサ１３３は、登録表から削除したフックポイントに対応する仮想ハードウエア１３１またはフック実行部１３４に、当該フックポイントを無効にしたことを通知する。
【０１１４】
その後、フック登録処理は終了する。
【０１１５】
なお、フックプログラムが２つ以上ある場合、各フックプログラムについてフック登録処理が行われる。
【０１１６】
（仮想ハードウエア１３１の処理）
次に、図１３のフローチャートを参照して、仮想ハードウエア１３１の処理について説明する。なお、この処理は、例えば、カーネル１６１等から仮想ハードウエア１３１にアクセスされる度に実行される。
【０１１７】
ステップＳ２０１において、仮想ハードウエア１３１は、処理を開始する。
【０１１８】
ステップＳ２０２において、仮想ハードウエア１３１は、フックポイントに達したか否かを判定する。仮想ハードウエア１３１が、フックポイントリストに登録されているいずれかのフックポイントに達したと判定した場合、処理はステップＳ２０３に進む。
【０１１９】
ステップＳ２０３において、仮想ハードウエア１３１は、有効なフックポイントであるか否かを判定する。すなわち、仮想ハードウエア１３１は、到達したフックポイントが、図９のフック登録処理でフックパーサ１３３から有効になったことが通知されたフックポイントである場合、有効なフックポイントであると判定し、処理はステップＳ２０４に進む。
【０１２０】
ステップＳ２０４において、仮想ハードウエア１３１は、到達したフックポイントを示すフック通知をフックパーサ１３３に送る。
【０１２１】
その後、処理はステップＳ２０５に進む。
【０１２２】
一方、ステップＳ２０３において、有効なフックポイントでないと判定された場合、ステップＳ２０４の処理はスキップされ、フックパーサ１３３にフック通知は送られずに、処理はステップＳ２０５に進む。
【０１２３】
また、ステップＳ２０２において、フックポイントに達していないと判定された場合、ステップＳ２０３およびＳ２０４の処理はスキップされ、処理はステップＳ２０５に進む。
【０１２４】
ステップＳ２０５において、仮想ハードウエア１３１は、全ての処理を実行したか否かを判定する。まだ全ての処理を実行していないと判定された場合、処理はステップＳ２０２に戻り、ステップＳ２０５において、全ての処理を実行したと判定されるまで、ステップＳ２０２乃至Ｓ２０５の処理が繰り返し実行される。
【０１２５】
一方、ステップＳ２０５において、全ての処理を実行したと判定された場合、仮想ハードウエア１３１の処理は終了する。
【０１２６】
（仮想ＣＰＵ１４１の処理）
次に、図１４のフローチャートを参照して、仮想ハードウエア１３１の処理のより具体的な例として、仮想ＣＰＵ１４１の処理について説明する。
【０１２７】
ステップＳ２２１において、仮想ＣＰＵ１４１は、例外が発行されているか否かを判定する。例外が発行されていないと判定された場合、処理はステップＳ２２２に進む。
【０１２８】
ステップＳ２２２において、仮想ＣＰＵ１４１は、仮想プログラムカウンタ（不図示）から１命令を読み込む。
【０１２９】
ステップＳ２２３において、仮想ＣＰＵ１４１は、読み込んだ命令をデコードする。
【０１３０】
ステップＳ２２４において、仮想ＣＰＵ１４１は、デコードした命令が未実装命令であるか否かを判定する。未実装命令でないと判定された場合、処理はステップＳ２２５に進む。
【０１３１】
ステップＳ２２５において、仮想ＣＰＵ１４１は、命令に対応した関数を求める。
【０１３２】
ステップＳ２２６において、仮想ＣＰＵ１４１は、求めた関数にフックポイントが設定されているか否かを判定する。求めた関数にフックポイントが設定されていると判定された場合、処理はステップＳ２２７に進む。
【０１３３】
ステップＳ２２７において、仮想ＣＰＵ１４１は、図１３のステップＳ２０３の処理と同様に、有効なフックポイントであるか否かを判定する。有効なフックポイントであると判定された場合、処理はステップＳ２２８に進む。
【０１３４】
ステップＳ２２８において、仮想ＣＰＵ１４１は、図１３のステップＳ２０４の処理と同様に、フックパーサ１３３にフック通知を送る。
【０１３５】
その後、処理はステップＳ２２９に進む。
【０１３６】
一方、ステップＳ２２７において、有効なフックポイントでないと判定された場合、ステップＳ２２８の処理はスキップされ、フックパーサ１３３にフック通知が送られずに、処理はステップＳ２２９に進む。
【０１３７】
また、ステップＳ２２６において、求めた関数にフックポイントが設定されていないと判定された場合、ステップＳ２２７およびＳ２２８の処理はスキップされ、処理はステップＳ２２９に進む。
【０１３８】
ステップＳ２２９において、仮想ＣＰＵ１４１は、関数を実行する。
【０１３９】
ステップＳ２３０において、仮想ＣＰＵ１４１は、仮想プログラムカウンタを進める。
【０１４０】
その後、処理はステップＳ２２１に戻り、ステップＳ２２１以降の処理が実行される。
【０１４１】
一方、ステップＳ２２４において、未実装命令であると判定された場合、処理はステップＳ２３１に進む。
【０１４２】
ステップＳ２３１において、仮想ＣＰＵ１４１は、未実装命令例外を発行する。これにより、例えば、カーネル１６１が、仮想ＣＰＵ１４１の代わりに未実装命令を実行する。
【０１４３】
その後、処理はステップＳ２２１に戻り、ステップＳ２２１以降の処理が実行される。
【０１４４】
一方、ステップＳ２２１において、例外が発行されていると判定された場合、処理はステップＳ２３２に進む。
【０１４５】
ステップＳ２３２において、仮想ＣＰＵ１４１は、仮想レジスタ（不図示）を例外処理用のものに切り替える。
【０１４６】
ステップＳ２３３において、仮想ＣＰＵ１４１は、例外の種類に応じて、仮想プログラムカウンタの値を設定する。
【０１４７】
ステップＳ２３４において、仮想ＣＰＵ１４１は、フックポイントが設定されている例外であるか否かを判定する。フックポイントが設定されている例外であると判定された場合、処理はステップＳ２３５に進む。
【０１４８】
ステップＳ２３５において、仮想ＣＰＵ１４１は、図１３のステップＳ２０３の処理と同様に、有効なフックポイントであるか否かを判定する。有効なフックポイントであると判定された場合、処理はステップＳ２３６に進む。
【０１４９】
ステップＳ２３６において、仮想ＣＰＵ１４１は、図１３のステップＳ２０４の処理と同様に、フックパーサ１３３にフック通知を送る。
【０１５０】
その後、処理はステップＳ２２１に戻り、ステップＳ２２１以降の処理が実行される。
【０１５１】
一方、ステップＳ２３４において、フックポイントが設定されている例外でないと判定されるか、ステップＳ２３５において、有効なフックポイントでないと判定された場合、処理はステップＳ２２１に戻り、ステップＳ２２１以降の処理が実行される。
【０１５２】
（フックパーサ１３３のフック通知対応処理）
次に、図１５のフローチャートを参照して、フックパーサ１３３が仮想ハードウエア１３１からのフック通知に対応する場合の処理について説明する。
【０１５３】
ステップＳ２５１において、フックパーサ１３３は、フック実行を表示させる。具体的には、フックパーサ１３３は、仮想ハードウエア１３１またはフック実行部１３４から通知されたフックポイントに対応するフック関数を実行する旨をモニタ１３２に通知する。モニタ１３２は、通知されたフックポイントに対応するフック関数を実行することを示すメッセージを表示部１１３に表示させる。
【０１５４】
ステップＳ２５２において、フックパーサ１３３は、仮想ハードウエア１３１またはフック実行部１３４から通知されたフックポイントに対応するフック関数を対応表から検索する。
【０１５５】
ステップＳ２５３において、フックパーサ１３３は、検索したフック関数、換言すれば、仮想ハードウエア１３１またはフック実行部１３４から通知されたフックポイントに対応付けられているフック関数の実行をフック実行部１３４に指令する。
【０１５６】
その後、フック通知対応処理は終了する。
【０１５７】
（フック実行部１３４の処理）
次に、図１６のフローチャートを参照して、フック実行部１３４の処理について説明する。
【０１５８】
ステップＳ２７１において、フック実行部１３４は、フックパーサ１３３からフック関数の実行が指令されたか否かを判定する。フック関数の実行が指令されたと判定された場合、処理はステップＳ２７２に進む。
【０１５９】
ステップＳ２７２において、フック実行部１３４は、フックパーサ１３３から指令されたフック関数を実行する。すなわち、
【０１６０】
その後、処理はステップＳ２７３に進む。
【０１６１】
一方、ステップＳ２７１において、フックパーサ１３３からフック関数の実行が指令されていないと判定された場合、ステップＳ２７２の処理はスキップされ、処理はステップＳ２７３に進む。
【０１６２】
ステップＳ２７３において、フック実行部１３４は、タイマ１５１がタイムアウトしたか否かを判定する。タイマ１５１がタイムアウトしたと判定された場合、処理はステップＳ２７４に進む。
【０１６３】
ステップＳ２７４において、フック実行部１３４は、当該タイマ１５１のタイムアウトに対してフックポイントが設定されているか否かを判定する。当該タイマ１５１のタイムアウトに対してフックポイントが設定されていると判定された場合、処理はステップＳ２７５に進む。
【０１６４】
ステップＳ２７５において、フック実行部１３４は、タイマ１５１がタイムアウトしたことを示すフック通知をフックパーサ１３３に送る。
【０１６５】
その後、処理はステップＳ２７１に戻り、ステップＳ２７１以降の処理が実行される。
【０１６６】
一方、ステップＳ２７３において、タイマ１５１がタイムアウトしてないと判定されるか、ステップＳ２７４において、当該タイマ１５１のタイムアウトに対してフックポイントが設定されていないと判定された場合、処理はステップＳ２７１に戻り、ステップＳ２７１以降の処理が実行される。
【０１６７】
（フック関数実行処理の具体例）
次に、図１７乃至図１９のフローチャートを参照して、フック実行部１３４によるフック関数実行処理の具体例について説明する。
【０１６８】
まず、図１７を参照して、フック関数Ａを実行する場合の処理について説明する。
【０１６９】
ステップＳ２９１において、フック実行部１３４は、タイマ１５１をスタートする。例えば、図１１のフックプログラムのブロック＃１の"start timer1"を実行する処理がこれに該当する。
【０１７０】
その後、処理は終了する。
【０１７１】
次に、図１８を参照して、フック関数Ｂを実行する場合の処理について説明する。
【０１７２】
ステップＳ３１１において、フック実行部１３４は、タイマ１５１をリセットする。例えば、図１１のフックプログラムのブロック＃２の"stop timer1"を実行する処理がこれに該当する。
【０１７３】
その後、処理は終了する。
【０１７４】
次に、図１９を参照して、フック関数Ｃを実行する場合の処理について説明する。
【０１７５】
ステップＳ３３１において、フック実行部１３４は、例外発行処理を実行する。例えば、図１１のフックプログラムのブロック＃３の"exception VM_EXCEPTION_1"を実行する処理がこれに該当する。
【０１７６】
その後、処理は終了する。
【０１７７】
ここで、図２０のフローチャートを参照して、ステップＳ３３１の例外発行処理の詳細について説明する。
【０１７８】
ステップＳ３５１において、フック実行部１３４は、例外情報を仮想ＣＰＵ１４１のレジスタ（不図示）に保存する。例えば、フック実行部１３４は、図１１のフックプログラムのブロック＃３の"exception VM_EXCEPTION_1"を実行する場合、例外VM_EXCEPTION_1が発生していることを示す情報を仮想ＣＰＵ１４１のレジスタに保存する。
【０１７９】
ステップＳ３５２において、フック実行部１３４は、仮想ＣＰＵ１４１の状態を例外ありに変更する。
【０１８０】
その後、例外発行処理は終了する。
【０１８１】
この例外発行処理により、フック実行部１３４からカーネル１６１に、仮想ＣＰＵ１４１を介して例外の発生および発生した例外の種類が通知される。
【０１８２】
（カーネルの処理）
次に、図２１のフローチャートを参照して、カーネル１６１の処理について説明する。
【０１８３】
ステップＳ４０１において、カーネルフック機構１７２は、例外が発生しているか否かを判定する。例外が発生していると判定された場合、処理はステップＳ４０２に進む。
【０１８４】
ステップＳ４０２において、カーネルフック機構１７２は、例外処理を実行する。ここで、図２２のフローチャートを参照して、例外処理の詳細について説明する。
【０１８５】
ステップＳ４２１において、カーネルフック機構１７２は、発生した例外に対してフックポイントが設定されているか否かを判定する。発生した例外に対してフックポイントが設定されていると判定された場合、処理はステップＳ４２２に進む。
【０１８６】
ステップＳ４２２において、カーネルフック機構１７２は、カーネルフック関数実行処理を実行する。
【０１８７】
ここで、図２３のフローチャートを参照して、カーネルフック関数実行処理の具体例について説明する。
【０１８８】
ステップＳ４４１において、カーネルフック機構１７２は、システムの状態を表示させる。具体的には、カーネルフック機構１７２は、仮想ハードウエア１３１やアプリケーションプログラム１６２等の状態（例えば、レジスタや変数の値、実行中のプロセス等に関する情報等）を取得する。そして、カーネルフック機構１７２は、取得したシステムの状態を示す情報を表示部１１３に表示させる。
【０１８９】
なお、このとき、例えば、取得したシステムの状態を示す情報を記憶媒体に記憶させたり、外部の装置に出力したりするようにしてもよい。
【０１９０】
その後、カーネルフック関数実行処理は終了する。
【０１９１】
ここで、図２４を参照して、ここまでのカーネル１６１の処理の具体例について説明する。図２４は、カーネルフック機構１７２に含まれるカーネルフックプログラムの例を示している。このカーネルフックプログラムは、ブロック＃１１乃至＃１３の３つのブロックにより構成される。
【０１９２】
ブロック＃１１において、"exception_handler"という名称の関数の先頭にフックポイントが設定されている。
【０１９３】
ブロック＃１２において、例外判定処理が行われる。この例外判定処理は、例外VM_EXCEPTION_1が発生した場合にTRUEとなる。
【０１９４】
そして、ブロック＃１２の例外判定処理がTRUEとなった場合、ブロック＃１３において、カーネルフック関数dump_process_info(413)が実行される。カーネルフック関数dump_process_info(413)は、例えば、プロセスIDが413の通信プロセスの状況を表示させる関数である。
【０１９５】
例えば、図１１のフックプログラムと、図２３のカーネルフックプログラムの組み合わせにより、仮想デバイス１４３の１つであるシリアル通信デバイスからの割り込みから、一定時間内にシリアル通信デバイスのデータが読み出されないときに、シリアル通信プロセスの状態を表示させることが可能になる。
【０１９６】
なお、フックプログラムとカーネルフックプログラムは、別のプログラム言語によって作成してもかまわないが、単一の言語で作成できるとより好適である。また、このプログラム言語には、任意の言語を採用することができる。なお、図１１と図２３では、上述したDTraceの言語であるDscriptを拡張した言語により、フックプログラムとカーネルフックプログラムを作成した例を示している。
【０１９７】
図２２に戻り、ステップＳ４２３において、カーネル１６１は、通常の例外の処理を実行する。ここで、通常の例外の処理とは、例えば、ゼロ除算、ページ例外等である。
【０１９８】
その後、例外処理は終了する。
【０１９９】
図２１に戻り、ステップＳ４０１において、例外が発生していないと判定された場合、ステップＳ４０１の処理はスキップされ、処理はステップＳ４０３に進む。
【０２００】
ステップＳ４０３において、カーネル１６１は通常の処理を実行する。
【０２０１】
以上のようにして、カーネル１６１やアプリケーションプログラム１６２の実行過程をトレースする際に、仮想マシン１２１の状態に応じて、システムの状態を取得することができる。すなわち、カーネルフック機構１７２に設定されているフックポイントだけでなく、仮想マシン１２１の仮想ハードウエア１３１に設定されているフックポイントに達したときや、フック実行部１３４のタイマ１５１がタイムアウトしたタイミングで、システムの状態を取得することができる。これにより、仮想マシン１２１の挙動に応じて、アプリケーションプログラム１６２の実行過程をトレースすることができ、ハードウエアと関連したカーネル１６１およびアプリケーションプログラム１６２の不具合の解決を容易にすることができる。
【０２０２】
また、フックポイントやフック関数の増減に対して、フックパーサ１３３等に変更を加えずに、仮想ハードウエア１３１のフックポイントリストや、フックパーサ１３３に提供するフックプログラムを変更するだけで、容易に対応することができる。また、仮想ハードウエア１３１の種類の増加に対しても、対応するフックポイントリストを追加し、フックプログラムを変更するだけで、容易に対応することができる。
【０２０３】
＜２．変形例＞
以下、上述した本技術の実施の形態の変形例について説明する。
【０２０４】
以上の説明では、フックパーサ１３３が、仮想ハードウエア１３１からフック通知を受けてからフック関数をフック実行部１３４に実行させる例を示したが、直接仮想ハードウエア１３１からフック実行部１３４にフック通知を送信することにより、フック実行部１３４がフック関数を実行するようにしてもよい。この場合、例えば、フックパーサ１３３が生成した対応表をフック実行部１３４が保持するようにすればよい。また、この場合、タイマ１５１のタイムアウトが発生した場合、フック実行部１３４が自分で判断して、カーネル１６１に例外を通知することが可能になる。
【０２０５】
また、仮想ハードウエア１３１が、フックポイントが有効か無効かを判定せずに、予め設定されている全てのフックポイントに達する度にフック通知を送信するようにしてもよい。そして、フックパーサ１３３またはフック実行部１３４が、有効なフックポイントであるか否かを判定し、有効なフックポイントである場合、対応するフック関数を実行するようにしてもよい。
【０２０６】
なお、本技術は、各種の仮想マシン、および、仮想マシンを用いるシステム（例えば、デバッガやソフトウエアの開発環境等）に適用することができる。
【０２０７】
［コンピュータの構成例］
上述した一連の処理は、ハードウエアにより実行することもできるし、ソフトウエアにより実行することもできる。一連の処理をソフトウエアにより実行する場合には、そのソフトウエアを構成するプログラムが、コンピュータにインストールされる。ここで、コンピュータには、専用のハードウエアに組み込まれているコンピュータや、各種のプログラムをインストールすることで、各種の機能を実行することが可能な、例えば汎用のパーソナルコンピュータなどが含まれる。
【０２０８】
図２５は、上述した一連の処理をプログラムにより実行するコンピュータ（例えば、図１のコンピュータ）のハードウエアの構成例を示すブロック図である。
【０２０９】
コンピュータにおいて、CPU（Central Processing Unit）３０１，ROM（Read Only Memory）３０２，RAM（Random Access Memory）３０３は、バス３０４により相互に接続されている。
【０２１０】
バス３０４には、さらに、入出力インタフェース３０５が接続されている。入出力インタフェース３０５には、入力部３０６、出力部３０７、記憶部３０８、通信部３０９、及びドライブ３１０が接続されている。
【０２１１】
入力部３０６は、キーボード、マウス、マイクロフォンなどよりなる。出力部３０７は、ディスプレイ、スピーカなどよりなる。記憶部３０８は、ハードディスクや不揮発性のメモリなどよりなる。通信部３０９は、ネットワークインタフェースなどよりなる。ドライブ３１０は、磁気ディスク、光ディスク、光磁気ディスク、又は半導体メモリなどのリムーバブルメディア３１１を駆動する。
【０２１２】
以上のように構成されるコンピュータでは、CPU３０１が、例えば、記憶部３０８に記憶されているプログラムを、入出力インタフェース３０５及びバス３０４を介して、RAM３０３にロードして実行することにより、上述した一連の処理が行われる。
【０２１３】
コンピュータ（CPU３０１）が実行するプログラムは、例えば、パッケージメディア等としてのリムーバブルメディア３１１に記録して提供することができる。また、プログラムは、ローカルエリアネットワーク、インターネット、デジタル衛星放送といった、有線または無線の伝送媒体を介して提供することができる。
【０２１４】
コンピュータでは、プログラムは、リムーバブルメディア３１１をドライブ３１０に装着することにより、入出力インタフェース３０５を介して、記憶部３０８にインストールすることができる。また、プログラムは、有線または無線の伝送媒体を介して、通信部３０９で受信し、記憶部３０８にインストールすることができる。その他、プログラムは、ROM３０２や記憶部３０８に、あらかじめインストールしておくことができる。
【０２１５】
なお、コンピュータが実行するプログラムは、本明細書で説明する順序に沿って時系列に処理が行われるプログラムであっても良いし、並列に、あるいは呼び出しが行われたとき等の必要なタイミングで処理が行われるプログラムであっても良い。
【０２１６】
また、本明細書において、システムとは、複数の構成要素（装置、モジュール（部品）等）の集合を意味し、すべての構成要素が同一筐体中にあるか否かは問わない。したがって、別個の筐体に収納され、ネットワークを介して接続されている複数の装置、及び、１つの筐体の中に複数のモジュールが収納されている１つの装置は、いずれも、システムである。
【０２１７】
さらに、本技術の実施の形態は、上述した実施の形態に限定されるものではなく、本技術の要旨を逸脱しない範囲において種々の変更が可能である。
【０２１８】
例えば、本技術は、１つの機能をネットワークを介して複数の装置で分担、共同して処理するクラウドコンピューティングの構成をとることができる。
【０２１９】
また、上述のフローチャートで説明した各ステップは、１つの装置で実行する他、複数の装置で分担して実行することができる。
【０２２０】
さらに、１つのステップに複数の処理が含まれる場合には、その１つのステップに含まれる複数の処理は、１つの装置で実行する他、複数の装置で分担して実行することができる。
【０２２１】
また、例えば、本技術は以下のような構成も取ることができる。
【０２２２】
（１）
所定のフックポイントに達したことを通知する仮想ハードウエアと、
前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部と
を含む仮想マシンをコンピュータに実行させるためのプログラム。
（２）
前記フック実行部は、前記フック関数の記述に従って例外の発生を前記仮想マシン上で動作するカーネルに通知する
前記（１）に記載のプログラム。
（３）
前記カーネルは、前記フック実行部から通知される前記例外に応じて、前記仮想マシンおよび前記カーネルを含むシステムの状態を取得する
前記（２）に記載のプログラム。
（４）
前記フックポイントで実行される前記フック関数を記述したフックプログラムを解析し、前記フックポイントと前記フック関数の対応関係を求める解析部を
さらに含み、
前記フック実行部は、前記仮想ハードウエアから前記フックポイントに達したことが通知されたとき、前記解析部により前記フックポイントに対応付けられている前記フック関数を実行する
前記（１）に記載のプログラム。
（５）
前記仮想ハードウエアは、予め設定されている前記フックポイントを前記解析部に通知し、
前記解析部は、前記仮想ハードウエアから通知された前記フックポイントのうち、前記フックプログラムに出現する前記フックポイントを前記仮想ハードウエアに通知し、
前記仮想ハードウエアは、前記解析部から通知された前記フックポイントに達したとき、前記フックポイントに達したことを通知する
前記（４）に記載のプログラム。
（６）
前記フック実行部は、前記フック関数を実行することにより、タイマの起動または停止をすることが可能であり、前記タイマの計測時間が所定の時間以上になったときに例外の発生を前記仮想マシン上で動作するカーネルに通知する
前記（１）乃至（５）のいずれかに記載のプログラム。
（７）
前記フックポイントは、compare-and-swap命令の実行時に不一致が起きたときを含む
前記（１）乃至（６）のいずれかに記載のプログラム。
（８）
前記（１）乃至（７）のいずれかに記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
（９）
仮想マシンに含まれる仮想ハードウエアが、所定のフックポイントに達したことを通知し、
前記仮想マシンに含まれるフック実行部が、前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行する
ステップを含む情報処理方法。
（１０）
所定のフックポイントに達したことを通知する仮想ハードウエアと、
前記仮想ハードウエアから通知された前記フックポイントに対応するフック関数を実行するフック実行部と
を含む仮想マシンを実行する情報処理装置。
【符号の説明】
【０２２３】
１０１  情報処理システム，  １１１  コンピュータ，  １１２  入力部,  １１３  表示部,  １２１  仮想マシン,  １２２  ゲスト環境,  １３１  仮想ハードウエア,  １３２  モニタ,  １３３  フックパーサ,  １３４  フック実行部,  １４１  仮想ＣＰＵ,  １４２  仮想メモリ,  １４３  仮想デバイス,  １５１  タイマ,  １６１  カーネル,  １６２  アプリケーションプログラム,  １７１  デバイスドライバ,  １７２  カーネルフック機構
【図１】
2013152652.tif 000003
【図２】
2013152652.tif 000004
【図３】
2013152652.tif 000005
【図４】
2013152652.tif 000006
【図５】
2013152652.tif 000007
【図６】
2013152652.tif 000008
【図７】
2013152652.tif 000009
【図８】
2013152652.tif 000010
【図９】
2013152652.tif 000011
【図１０】
2013152652.tif 000012
【図１１】
2013152652.tif 000013
【図１２】
2013152652.tif 000014
【図１３】
2013152652.tif 000015
【図１４】
2013152652.tif 000016
【図１５】
2013152652.tif 000017
【図１６】
2013152652.tif 000018
【図１７】
2013152652.tif 000019
【図１８】
2013152652.tif 000020
【図１９】
2013152652.tif 000021
【図２０】
2013152652.tif 000022
【図２１】
2013152652.tif 000023
【図２２】
2013152652.tif 000024
【図２３】
2013152652.tif 000025
【図２４】
2013152652.tif 000026
【図２５】
2013152652.tif 000027