(57)【要約】      （修正有）【課題】ページフォルト発生時のエミュレーションを適切に行うエミュレーションプログラムを提供する。【解決手段】ターゲットマシンの第１のバイナリコード１３３を読み出し、ホストマシン１００の第２のバイナリコードに変換し、実行の中断に応答してメモリの状態を実行前の状態に戻すＨＴＭ（ハードウェアトランザクションメモリ）５０２の命令を付加した第３のバイナリコードを生成し、実行する。エミュレーションプログラム１３２は、ＨＴＭ５０２の発動に基づいてメモリの状態が命令列の実行前の状態に戻されたことに応答して、発動がページフォルトによる中断に基づくか否かを判定し、ページフォルトによる中断に基づくと判定した場合に、インタプリタ実行に切り替えて、ターゲットマシンのバイナリコード１３３を読み出して、命令列が有する各命令に対応するホストマシンの第４のバイナリコードを取得し、再実行する。【選択図】図２
2016207129.tif 000002
【特許請求の範囲】
【請求項１】
第１のマシンとは異なる第２のマシンの第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
処理を前記第１のマシンのコンピュータに実行させるエミュレーションプログラム。
【請求項２】
請求項１において、
前記第４のバイナリコードの実行は、前記発動がページフォルトとは異なる要因による前記中断に基づくと判定した場合に、前記第３のバイナリコードを再実行する、
エミュレーションプログラム。
【請求項３】
請求項１または２において、
前記変換は、前記第１の命令列内の一部の命令の、前記命令の実行結果の状態を示す状態情報の生成命令を省いた、前記第１のマシンの第２のバイナリコードに変換し、
前記第４のバイナリコードの実行は、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行するとともに、前記各命令の前記状態情報を生成する、
エミュレーションプログラム。
【請求項４】
第１のマシンとは異なる第２のマシンの第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
前記第１のマシンの処理部によるエミュレーション方法。
【請求項５】
第１のマシンの処理部と、
前記第１のマシンとは異なる第２のマシンの第１のバイナリコードを記憶する記憶部とを有し、
前記第１のマシンの処理部は、
前記第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、エミュレーションプログラム、エミュレーション方法、及び、情報処理装置に関する。
【背景技術】
【０００２】
オペレーションシステム（Operation System：ＯＳ）や当該ＯＳで動作するソフトウェア等の開発及びテストを、高性能な情報処理装置で実行する要望がある。また、旧式の情報処理装置の生産の中止により、旧式の情報処理装置上で動作していたソフトウェア資産を、異なるアーキテクチャの情報処理装置上で実行する要望がある。このように、特定のアーキテクチャに基づく情報処理装置で動作するソフトウェアを、異なるアーキテクチャに基づく情報処理装置で実行する要望がある。
【０００３】
特定のアーキテクチャの情報処理装置（以下、ターゲットマシン）を、異なるアーキテクチャに基づく情報処理装置（以下、ホストマシン）がエミュレーションする技術が知られる。ホストマシンは、エミュレーション処理を行うプログラム（以下、エミュレーションプログラム）にしたがって、ターゲットマシンをエミュレーションし、ターゲットマシンのバイナリコードを実行する。
【０００４】
エミュレーションプログラムは、ターゲットマシンのバイナリコードが有する命令を１つずつ解釈して対応するホストマシンのバイナリコードを取得し、実行する。または、エミュレーションプログラムは、ターゲットマシンのバイナリコードが有する、命令列をホストマシンのバイナリコードにバイナリ変換し、実行する。
【０００５】
エミュレーションに関する技術は、例えば、特許文献１、２に記載される。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−１８５５２７号公報
【特許文献２】特開２０１２−１０８９３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
命令列のバイナリ変換時に、例えば、変換対象の命令列内の一部の命令に関する処理（レジスタの更新処理等）を省略したバイナリコードを生成する場合がある。これにより、エミュレーション処理の速度が向上する。
【０００８】
しかしながら、一部の命令に関する処理を省略したバイナリコードの実行時にページフォルトが発生すると、エミュレーション処理を適切に行えない場合が生じる。または、ページフォルト発生時のエミュレーション処理を適切に行うために、省略した処理を補う処理をエミュレーションプログラムが行う必要があり、処理が複雑化する。このように、エミュレーション処理の速度を向上しながら、ページフォルト発生時のエミュレーション処理を適切に行うことは容易ではない。
【０００９】
１つの側面は、本発明は、ページフォルト発生時のエミュレーションを適切に行うエミュレーションプログラム、エミュレーション方法、及び、情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１０】
第１の側面によれば、第１のマシンとは異なる第２のマシンの第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、生成した前記第３のバイナリコードを実行し、前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、処理を前記第１のマシンのコンピュータに実行させる。
【発明の効果】
【００１１】
第１の側面によれば、ページフォルト発生時のエミュレーションを適切に行う。
【図面の簡単な説明】
【００１２】
【図１】エミュレーション処理を模式的に説明する図である。
【図２】図１に示したホストマシン（情報処理装置）のハードウェア構成図である。
【図３】図２に示したホストマシン１００のソフトウェアブロック図である。
【図４】シャドウページテーブルを使用しない場合の、ターゲットマシンの仮想メモリのエミュレーションを模式的に説明する図である。
【図５】シャドウページテーブル方式による、ターゲットマシンの仮想メモリのエミュレーションを模式的に説明する図である。
【図６】図３で説明した、コンディションコードｃｃの一例を説明する図である。
【図７】ターゲットマシンのバイナリコードが有する命令列の一例を示す図である。
【図８】ターゲットマシンのバイナリコードが有し、動的バイナリ変換モジュール１４３が変換対象とする命令列ｍｌの一例を示す図である。
【図９】図８に示した命令列ｍｌを変換した、ホストマシン１００のバイナリコードの例を示す図である。
【図１０】本実施の形態における、図８に示した命令列ｍｌを変換した、ホストマシン１００のバイナリコードの例を示す図である。
【図１１】図３に示したエミュレーションプログラム１３２の処理の概要を説明するフローチャート図である。
【図１２】図３のエミュレーションプログラム１３２の処理の詳細を説明するフローチャート図である。
【図１３】図１２のフローチャート図の工程Ｓ３２の処理の詳細を説明するフローチャート図である。
【図１４】図１２のフローチャート図の工程Ｓ３３の処理の詳細を説明する図である。
【図１５】アボート（中断）に応じて、ホストマシン１００のレジスタ「heax」にセットされる値を説明する図である。
【図１６】図１２のフローチャート図の工程Ｓ４０の処理の詳細を説明するフローチャート図である。
【図１７】ループ処理を有するプログラムｐｒ１の一例を説明する図である。
【図１８】図１７に示したプログラムｐｒ１に対応する、ターゲットマシンのバイナリコードｐｒ２（図２の１３３）の一例を示す図である。
【発明を実施するための形態】
【００１３】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１４】
［エミュレーション］
図１は、エミュレーション処理を模式的に説明する図である。図１は、情報処理装置が、当該情報処理装置と異なるアーキテクチャに基づく情報処理装置をエミュレーションする例を模式的に説明する。本実施の形態では、エミュレーション処理を行う情報処理装置をホストマシン１００と称する。また、エミュレーション処理の対象となる情報処理装置をターゲットマシンと称する。例えば、Android ＯＳを、Windows（登録商標）を搭載するパソコン上でエミュレーションする場合、ホストマシン１００はIA-32／Intel64を示し、ターゲットマシンはARMを示す。
【００１５】
図１に示すように、ホストマシン１００では、ホストマシンのＣＰＵ（Central Processing Unit：ＣＰＵ）１０１が、ホストマシン１００のオペレーションシステム（Operation System：ＯＳ）１３１を実行する。また、ＣＰＵ１０１は、ＯＳ１３１上でエミュレーションを行うプログラム（以下、エミュレーションプログラムと称する）１３２をさらに実行する。
【００１６】
エミュレーションプログラム１３２は、ターゲットマシンのハードウェアをエミュレートする。エミュレーションプログラム１３２は、ターゲットマシンのＣＰＵ（Central Processing Unit：ＣＰＵ）やストレージを仮想的にエミュレートし、仮想ＣＰＵ２０１、及び、仮想ストレージ２０２を実現する。これにより、エミュレーションプログラム１３２は、ターゲットマシンのアーキテクチャに基づくバイナリコード（以下、ターゲットマシンのバイナリコードと称する）１３３を、ホストマシン１００上で実行する。ターゲットマシンのバイナリコード１３３は、例えば、ターゲットマシンのＯＳや、当該ＯＳ上で動作するソフトウェアを示す。
【００１７】
具体的に、エミュレーションプログラム１３２は、ターゲットマシンのバイナリコード１３３が有する命令を、１つずつ解釈してホストマシンのバイナリプログラムを取得し、実行する（インタプリタ実行ともいう）。または、エミュレーションプログラム１３２は、例えば、ターゲットマシンのバイナリコード１３３が有する命令列を、命令列ごとに、ホストマシン１００のバイナリコードに変換し実行する。エミュレーションプログラム１３２は、変換済みの命令列を再び実行する場合、変換済みのホストマシン１００のバイナリコードを読み出して実行する。
【００１８】
［ホストマシンのハードウェア構成図］
図２は、図１に示したホストマシン１００のハードウェア構成図である。図２に示すホストマシン１００は、例えば、ＣＰＵ１０１、メモリ１０２、通信インタフェース部１０３を有する。各部は、バス１０６を介して相互に接続する。メモリ１０２は、ＲＡＭ（Random Access Memory：ＲＡＭ）１２０や不揮発性メモリ１２１等を備える。
【００１９】
ＣＰＵ１０１は、バス１０６を介してメモリ１０２等と接続するとともに、ホストマシン１０の全体の制御を行う。また、本実施の形態におけるＣＰＵ１０１は、メモリ管理ユニット（Memory Management Unit：ＭＭＵ）５０１、及び、ハードウェアトランザクションメモリ（Hardware Transactional Memory：ＨＴＭ）５０２を備える。
【００２０】
メモリ管理ユニット５０１は、ページング手法にしたがって、アドレスをページ単位に分割して管理する。メモリ管理ユニット５０１は、ページテーブルと称する変換テーブルに基づいて、仮想メモリ空間のページを物理メモリ空間のページに対応付ける。メモリ管理ユニット５０１は、例えば、キャッシュ領域であるＴＬＢ（Translation Lookaside Buffer：ＴＬＢ）を有し、対象の仮想アドレスがＴＬＢにない場合、ページテーブルを参照して物理アドレスを取得する。
【００２１】
ＨＴＭ５０２は、並列プログラミングをサポートするための機構である。ＨＴＭ５０２は、並列プログラミングなどで排他の衝突を低減し、性能を向上するハードウェア機構である。例えば、Sun Microsystems（登録商標）のRock、IBM（登録商標）のBlue Gene/Q Compute chip等のＣＰＵは、ＨＴＭ５０２の機構を搭載する。また、Intel（登録商標）のHaswellマイクロアーキテクチャのCore i7 ＣＰＵについても、ＨＴＭ５０２の機構を搭載する。
【００２２】
ＨＴＭ５０２は、ユーザが指定した命令列を、単一のアトミックなトランザクション（atomic and isolated transaction）として実行する。ユーザは、アトミックなトランザクションとして実行させたい命令列の前後に、トランザクションの開始及び終了を示す命令を付加する。ＨＴＭ５０２は、ユーザによって指定されたトランザクション（以下、対象トランザクション）が有する命令列が、他のスレッドの並列処理に対して、単一のトランザクションとして実行されることを保証する。
【００２３】
ＨＴＭ５０２は、対象トランザクションの実行中に、他のスレッドとの間でメモリアクセスの競合が生じた場合に発動し、対象トランザクションの実行をロールバックする。メモリアクセスの競合は、例えば、対象トランザクションが含む命令がアクセスするメモリ領域に、並列に実行される他のスレッドがアクセスし、当該メモリ領域に書き込む場合に発生する。
【００２４】
具体的に、ＨＴＭ５０２は、対象トランザクションの開始時に、対象トランザクションがアクセスする、レジスタやメモリの値の複写情報をローカルメモリに保持する。そして、ＨＴＭ５０２は、対象トランザクションの実行開始時に複写した情報と、レジスタやメモリの値とに相違が生じたか否かを判定する。相違が生じた場合、ＨＴＭ５０２は、一部のレジスタの値を除いて、複写した情報を破棄し、対象トランザクションの実行前の状態に戻す。一方、相違が生じなかった場合、即ち、他の並列処理とのメモリアクセスの競合が生じなかった場合、ＨＴＭ５０２は、処理結果をメモリやレジスタに書き込み、対象トランザクションの処理を完了する。
【００２５】
また、別の機能として、ＨＴＭ５０２は、対象トランザクションの実行中に割り込みによる中断（アボートともいう）に応答して発動し、対象トランザクションの実行をロールバックする。即ち、ＨＴＭ５０２は、対象トランザクション実行時の割り込みの発生に応答して、一部のレジスタの値を除いて複写した情報を破棄し、対象トランザクションの実行前の状態に戻す。ＨＴＭ５０２は、例えば、対象トランザクションが有するメモリアクセス命令によるページフォルトや、対象トランザクション実行時のハードウェアのＩ／Ｏ等に基づく割り込みに応答して発動する。
【００２６】
図２に戻り、図２に示す通信インタフェース部１０３は、他の装置（図示せず）と通信して、データの送受信等を行う。メモリ１０２のＲＡＭ１３０は、ＣＰＵ１０１が処理を行うデータ等を記憶する。
【００２７】
メモリ１０２の不揮発性メモリ１２１は、オペレーションシステム格納領域１３１、エミュレーションプログラム格納領域１３２、ターゲットマシンバイナリコード格納領域１３３を備える。不揮発性メモリ１２１は、例えば、不揮発性半導体メモリ等を示す。
【００２８】
オペレーションシステム格納領域１３１のオペレーションシステム（図１に示した、オペレーションシステム１３１）は、ＣＰＵ１０１の実行によって、ホストマシン１００のＯＳを実現する。エミュレーションプログラム格納領域１３２のエミュレーションプログラム（図１に示した、エミュレーションプログラム１３２）は、ＣＰＵ１０１の実行によって、図１で説明した、ターゲットマシンのエミュレーション処理を実現する。
【００２９】
ターゲットマシンバイナリコード格納領域１３３は、ターゲットマシンのアーキテクチャに基づくバイナリコード（図１に示した、ターゲットマシンのバイナリコード１３３）を格納する。図１で前述したとおり、ターゲットマシンのバイナリコード１３３は、ターゲットマシンのＯＳや、当該ＯＳ上で動作するソフトウェア等を示す。
【００３０】
［ホストマシンのソフトウェアブロック図］
図３は、図２に示したホストマシン１００のソフトウェアブロック図である。図２に示したエミュレーションプログラム１３２は、例えば、制御モジュール１４１、インタプリタモジュール１４２、動的バイナリ変換モジュール１４３を有する。
【００３１】
制御モジュール１４１は、各モジュール１４２、１４３を制御し、エミュレーション処理を実現する。また、各モジュール１４１〜１４３は、メモリアクセスのエミュレーションを高速化するために、ターゲットマシンの仮想メモリを、ホストマシン１００の仮想メモリ空間にマッピングする（シャドウページテーブル方式：Shadow Page Table）。メモリアクセスのエミュレーション、及び、シャドウページテーブル方式については、図４、図５にしたがって後述する。
【００３２】
インタプリタモジュール１４２は、ターゲットマシンのバイナリコード１３３（図２）を読み出し、実行対象の命令を、１命令ずつ解釈する。そして、インタプリタモジュール１４２は、解釈の結果、対象の命令に対応するホストマシン１００のバイナリコードを取得し、実行する。インタプリタモジュール１４２による命令の実行を、インタプリタ実行と称する。
【００３３】
インタプリタモジュール１４２は、ターゲットマシンの仮想ＣＰＵ２０１のレジスタをメモリ上に配置し、１命令ごとに、メモリ上からレジスタを読み込み、命令の完了時にメモリに書き出す。また、ターゲットマシンがコンディションコードを生成するアーキテクチャに基づく場合、インタプリタモジュール１４２は、命令の実行時に、コンディションコードを生成する。コンディションコードは、命令の実行の結果の状態を示す情報であって、レジスタの情報を示す。コンディションコードの詳細は、図６にしたがって後述する。
【００３４】
動的バイナリ変換モジュール１４３は、実行頻度の高い命令列を、動的バイナリ変換（dynamic binary translation）し、ホストマシン１００のバイナリコードに変換する。そして、動的バイナリ変換モジュール１４３は、変換して生成した、ホストマシン１００のバイナリコードを記憶する。動的バイナリ変換を、ＪＩＴ（Just In Time：ＪＩＴ）コンパイルともいう。
【００３５】
例えば、エミュレーションプログラム１３２は、初期はインタプリタモジュール１４２にしたがって命令を実行し、実行頻度が高いと判定した命令列については、動的バイナリ変換モジュール１４３にしたがってホストマシン１００のバイナリコードに変換する。また、エミュレーションプログラム１３２は、実行対象の命令について、動的バイナリ変換モジュール１４３によって変換済みのバイナリコードが存在する場合、変換済みのバイナリコードを実行する。これにより、命令の実行処理の高速化が実現する。
【００３６】
次に、図４、図５にしたがって、図３に示した、メモリアクセスのエミュレーション処理を説明する。図２で前述したとおり、ホストマシン１００のメモリ管理ユニット５０１は、ページテーブルを参照して、仮想メモリ空間のページを、物理メモリ空間のページに変換する。即ち、メモリ管理ユニット５０１は、仮想アドレスを物理アドレスに変換する。
【００３７】
図４は、シャドウページテーブルを使用しない場合の、ターゲットマシンのメモリアクセスのエミュレーションを模式的に説明する図である。図４は、ターゲットマシンの仮想メモリ空間３１０及び物理メモリ空間３１１と、ホストマシン１００の仮想メモリ空間２１０及び物理メモリ空間２１１との対応を示す。図４に示す領域２１０ａは、ターゲットマシンの物理メモリ空間３１１をエミュレーションする、ホストマシン１００の仮想メモリ空間２１０の領域を示す。
【００３８】
エミュレーションプログラム１３２は、ホストマシン１００の仮想メモリ空間２１０上で動作する。したがって、エミュレーションプログラム１３２は、ターゲットマシンの物理メモリ空間３１１を、ホストマシン１００の仮想メモリ空間２１０上に確保する。これにより、図４に示すように、仮想メモリ空間２１０は、ターゲットマシンの物理メモリ空間３１１をエミュレーションする領域２１０ａを有する。
【００３９】
ターゲットマシンの仮想ＣＰＵ２０１がメモリアクセスを行う場合、エミュレーションプログラム１３２は、ターゲットマシンのページテーブル３１２を参照して、ターゲットマシン上の仮想アドレスをターゲットマシン上の物理アドレスに変換する。ターゲットマシン上の物理アドレスは、ホストマシン１００の仮想メモリ空間２１０上の領域２１０ａのアドレスである。即ち、エミュレーションプログラム１３２は、ターゲットマシンの仮想メモリ空間３１０の仮想アドレスを、ホストマシン１００の仮想メモリ空間２１０の仮想アドレスに変換する。
【００４０】
そして、ホストマシン１００のメモリ管理ユニット５０１は、ホストマシン１００のページテーブル２１２を参照し、ホストマシン１００の仮想メモリ空間２１０の仮想アドレスを、ホストマシン１００の物理メモリ空間２１１の物理アドレスに変換する。
【００４１】
このように、図４によると、ターゲットマシンの仮想アドレスをホストマシン１００の物理アドレスに変換する場合に、２段階の変換処理が生じる。アドレス変換処理は時間を要する。したがって、２段階のアドレス変換が生じることにより、仮想ＣＰＵ２０１によるメモリアクセスの処理が遅くなる。
【００４２】
図５は、シャドウページテーブル方式による、ターゲットマシンのメモリアクセスのエミュレーションを模式的に説明する図である。図５において、図４で示したものと同一のものは、同一の記号で示す。図５に示す領域２１０ｂは、ターゲットマシンの仮想メモリ空間３１０をエミュレーションする、ホストマシン１００の仮想メモリ空間２１０の領域を示す。
【００４３】
図５の例に示すホストマシン１００は、シャドウページテーブル２１２ａを有する。シャドウページテーブル２１２ａは、ターゲットマシンの仮想アドレスと、ホストマシン１００の物理アドレスとを直接、関連付けるテーブルである。エミュレーションプログラム１３２は、ターゲットマシンの仮想メモリ空間３１０の仮想アドレスを、ホストマシン１００の仮想メモリ空間２１０のアドレスに翻訳し、シャドウページテーブルに追加する。これは、エミュレーションプログラム１３２は、ホストマシン１００の仮想メモリ空間２１０に、ターゲットマシンの仮想メモリ空間３１０に対応する領域２１０ｂを生成することを意味する。
【００４４】
ターゲットマシンの仮想ＣＰＵ２０１がメモリアクセスを行う場合、ホストマシン１００のメモリ管理ユニット５０１がアドレス変換を行う。メモリ管理ユニット５０１は、ホストマシン１００のシャドウページテーブル２１２ａを参照し、ターゲットマシンの仮想メモリ空間３１０のアドレスを、ホストマシン１００の物理メモリ空間２１１のアドレスに変換する。図５によると、ターゲットマシンの仮想アドレスから、ホストマシン１００の物理アドレスへのアドレス変換処理を、１回の変換処理にしたがって実現可能になる。これにより、仮想ＣＰＵ２０１による、メモリアクセスの処理速度が向上する。
【００４５】
図５で説明したように、シャドウページテーブル方式によると、ホストマシン１００のメモリ管理ユニット５０１が、ターゲットマシンの仮想アドレスの変換処理を行う。したがって、ターゲットマシンの仮想ＣＰＵ２０１のメモリアクセス時にページフォルトが発生する場合、ホストマシン１００上でページフォルトが発生する。本実施の形態は、図５に示したシャドウページテーブル方式にしたがって、ターゲットマシンのエミュレーションを行う場合を例示する。
【００４６】
次に、図３で説明したコンディションコードを説明する。エミュレーションプログラム１３２（図３）は、ターゲットマシンが、コンディションコードを生成するアーキテクチャに基づく情報処理装置である場合、命令の実行後にコンディションコードを生成する。本実施の形態は、ターゲットマシンが、コンディションコードを生成するアーキテクチャに基づくマシンである場合を例示する。
【００４７】
［コンディションコード］
図６は、図３で説明した、コンディションコードの一例を説明する図である。図６に示すコンディションコードｃｃは、命令の実行の結果の状態を示し、レジスタ（例えば、ＥＦＬＡＧＳレジスタ）が有する情報を示す。本実施の形態のコンディションコードｃｃは、オーバフローフラグ（ＯＦ）、サインフラグ（ＳＦ）、ゼロフラグ（ＺＦ）、補助キャリーフラグ（ＡＦ）、キャリーフラグ（ＣＦ）、及び、パリティフラグ（ＰＦ）を有する。
【００４８】
オーバフローフラグ（ＯＦ）は、演算結果にオーバフローが生じた時に値「１」、生じない時に値「０」をとるフラグである。サインフラグ（ＳＦ）は、演算結果が負数の時に値「１」、演算結果が０または正の数である時に値「０」となるフラグである。ゼロフラグ（ＺＦ）は、演算結果が０であった時に値「１」、演算結果が０以外の時に値「０」となるフラグである。
【００４９】
また、補助キャリーフラグ（ＡＦ）は、ＢＣＤ（Binary Code Decimal：ＢＣＤ）演算で使用されるフラグである。キャリーフラグ（ＣＦ）は、加算結果に桁あふれが生じた時、または減算に桁借りが生じた時に値「１」となり、それ以外では値「０」をとるフラグである。パリティフラグ（ＰＦ）は、演算結果の最下位バイトに値１のビットが偶数個含まれている場合に値「１」、奇数個含まれている場合に値「０」となるフラグである。
【００５０】
図６に示す各フラグの値は、演算命令の実行時に変化する。コンディションコードｃｃは、例えば、ＡＤＤ命令、ＳＵＢ命令のような算術命令や、ＡＮＤ命令、ＯＲ命令のような論理命令に実行に応じて値が変化する。また、情報処理装置は、条件分岐命令の分岐の判定処理時に、直前の命令の実行の結果の状態を示すコンディションコードｃｃを参照し、分岐の判定処理を行う。
【００５１】
エミュレーションプログラム１３２のインタプリタモジュール１４２（図３）は、命令を１つずつ実行する度に、命令の実行結果に基づいて、図６に示す各フラグ（コンディションコードｃｃ）の生成処理を行う。コンディションコードｃｃの生成処理は、時間を要する。一方、ある命令の実行後のコンディションコードｃｃは、その後続の命令が、分岐命令等である場合にのみ使用される。したがって、生成したコンディションコードｃｃは、使用されずに破棄される場合が多い。このように、生成したコンディションコードｃｃは、常時、使用されるわけではない。
【００５２】
次に、図７にしたがって、コンディションコードｃｃを使用する命令の例を説明する。
【００５３】
図７は、ターゲットマシンのバイナリコードが有する命令列の一例を示す図である。図７に示す命令列は、命令add（ｃｍ１）、命令test（ｃｍ２）、命令je（ｃｍ３）を有する。
【００５４】
命令「add $0x70, %rax」ｃｍ１は、アドレス「$0x70」の値と、レジスタ「rax」が保持する値との論理積を演算し、演算結果をレジスタ「rax」にセットする命令である。命令「test %eax, %eax」ｃｍ２は、レジスタ「eax」とレジスタ「eax」との論理積を演算する命令である。命令「je label」ｃｍ３は、分岐命令である。具体的に、命令「je label」ｃｍ３は、コンディションコードｃｃのゼロフラグ（ＺＦ）が値「１」の時、即ち、命令testの演算結果が値「０」である時、値「label」が指定する分岐先にジャンプする命令である。
【００５５】
図７の例によると、インタプリタモジュール１４２（図３）は、命令「add」ｃｍ１を実行し、命令「add」ｃｍ１の実行結果の状態を示すコンディションコードｃｃ１を生成する。続いて、エミュレーションプログラム１３２は、次の命令「test」ｃｍ２を実行し、命令「test」ｃｍ２の実行結果の状態を示すコンディションコードｃｃ２を生成する。続いて、インタプリタモジュール１４２は、命令「je」ｃｍ３を実行する。このとき、インタプリタモジュール１４２は、命令「test」ｃｍ２の実行後のコンディションコードｃｃ２を参照し、命令「je」ｃｍ３の分岐の判定処理を行う。
【００５６】
このように、命令「test」ｃｍ２の実行後に生成されたコンディションコードｃｃ２は使用されるものの、命令「add」ｃｍ１の実行後に生成されたコンディションコードｃｃ１は、使用されない。また、コンディションコードｃｃの生成処理は、命令の実行処理よりも、時間がかかる場合がある。したがって、エミュレーションプログラム１３２は、使用されないコンディションコードｃｃ１の生成処理に時間を要し、効率的ではない。
【００５７】
このように、エミュレーションプログラム１３２は、コンディションコードｃｃの生成処理により、エミュレーションの性能を十分に向上できない場合がある。したがって、エミュレーションプログラム１３２の動的バイナリ変換モジュール１４３（図３）が、命令列をホストマシン１００のバイナリコードに変換する場合、使用されないコンディションコードｃｃの生成処理を省略したバイナリコードに変換する。
【００５８】
具体的に、動的バイナリ変換モジュール１４３は、例えば、変換対象の命令列のうち、分岐命令の前命令及び最後尾の命令を除く、命令の実行後のコンディションコードｃｃの生成処理を省略したバイナリコードを生成する。最後尾の命令の後続に、分岐命令が実行される可能性があるため、最後尾の命令の実行後のコンディションコードｃｃは、使用される可能性がある。このように、動的バイナリ変換モジュール１４３は、一部の命令のコンディションコードｃｃの生成処理を省略したバイナリコードを生成する。
【００５９】
図８は、ターゲットマシンのバイナリコードが有し、動的バイナリ変換モジュール１４３が変換対象とする命令列ｍｌの一例を示す図である。図８に示す命令列ｍｌは、７つの命令（命令（１）〜命令（７））を有する。
【００６０】
命令（１）「mov %eax, %edx」は、レジスタ「eax」が保持する値を、レジスタ「edx」に複写する命令である。命令（２）「shl $0x4, %edx」は、レジスタ「edx」が保持する値を、４ビット左にシフトする命令である。命令（３）「mov -0x4(%rbp), %eax」は、レジスタ「rbp」が保持するアドレスの値「-0x4」の位置から４バイト分の値をロードし、バイナリ「eax」にセットする命令である。
【００６１】
命令（４）「and $0xf, %eax」は、レジスタ「eax」の値と、値「0xf」との論理積を演算する命令である。命令（５）「mov %eax, (%rbx)」は、レジスタ「rbx」が保持するアドレスに、レジスタ「eax」の値を４バイト分、ストアする命令である。命令（６）「lea (%rdx, %rax, 1), %eax」は、値「%rdx + %rdx + 1」をレジスタ「eax」にセットする命令である。命令（７）「and $0xffff, %eax」は、レジスタ「eax」の値と値「0xffff」との論理積を演算する命令である。
【００６２】
命令（１）〜（７）のうち、命令（２）、命令（４）、命令（７）は、演算命令である。したがって、命令（２）、命令（４）、命令（７）の実行の結果、コンディションコードｃｃが変化する。また、命令（１）〜（７）は、いずれも条件分岐命令ではない。つまり、命令（１）〜（７）のいずれの命令も、直前の命令が生成したコンディションコードｃｃを使用しない。
【００６３】
したがって、図８に示す命令列ｍｌを動的バイナリ変換する場合、動的バイナリ変換モジュール１４３は、最後尾の命令（７）のみのコンディションコードｃｃの生成処理を有する、ホストマシン１００のバイナリコードを生成する。換言すると、動的バイナリ変換モジュール１４３は、命令（１）〜命令（６）のコンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードを生成する。
【００６４】
これにより、エミュレーションプログラム１３２は、生成したホストマシン１００のバイナリコードの実行時に、使用されないコンディションコードｃｃの生成処理を行わない。コンディションコードｃｃの生成処理を抑制することにより、ターゲットマシンのバイナリコード１３３のエミュレーション処理の性能を向上することが可能になる。
【００６５】
ただし、命令列ｍｌがメモリアクセス命令を含む場合、メモリアクセス命令の実行時にページフォルトが発生する可能性がある。図８の例に示す、命令（３）及び命令（５）は、メモリアクセスを行う命令である。したがって、命令（３）や命令（５）の実行時に、ページフォルトが発生する可能性がある。
【００６６】
図５で前述したとおり、シャドウページテーブル方式を採用する場合、ホストマシン１００のメモリ管理ユニット５０１が、ターゲットマシンの仮想アドレスの変換処理を行う。したがって、ターゲットマシンの仮想ＣＰＵ２０１による、命令（３）及び命令（５）の実行時にページフォルトが発生した場合、ホストマシン１００上でページフォルトが発生する。ページフォルトが発生すると、割り込みハンドラに処理が遷移する。割り込みハンドラに処理が遷移する際、コンディションコードｃｃを含むレジスタの情報は、最新の情報に更新されている必要がある。
【００６７】
なお、本実施の形態では、シャドウページテーブル方式を採用する場合（図５）を例示するが、図４に示すメモリアクセスのエミュレーション方法に基づく場合も同様である。図４に示す、エミュレーション方法に基づく場合についても、メモリアクセス命令の実行時に、ターゲットマシン上でページフォルトが発生する場合がある。したがって、図４に示すエミュレーション方法に基づく場合についても、ページフォルトの発生時に、コンディションコードｃｃを含むレジスタの情報は、最新の情報に更新されている必要がある。
【００６８】
例えば、実行対象のプログラム（バイナリコード）が異常終了する場合、ＣＰＵ１０１は、デバッグ等を目的として、コンディションコードｃｃを含むレジスタの情報を出力する。ユーザは、異常終了時に、例えば、出力されたレジスタの情報等に基づいて、バイナリコードのデバッグ処理を行う。したがって、例えば、ページフォルトに基づいてバイナリコードが異常終了する場合、ＣＰＵ１０１は、コンディションコードｃｃを含むレジスタ情報を出力する。
【００６９】
同様にして、ターゲットマシンのバイナリコード１３３がページフォルトに基づいて異常終了する場合、エミュレーションプログラム１３２は、コンディションコードｃｃを含むレジスタ情報を出力する。しかしながら、一部の命令のコンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードを実行する場合、エミュレーションプログラム１３２は、異常終了時（最新）のコンディションコードｃｃを出力できない。
【００７０】
図８に示す、命令（２）は、コンディションコードｃｃを変化させる命令である。しかしながら、命令（１）〜命令（６）のコンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードを実行する場合、エミュレーションプログラム１３２は、命令（２）のコンディションコードｃｃを生成しない。
【００７１】
したがって、命令（３）の実行時にページフォルトが発生した場合、エミュレーションプログラム１３２は、命令（２）のコンディションコードｃｃを含むレジスタ情報を出力できない。即ち、エミュレーションプログラム１３２は、最新のコンディションコードｃｃを含むレジスタ情報を出力できない。
【００７２】
これにより、ターゲットマシンをエミュレートする場合と、ターゲットマシンが実機である場合との間で、異常終了時に出力するレジスタ情報が異なる。これは、エミュレーションプログラム１３２が、適切にエミュレーション処理を行えていないことを意味する。また、ユーザは、出力されたレジスタ情報に基づいて、適切にデバッグ処理を行うことができない。
【００７３】
このように、ページフォルトが発生した場合に備えて、エミュレーションプログラム１３２は、コンディションコードｃｃを最新に更新しておく必要がある。したがって、動的バイナリ変換モジュール１４３は、例えば、メモリアクセス命令（命令（３）、命令（５））の直前の命令（命令（２）、命令（４））の、コンディションコードｃｃの生成処理を省略せずに、バイナリコードを生成する。または、エミュレーションプログラム１３２は、遅延評価（lazy evaluation）にしたがって、コンディションコードｃｃを最新の情報に更新する。
【００７４】
まず、図９にしたがって、命令（２）、命令（４）の実行後のコンディションコードｃｃの生成処理を省略しない場合のバイナリコードの一例を説明する。図９は、ターゲットマシンのレジスタは、「teax」のように、プレフィックス「t」を付加して示す。一方、図９に図示していないが、本実施の形態において、ホストマシン１００のレジスタは、「heax」のように、プレフィックス「ｈ」を付加して説明する。ホストマシン１００のレジスタについては、図１４にしたがって後述する。
【００７５】
図９は、図８に示した命令列ｍｌを変換した、ホストマシン１００のバイナリコードの一例を示す図である。図９に示す命令列ｍｌは、図８に示した命令列ｍｌと同様である。図９は、命令列ｍｌと、命令列ｍｌを動的バイナリ変換して生成した、ホストマシン１００のバイナリコードｈｂ−１の一例とを示す。
【００７６】
動的バイナリ変換モジュール１４３は、命令列ｍｌの変換時に、最後尾の命令（７）と、命令（２）及び命令（４）とを除く命令の、コンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードｈｂ−１を生成する。したがって、変換して生成されたホストマシン１００のバイナリコードｈｂ−１は、最後尾の命令（７）に加えて、命令（２）及び命令（４）のコンディションコードｃｃの生成コードを有する。
【００７７】
バイナリコードｈｂ−１によると、エミュレーションプログラム１３２は、命令（２）のコンディションコードｃｃを生成する。したがって、メモリアクセス命令（３）の実行時にページフォルトが発生した場合であっても、コンディションコードｃｃは、最新の、命令（２）の実行時のコンディションコードｃｃとなる。即ち、ページフォルトが発生した場合であっても、コンディションコードｃｃは、最新の情報となる。メモリアクセス命令（５）の実行時にページフォルトが発生した場合についても同様である。
【００７８】
ただし、メモリアクセス命令の実行時にページフォルトが発生する確率は高くない。つまり、メモリアクセス命令の実行の度に、ページフォルトが発生するわけではない。したがって、図９に示したように、ページフォルトの発生に備えて、バイナリコードｈｂ−１に、メモリアクセス命令の直前の命令のコンディションコードｃｃの生成処理を含めておくことは効率的ではない。即ち、エミュレーション処理の速度が十分に向上しない。
【００７９】
一方、遅延評価の手法にしたがって、コンディションコードｃｃを最新の情報に更新する方法がある。
【００８０】
［遅延評価］
遅延評価によると、エミュレーションプログラム１３２は、命令（２）と命令（４）の実行時に、コンディションコードｃｃの生成に使用するデータを退避して保持しておく。そして、命令（３）や命令（５）の実行時にページフォルトが発生した場合、退避していたデータに基づいて、コンディションコードｃｃを生成する。これにより、ページフォルトが発生した場合であっても、エミュレーションプログラム１３２は、コンディションコードｃｃを最新の情報に更新できる。
【００８１】
しかしながら、遅延評価に基づく場合、エミュレーションプログラム１３２は、コンディションコードｃｃの生成に使用するデータの退避処理や、退避したデータに基づいてコンディションコードｃｃを生成する処理をさらに備える必要がある。これにより、エミュレーションプログラム１３２の処理が複雑になるとともに、コンディションコードｃｃの生成に使用するデータの退避処理に時間を要する。
【００８２】
なお、図７〜図９の例は、コンディションコードｃｃの生成処理を省略する場合を例示したが、この例に限定されるものではない。生成処理を省略する対象は、コンディションコードｃｃを保持するレジスタとは異なる別のレジスタ情報や、別の情報等であってもよい。動的バイナリ変換モジュール１４３は、動的バイナリ変換する際に、命令列内の一部の命令に関する情報の生成処理を省略したホストマシン１００のバイナリコードに変換することにより、エミュレーションの性能を向上する。
【００８３】
［本実施の形態の概要］
したがって、本実施の形態におけるエミュレーションプログラム１３２は、ターゲットマシンの（第１の）バイナリコード１３３を読み出し、当該バイナリコードが有する命令列（第１の命令列）を、ホストマシンの（第２の）バイナリコードに変換する。そして、エミュレーションプログラム１３２は、ホストマシン１００が命令列の実行の中断に応答してメモリの状態を命令列の実行前の状態に戻すＨＴＭ５０２の命令（指示命令）を、変換後のホストマシン１００のバイナリコードの前後に付加する。エミュレーションプログラム１３２は、ＨＴＭ５０２の命令を付加した、ホストマシン１００の（第３の）バイナリコードを実行する。
【００８４】
そして、エミュレーションプログラム１３２は、ＨＴＭ５０２の発動に基づいてメモリの状態が命令列の実行前の状態に戻されたことに応答して、ホストマシン１００が有する第１の情報に基づいて、発動がページフォルトによる中断に基づくか否かを判定する。ページフォルトによる中断に基づくと判定した場合に、エミュレーションプログラム１３２は、ターゲットマシンのバイナリコード１３３を読み出して、命令列が有する各命令に対応するホストマシンの（第４の）バイナリコードを取得し実行する。
【００８５】
つまり、エミュレーションプログラム１３２は、変換して生成したバイナリコードにアトミックなトランザクションであることを指定するＨＴＭ５０２の命令を付加することによって、命令列の実行時に中断が発生した場合に、命令列の実行を元に戻すことを実現する。また、エミュレーションプログラム１３２は、ＨＴＭ５０２の命令の発動がページフォルトによる中断に基づくと判定した場合に、命令列をインタプリタ実行に切り替えて再実行する。
【００８６】
インタプリタ実行は、命令列の命令ごとに処理を行うため、処理を省略しない。したがって、エミュレーションプログラム１３２は、インタプリタ実行による再実行時にページフォルトが発生した場合でも、処理を省略していないことにより、適切にエミュレーション処理を実行できる。
【００８７】
次に、図１０にしたがって、本実施の形態におけるホストマシン１００のバイナリコードの一例を説明する。本実施の形態では、命令列の一部の命令のコンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードを生成する場合を例示する。
【００８８】
また、本実施の形態では、例えば、ホストマシン１００、及び、ターゲットマシンがともに、Intel64アーキテクチャに基づく場合を例示する。ただし、この例に限定されるものではない。ホストマシン１００は、ＨＴＭ５０２の機構を備えていれば、Intel64以外のアーキテクチャに基づくマシンであってもよい。また、ターゲットマシンは、IBM System/３７０、SPARC、POWER/PowerPC等の、コンディションコードｃｃと類似する機能等を備えるアーキテクチャに基づくマシンでもよい。
【００８９】
また、本実施の形態では、ＨＴＭ５０２が、IntelがHaswellマイクロアーキテクチャのIntel64 ＣＰＵに搭載するＴＳＸ（Transcational Synchronization Extensions：ＴＳＸ）である場合を例示する。ＴＳＸは、命令ＸＢＥＧＩＮ、命令ＸＥＮＤで囲んだ命令列を、アトミックなトランザクションに対応する命令列として処理する。つまり、ＴＳＸは、命令ＸＢＥＧＩＮから命令ＸＥＮＤの間の命令の実行中に、割り込みによる中断を検出すると、レジスタを含むメモリの状態を、命令ＸＢＥＧＩＮの時点に戻す。以下、ＨＴＭ５０２をＴＳＸと称する。
【００９０】
図１０は、本実施の形態における、図８に示した命令列ｍｌを変換した、ホストマシン１００のバイナリコードの例を示す図である。図１０において、図９で示したものと同一のものは、同一の記号で示す。図１０は、命令列ｍｌと、命令列ｍｌを動的バイナリ変換して生成するホストマシン１００のバイナリコードの一例とを示す。図１０に示す命令列ｍｌは、図８に示した命令列ｍｌと同様である。
【００９１】
動的バイナリ変換モジュール１４３は、命令列ｍｌの変換時に、最後尾の命令（７）以外の命令の、コンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードｈｂ−２を生成する。また、動的バイナリ変換モジュール１４３は、変換して生成したホストマシン１００のバイナリコードｈｂ−２に、命令ＸＢＥＧＩＮ及び命令ＸＥＮＤを付加する。したがって、図１０に示す、ホストマシン１００のバイナリコードｈｂ−２は、最後尾の命令（７）の直後に、コンディションコードｃｃの生成コードを有するとともに、命令（０）「ＸＢＥＧＩＮ」と命令（８）「ＸＥＮＤ」とを有する。
【００９２】
また、図１０に示す、命令（０）「ＸＢＥＧＩＮ」のパラメータ「label_failed」は、命令列の実行の中断に応答して遷移する、バイナリコードｈｂ−２のセクションを示す。即ち、バイナリコードｈｂ−２の実行位置は、実行の中断に応答して、命令（９）のセクションに移動する。
【００９３】
次に、図１１にしたがって、本実施の形態におけるエミュレーションプログラム１３２の処理の概要を説明する。
【００９４】
［エミュレーションプログラムの処理の概要］
図１１は、図３に示したエミュレーションプログラム１３２の処理の概要を説明するフローチャート図である。図１１は、図１０に示す、ホストマシン１００のバイナリコードｈｂ−２にしたがって、処理の概要を説明する。
【００９５】
Ｓ１１：エミュレーションプログラム１３２の制御モジュール１４１は、バイナリコードｈｂ−２を実行する。
【００９６】
Ｓ１２：ＴＳＸは、命令（１）〜命令（７）の実行中に、割り込みによる処理の中断（以下、アボートともいう）を検知すると発動し、バイナリコードｈｂ−２による、レジスタを含むメモリの変更を、命令（１）の実行前の状態に戻す。即ち、ＴＳＸは、レジスタを含むメモリの状態を、バイナリコードｈｐ−２の実行前の状態にロールバックする。
【００９７】
また、バイナリコードｈｂ−２の実行位置は、命令（９）（図１０）のセクション「label_failed」に遷移する。本実施の形態における命令（９）のセクション「label_failed」は、中断がページフォルトに基づく中断であるか否かを判定し、ページフォルトに基づく中断である場合に、命令列をインタプリタ実行に切り替える処理の記述を有する。
【００９８】
Ｓ１３：制御モジュール１４１は、ホストマシン１００が有するレジスタの情報に基づいて、発生したアボートがページフォルトによるアボートであるか否かを判定する。
【００９９】
Ｓ１４：発生したアボートがページフォルトに基づくアボートである場合（Ｓ１３のＹｅｓ）、ホストマシン１００のバイナリコードｈｂ−２を再実行した場合に、再度、ページフォルトが発生する確率が高い。したがって、制御モジュール１４１は、命令列ｍｌの各命令（命令（１）〜命令（７））を、インタプリタ実行に切り替えて再実行する。即ち、制御モジュール１４１は、アボートがページフォルトに基づく場合についてのみ、処理を省略しないインタプリタ実行に切り替えて命令を再実行する。
【０１００】
インタプリタ実行は処理を省略しないため、インタプリタ実行による再実行の際にページフォルトが再発生したとしても、エミュレーションプログラム１３２は、ページフォルト発生時に適切にエミュレーションを行うことができる。具体的に、エミュレーションプログラム１３２は、インタプリタ実行による再実行時に、ページフォルトが発生した場合であっても、コンディションコードｃｃを最新の状態に設定できる。
【０１０１】
このように、エミュレーションプログラム１３２は、命令列の一部の命令の処理を省略したホストマシン１００のバイナリコードに基づいて、エミュレーション処理を適切に実行できる。前述したとおり、メモリアクセス命令の実行時にページフォルトが発生する確率は高くない。したがって、ページフォルトが発生しない場合については、一部の命令の処理を省略して生成したバイナリコードに基づいて、より高速に、ターゲットマシンのバイナリコード１３３をエミュレーション可能になる。
【０１０２】
したがって、エミュレーションプログラム１３２は、処理を最小限に抑えた、ホストマシン１００のバイナリコードに基づいて、エミュレーション処理の速度を向上しながら、ページフォルト発生時に適切にエミュレーションを行うことができる。
【０１０３】
また、本実施の形態のエミュレーションプログラム１３２は、既存のＴＳＸ（ＨＴＭ５０２）の機構を利用する。つまり、エミュレーションプログラム１３２は、対象とする命令列の前後に、ＴＳＸ命令を追加することにより、簡易に、命令列の実行時のアボートの発生時に、メモリの状態を命令列の実行前の状態に戻すことを実現可能にする。これにより、エミュレーションプログラム１３２は、アボートの発生に応答して、発生したアボートがページフォルトに基づくと判定した場合に、命令列の実行をインタプリタ実行に切り替えることができる。
【０１０４】
このように、エミュレーションプログラム１３２は、ＴＳＸの機能を利用することにより、簡易に、エミュレーション処理の速度を向上しながら、ページフォルト発生時に適切にエミュレーションを行うことを実現にする。
【０１０５】
図１１のフローチャート図に戻る。
【０１０６】
一方、ページフォルトに基づくアボートではない場合（Ｓ１３のＮｏ）、ホストマシン１００のバイナリコードｈｂ−２を再実行したとしても、アボートが再発する確率は低い。即ち、バイナリコードｈｂ−２の再実行が成功する確率が高い。したがって、制御モジュール１４１は、ホストマシン１００のバイナリコードｈｂ−２を再実行する（Ｓ１１）。これにより、ページフォルトに基づくアボートではない場合については、処理を最小限に抑えたバイナリコードｈｂ−２に基づいて、高速に命令列を実行可能になる。
【０１０７】
次に、図１２〜図１６にしたがって、本実施の形態におけるエミュレーションプログラム１３２の処理の詳細を説明する。
【０１０８】
［エミュレーションプログラムの処理の詳細］
図１２は、図３のエミュレーションプログラム１３２の処理の詳細を説明するフローチャート図である。
【０１０９】
Ｓ３１：制御モジュール１４１は、ターゲットマシンのバイナリコード１３３（図２）を読み出す。そして、制御モジュール１４１は、実行対象の命令を含む命令列（例えば、命令列ｍｌ）の、変換済みのホストマシン１００のバイナリコード（例えば、図１０のバイナリコードｈｂ−２）が存在するか否かを判定する。即ち、制御モジュール１４１は、実行対象の命令に対応する、ホストマシン１００のバイナリコードが変換済みであるか否かを判定する。
【０１１０】
Ｓ３２：バイナリコードｈｂ−２が存在しない場合（Ｓ１１のＮｏ）、インタプリタモジュール１４２は、実行対象の命令を１命令ずつ実行する（インタプリタ実行）。工程Ｓ３２の処理の詳細は、図１３のフローチャート図にしたがって後述する。
【０１１１】
Ｓ３３：一方、ホストマシン１００のバイナリコードｈｂ−２が存在する場合（Ｓ３１のＹｅｓ）、エミュレーションプログラム１３２は、バイナリコードｈｂ−２を実行する。工程Ｓ３３の処理の詳細は、図１４のフローチャート図にしたがって後述する。
【０１１２】
Ｓ３４：制御モジュール１４１は、ホストマシン１００のバイナリコードの実行中に、ページフォルトに基づくアボートが発生したか否かを判定する。ＴＳＸは、アボートの発生を検出すると、レジスタを含むメモリの状態を、命令列の実行前の状態に戻す。図１１で説明したとおり、ページフォルトに基づくアボートが発生した場合（Ｓ３４のＹｅｓ）、制御モジュール１４１は、バイナリコードｈｂ−２に対応する命令列（命令（１）〜命令（７））の各命令をインタプリタ実行に切り替えて、再実行する（Ｓ３２）。
【０１１３】
Ｓ３５：ページフォルトによる中断が発生していない場合（Ｓ３３のＮｏ）、即ち、バイナリコードｈｂ−２による実行が完了した場合、制御モジュール１４１は、次の実行対象の命令アドレスを、命令列ｍｌの実行後のアドレスに更新する。即ち、エミュレーションプログラム１３２は、プログラムカウンタを命令列ｍｌの実行後のアドレスに更新する。
【０１１４】
Ｓ３６：一方、命令をインタプリタ実行（Ｓ３２）した場合、制御モジュール１４１は、実行した命令が分岐命令であったか否かを判定する。
【０１１５】
Ｓ３７：実行した命令が分岐命令ではない場合（Ｓ３６のＮｏ）、制御モジュール１４１は、次の実行対象の命令アドレスを１命令分、インクリメントする。そして、制御モジュール１４１は、命令アドレスが示す次の命令を対象として工程Ｓ３１の処理を行う。
【０１１６】
Ｓ３８：実行した命令が分岐命令である場合（Ｓ３６のＹｅｓ）、制御モジュール１４１は、分岐命令の分岐先アドレスに対応する分岐回数（カウンタ）をインクリメントする。
【０１１７】
Ｓ３９：制御モジュール１４１は、インクリメント後の分岐回数が、検証等に基づいて予め定めた、閾値を上回ったか否かを判定する。
【０１１８】
Ｓ４０：分岐回数が閾値を上回った場合（Ｓ３９のＹｅｓ）、制御モジュール１４１は、分岐先の命令を先頭とする命令列（例えば、図８の命令列ｍｌ）を動的バイナリ変換する。工程Ｓ４０の処理については、図１６のフローチャート図にしたがって後述する。なお、分岐回数が閾値を上回っていない場合（Ｓ３９のＮｏ）、制御モジュール１４１は、工程Ｓ４０の処理を行わず、工程Ｓ３７に遷移する。
【０１１９】
［インタプリタ実行］
図１３は、図１２のフローチャート図の工程Ｓ３２の処理の詳細を説明するフローチャート図である。
【０１２０】
Ｓ２１：インタプリタモジュール１４２は、実行対象の１つの命令を解析する。
【０１２１】
Ｓ２２：インタプリタモジュール１４２は、解析の結果に基づいて、当該命令に対応するホストマシン１００のバイナリコードを取得する。
【０１２２】
Ｓ２３：インタプリタモジュール１４２は、取得したホストマシン１００のバイナリコードを実行する。
【０１２３】
Ｓ２４：インタプリタモジュール１４２は、実行結果に基づいて、コンディションコードｃｃを生成する。
【０１２４】
［バイナリコードの実行処理の流れ］
図１４は、図１２のフローチャート図の工程Ｓ３３の処理の詳細を説明する図である。図１２で前述したとおり、ホストマシン１００のバイナリコードｈｂ−２が存在する場合（Ｓ３１のＹｅｓ）、エミュレーションプログラム１３２は、ホストマシン１００のバイナリコードｈｂ−２（図１０）を実行する。
【０１２５】
Ｓ４１：制御モジュール１４１は、ホストマシン１００のバイナリコードｈｂ−２を実行する。
【０１２６】
Ｓ４２：ＴＳＸは、命令（１）〜命令（７）の実行中にアボートを検知すると、レジスタを含むメモリの変更を命令（１）の実行前の状態に戻すとともに、バイナリコードｈｂ−２の実行位置を命令（９）のセクション「label_failed」に移動する。具体的に、ＴＳＸは、ホストマシン１００のレジスタのうち、レジスタ「heax」（レジスタeax）を除いて、レジスタを含むメモリの状態を、命令（１）〜命令（７）の実行前の状態に戻す。ホストマシン１００のレジスタ、は「heax」のようにプレフィックス「ｈ」を有する。
【０１２７】
Ｓ４３：制御モジュール１４１は、図１０に示した、命令（９）のセクション「label_failed」の処理として、発生したアボートがページフォルトによるアボートであるか否かを判定する。制御モジュール１４１は、ホストマシン１００のレジスタ「heax」が保持する値に基づいて、発生したアボートがページフォルトによるアボートであるか否かを判定する。
【０１２８】
図１５は、アボートに応じて、ホストマシン１００のレジスタ「heax」（レジスタeax）にセットされる値を説明する図である。図１５の表１５０に示すように、レジスタ「heax」は、６ビットの情報を有する。レジスタ「heax」の初期値は値「０」である。ＴＳＸは、アボートの発生に応答して、レジスタ「heax」にアボートの原因を示す値をセットする。
【０１２９】
レジスタ「heax」の０ビット目は、アボートした場合に値「１」を有する。レジスタ「heax」の１ビット目は、リトライした場合に、命令列の実行が中断することなく実行完了する可能性がある場合に値「１」を有する。
【０１３０】
レジスタ「heax」の２ビット目は、命令列がクセスするメモリに、別のＣＰＵ（本実施の形態ではなし）がアクセスしたことに起因してアボートが発生した場合に値「１」を有する。また、命令列の実行中に発生したページフォルトに基づいてアボートが発生した場合は、２ビット目の値に「１」を有する。
【０１３１】
レジスタ「heax」の３ビット目は、ＴＳＸの内部資源の不足に起因してアボートが発生した場合に値「１」を有する。レジスタ「heax」の４ビット目は、デバッグ機能に起因してアボートした場合に値「２」を有する。レジスタ「heax」の５ビット目は、ＴＳＸトランザクションのネストが所定の基準を超過した場合に値「１」を有する。
【０１３２】
図１５に示す表１５０によると、制御モジュール１４１は、レジスタ「heax」の０ビット目と２ビット目が値「１」であって、１ビット目が値「０」である場合に、ページフォルトに基づくアボートである旨、判定する（図１４のＳ４３のＹｅｓ）。
【０１３３】
一方、レジスタ「heax」の０ビット目と２ビット目が値「１」、１ビット目が値「０」である旨の条件に合致しない場合、制御モジュール１４１は、ページフォルトとは異なる要因に基づくアボートである旨、判定する（図１４のＳ４３のＮｏ）。例えば、レジスタ「heax」の０ビット〜２ビット目のすべてが値「１」である場合、制御モジュール１４１は、ページフォルトとは異な要因に基づくアボートである旨判定する。ページフォルトとは異な要因に基づくアボートは、例えば、ホストマシン１００にハードウェアのＩ/Ｏイベント等による割り込みが発生した場合等を示す。
【０１３４】
発生したアボートがページフォルトに基づくアボートである場合（Ｓ４３のＹｅｓ）、制御モジュール１４１は、図１２のフローチャート図に遷移して、命令列ｍｌの各命令（命令（１）〜命令（７））を、インタプリタ実行にしたがって再実行する（図１２のＳ３２）。一方、ページフォルトに基づくアボートではない場合（Ｓ４３のＮｏ）、制御モジュール１４１は、バイナリコードｈｂ−２を再実行する（Ｓ４１）。制御モジュール１４１は、コンディションコードｃｃの生成処理を最小限に抑えたバイナリコードｈｂ−２にしたがって、命令列を高速に再実行できる。
【０１３５】
図１６は、図１２のフローチャート図の工程Ｓ４０の処理の詳細を説明するフローチャート図である。図１２の工程Ｓ４０において、制御モジュール１４１は、分岐先の命令であって、分岐回数が閾値を上回る分岐先の命令を先頭とする命令列を動的バイナリ変換する。
【０１３６】
Ｓ５１：動的バイナリ変換モジュール１４３は、分岐回数が閾値を上回る分岐先の命令の命令アドレスを、動的バイナリ変換が対象とする変換範囲の開始点に設定する。
【０１３７】
Ｓ５２：動的バイナリ変換モジュール１４３は、命令アドレスが示す命令の次の命令が、変換範囲の終端となる命令であるか否かを判定する。具体的に、動的バイナリ変換モジュール１４３は、次の命令が、条件なしに分岐する無条件分岐命令であるか否かを判定する。
【０１３８】
Ｓ５３：変換範囲の終端となる命令ではない場合（Ｓ５２のＮｏ）、動的バイナリ変換モジュール１４３は、命令アドレスが示す命令の次の命令を、変換範囲に追加する。そして、動的バイナリ変換モジュール１４３は、命令アドレスをインクリメントし、工程Ｓ５２、工程Ｓ５３を再実行する。つまり、動的バイナリ変換モジュール１４３は、終端となる命令が検出されるまで、工程Ｓ５２、Ｓ５３の処理を繰り返す。
【０１３９】
Ｓ５４：一方、変換範囲の終端となる命令である場合（Ｓ５２のＹｅｓ）、動的バイナリ変換モジュール１４３は、変換範囲を確定する。つまり、動的バイナリ変換モジュール１４３は、命令アドレスが示す命令の次の命令を、変換範囲の終了点に設定する。
【０１４０】
Ｓ５５：動的バイナリ変換モジュール１４３は、変換範囲の命令列が、メモリアクセス命令を含むか否かを判定する。 
【０１４１】
Ｓ５６：メモリアクセス命令を含む場合（Ｓ５６のＹｅｓ）、ページフォルトが発生する可能性がある。したがって、動的バイナリ変換モジュール１４３は、変換範囲の命令列をホストマシン１００のバイナリコードに変換し、変換後のバイナリコードにＴＳＸ命令を付加する。動的バイナリ変換モジュール１４３は、変換して生成したホストマシン１００のバイナリコードをメモリ１０２（図２）に記憶する。
【０１４２】
動的バイナリ変換モジュール１４３は、変換範囲の命令列の命令のうち、分岐命令の前命令及び最後尾の命令を除いた、一部の命令の実行後のコンディションコードｃｃの生成命令を省略して、変換範囲の命令列をホストマシン１００のバイナリコードに変換する。換言すれば、動的バイナリ変換モジュール１４３は、変換範囲の命令列を、分岐命令の前命令及び最後尾の命令の実行後のコンディションコードｃｃの生成処理を有する、ホストマシン１００のバイナリコードに変換する。
【０１４３】
前述したとおり、分岐命令は、前命令の実行後のコンディションコードｃｃを使用する。また、最後尾の命令の後続に、分岐命令が実行される可能性がある。したがって、動的バイナリ変換モジュール１４３は、分岐命令の前命令及び最後尾の命令のコンディションコードｃｃの生成処理を省略しない。これにより、動的バイナリ変換モジュール１４３は、分岐命令の判定処理を適切にエミュレーション可能にする。
【０１４４】
そして、動的バイナリ変換モジュール１４３は、変換して生成したホストマシン１００のバイナリコードに、ＴＳＸに基づくトランザクションの開始及び終了を示す、ＸＢＥＧＩＮ命令及びＸＥＮＤ命令を付加する。
【０１４５】
Ｓ５７：一方、メモリアクセス命令を含んでいない場合（Ｓ５６のＮｏ）、動的バイナリ変換モジュール１４３は、変換範囲の命令列をホストマシン１００のバイナリコードに変換するが、ＴＳＸ命令を付加しない。動的バイナリ変換モジュール１４３は、変換して生成したホストマシン１００のバイナリコードをメモリ１０２（図２）に記憶する。
【０１４６】
工程Ｓ５６と同様にして、動的バイナリ変換モジュール１４３は、変換範囲の命令列内の一部の命令のコンディションコードｃｃの生成命令を省略して、変換範囲の命令列をホストマシン１００のバイナリコードに変換する。
【０１４７】
工程Ｓ５６、Ｓ５７に示すように、エミュレーションプログラム１３２は、メモリアクセス命令を有するバイナリコードにのみ、ＴＳＸ命令を付加する。これにより、ページフォルトが発生する可能性がある命令列を対象として、ページフォルトの発生時にインタプリタ実行に切り替えることが可能になる。一方、メモリアクセス命令を有しないバイナリコードの実行時にはページフォルトが発生しない。したがって、エミュレーションプログラム１３２は、メモリアクセス命令を有しないバイナリコードをＴＳＸの機能の対象外とする。
【０１４８】
このように、エミュレーションプログラム１３２は、命令列を、命令列内の一部の命令の、コンディションコードｃｃの生成処理（状態情報の生成命令）を省いた、ホストマシン１００のバイナリコードに変換する。そして、エミュレーションプログラム１３２は、インタプリタ実行にしたがって再実行する場合に、命令列が有する各命令に対応するホストマシン１００のバイナリコードを取得し実行するとともに、各命令のコンディションコードｃｃを生成する。
【０１４９】
これにより、エミュレーションプログラム１３２は、ページフォルトが発生しない場合については、一部の命令のコンディションコードｃｃの生成処理を省略したホストマシン１００のバイナリコードに基づいて、高速に、エミュレーション処理を実現できる。即ち、エミュレーションプログラム１３２は、コンディションコードｃｃの生成処理を最小限に抑えたバイナリコードに基づいて、エミュレーション処理の性能を向上できる。
【０１５０】
また、エミュレーションプログラム１３２は、ページフォルトが発生した場合については、ＴＳＸにしたがって簡易に命令列の実行前の状態に戻し、インタプリタ実行にしたがって、各命令について、実行するとともにコンディションコードｃｃを生成する。これにより、エミュレーションプログラム１３２は、ページフォルトが再発生する場合であっても、コンディションコードｃｃを最新の状態に更新でき、エミュレーション処理を適切に実行できる。
【０１５１】
次に、図１７、図１８にしたがって、図１６のフローチャート図にしたがって説明した、動的バイナリ変換モジュール１４３の処理の一例を説明する。
【０１５２】
図１７は、ループ処理を有するプログラムｐｒ１の一例を説明する図である。図１７は、プログラムｐｒ１の説明のために、バイナリコードではなく、Ｃ言語で記述されたプログラムｐｒ１を例示する。
【０１５３】
図１７は、関数ｂａｒ６１と、関数ｆｏｏ６２の記述を有する。関数ｂａｒ６１は、パラメータとして変数ｉを有する。関数ｂａｒ６１は、カウンタである変数counterを有する。そして、関数ｂａｒ６１は、変数counterの値と変数ｉの値とを乗算し、出力する関数である。また、関数ｆｏｏ６２は、パラメータとして変数ｍａｘを有する。関数ｆｏｏ６２は、変数ｍａｘが示す回数分、関数ｂａｒ６１を呼び出すとともに、関数ｂａｒ６１の出力値が負の値である場合に、関数ｆｏｏ６２を終了する。このように、プログラムｐｒ１によると、ｆｏｒ文命令、及び、関数ｂａｒへの分岐回数が多い。
【０１５４】
図１８は、図１７に示したプログラムｐｒ１に対応する、ターゲットマシンのバイナリコードｐｒ２（図２の１３３）の一例を示す図である。エミュレーションプログラム１３２は、図１８に示すバイナリコードｐｒ２を、ホストマシン１００のバイナリコードに変換しながら実行する。図１８に示すバイナリコードｐｒ２が有する命令のうち、下線を引いた命令は分岐命令を示す。また、アスタリスク（＊）を付加した命令は、メモリアクセス命令を示す。
【０１５５】
図１２のフローチャート図で説明したとおり、制御モジュール１４１は、下線を引いた分岐命令を実行すると、分岐命令の分岐先アドレスに対応する分岐回数（カウンタ）をインクリメントする（図１２のＳ３７）。そして、制御モジュール１４１は、インクリメントした分岐回数が、閾値を上回ったか否かを判定する（Ｓ３９）。
【０１５６】
図１８のバイナリコードｐｒ２の例によると、図１７のｆｏｒ文に対応するｊｌ命令ｊｐ２からｌｏｏｐセクションに分岐する分岐回数は、閾値を超える（図１２のＳ３９のＹｅｓ）。したがって、動的バイナリ変換モジュール１４３は、ｌｏｏｐセクションの初めの命令（ｓｕｂ命令）ｓｔ１を、動的バイナリ変換による変換範囲の開始点に設定する（図１６のＳ５１）。また、図１８のｊｍｐ命令ｅｄ１は、無条件分岐命令である（Ｓ５２のＹｅｓ）。したがって、動的バイナリ変換モジュール１４３は、ｌｏｏｐセクションのｓｕｂ命令ｓｔ１からｊｍｐ命令ｅｄ１までの命令列ｍｌ１１を、変換範囲として確定する（図１６のＳ５４）。
【０１５７】
命令列ｍｌ１１は、メモリアクセス命令（ｐｕｓｈ命令）を含む（図１６のＳ５５のＹｅｓ）。したがって、命令列ｍｌ１１の実行時にページフォルトが発生する可能性がある。したがって、動的バイナリ変換モジュール１４３は、命令列ｍｌ１１をホストマシン１００のバイナリコードに動的バイナリ変換し、命令ＸＢＥＧＩＮ及び命令ＸＥＮＤを付加する（Ｓ５６）。
【０１５８】
このとき、動的バイナリ変換モジュール１４３は、バイナリコードｐｒ２の命令列ｍｌ１１を、命令列ｍｌ１１が含む分岐命令の前命令及び最後尾の命令を除く、命令のコンディションコードｃｃの生成処理を省略した、ホストマシン１００のバイナリコードに変換する。即ち、動的バイナリ変換モジュール１４３は、分岐命令（ｃａｌｌ命令、ｊｓ命令、ｊｌ命令、ｊｍｐ命令）の前命令、及び、最後尾の命令（ｊｍｐ命令）を除く命令のコンディションコードｃｃの生成処理を省略した、バイナリコードを生成する。
【０１５９】
図１８に示すバイナリコードｐｒ２の例によると、図１７の関数ｂａｒの呼出しを示すｃａｌｌ命令ｊｐ１から、ｂａｒセクションに分岐する分岐回数は、閾値を超える（図１２のＳ３９のＹｅｓ）。したがって、動的バイナリ変換モジュール１４３は、ｂａｒセクションの初めの命令（ｐｕｓｈ命令）ｓｔ２を、動的バイナリ変換の対象となる変換範囲の開始点に設定する（図１６のＳ５１）。また、図１８のｒｅｔ命令ｅｄ２は、無条件分岐命令である（Ｓ５２のＹｅｓ）。したがって、動的バイナリ変換モジュール１４３は、ｂａｒセクションのｐｕｓｈ命令ｓｔ２から、ｒｅｔ命令ｅｄ２までの命令列ｍｌ１２を、変換範囲として確定する（図１６のＳ５４）。
【０１６０】
命令列ｍｌ１２は、メモリアクセス命令（ｐｕｓｈ命令、ｍｏｖ命令）を含む（図１６のＳ５５のＹｅｓ）。したがって、動的バイナリ変換モジュール１４３は、命令列ｍｌ１２をホストマシン１００のバイナリコードに動的バイナリ変換し、命令ＸＢＥＧＩＮ及び命令ＸＥＮＤを付加する（Ｓ５６）。このとき、動的バイナリ変換モジュール１４３は、最後尾の命令（ｒｅｔ命令）を除く命令のコンディションコードｃｃの生成処理を省略した、バイナリコードを生成する。
【０１６１】
なお、図１８の例では、動的バイナリ変換の対象とする一連の命令ｍｌ１１、ｍｌ１２がメモリアクセス命令を含む場合（図１６のＳ５５のＹｅｓ）を例示した。命令列がメモリアクセス命令を含んでいない場合（Ｓ５５のＮｏ）、動的バイナリ変換モジュール１４３は、変換後のホストマシン１００のバイナリコードに、命令ＸＢＥＧＩＮ、命令ＸＥＮＤを付加しない（Ｓ５７）。
【０１６２】
［他の実施の形態］
なお、上述した実施の形態において、エミュレーションプログラム１３２は、初め、インタプリタ実行にしたがって、ターゲットマシンのバイナリコード１３３を実行する場合を例示した。ただし、この例に限定されるものではない。エミュレーションプログラム１３２は、初めから、実行対象の命令を含む命令列を、順次、動的バイナリ変換しながら実行してもよい。
【０１６３】
なお、ＨＴＭ５０２は、並列プログラミングをサポートするための機構である。しかしながら、本実施の形態におけるエミュレーションプログラム１３２は、ＨＴＭ５０２の機能を利用するだけであって、エミュレーションプログラム１３２が並列プログラムに基づくプログラムである必要はない。
【０１６４】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１６５】
（付記１）
第１のマシンとは異なる第２のマシンの第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
処理を前記第１のマシンのコンピュータに実行させるエミュレーションプログラム。
【０１６６】
（付記２）
付記１において、
前記第４のバイナリコードの実行は、前記発動がページフォルトとは異なる要因による前記中断に基づくと判定した場合に、前記第３のバイナリコードを再実行する、
エミュレーションプログラム。
【０１６７】
（付記３）
付記１または２において、
前記変換は、実行頻度が所定値を超える命令列を検出し、検出した前記命令列を前記第１の命令列として、前記第１のマシンの第２のバイナリコードに変換する、
エミュレーションプログラム。
【０１６８】
（付記４）
付記１乃至３のいずれかにおいて、
前記変換は、前記第１の命令列内の一部の命令の、前記命令の実行結果の状態を示す状態情報の生成命令を省いた、前記第１のマシンの第２のバイナリコードに変換し、
前記第４のバイナリコードの実行は、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行するとともに、前記各命令の前記状態情報を生成する、
エミュレーションプログラム。
【０１６９】
（付記５）
付記４において、
前記一部の命令は、前記第１の命令列内の、分岐命令の前命令及び最後尾の命令以外の命令を示す、
エミュレーションプログラム。
【０１７０】
（付記６）
第１のマシンとは異なる第２のマシンの第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
前記第１のマシンの処理部によるエミュレーション方法。
【０１７１】
（付記７）
付記６において、
前記第４のバイナリコードの実行は、前記発動がページフォルトとは異なる要因による前記中断に基づくと判定した場合に、前記第３のバイナリコードを再実行する、
エミュレーション方法。
【０１７２】
（付記８）
付記６または７において、
前記変換は、実行頻度が所定値を超える命令列を検出し、検出した前記命令列を前記第１の命令列として、前記第１のマシンの第２のバイナリコードに変換する、
エミュレーション方法。
【０１７３】
（付記９）
付記６乃至８のいずれかにおいて、
前記変換は、前記第１の命令列内の一部の命令の、前記命令の実行結果の状態を示す状態情報の生成命令を省いた、前記第１のマシンの第２のバイナリコードに変換し、
前記第４のバイナリコードの実行は、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行するとともに、前記各命令の前記状態情報を生成する、
エミュレーション方法。
【０１７４】
（付記１０）
付記９において、
前記一部の命令は、前記第１の命令列内の、分岐命令の前命令及び最後尾の命令以外の命令を示す、
エミュレーション方法。
【０１７５】
（付記１１）
第１のマシンの処理部と、
前記第１のマシンとは異なる第２のマシンの第１のバイナリコードを記憶する記憶部とを有し、
前記第１のマシンの処理部は、
前記第１のバイナリコードを読み出し、前記第１のバイナリコードが有する第１の命令列を、前記第１のマシンの第２のバイナリコードに変換し、
前記第１のマシンが前記第１の命令列の実行の中断に応答してメモリの状態を前記第１の命令列の実行前の状態に戻す指示命令を、メモリにアクセスする命令を有する前記第２のバイナリコードの前後に付加して、前記第１のマシンの第３のバイナリコードを生成し、
生成した前記第３のバイナリコードを実行し、
前記指示命令の発動に基づいて前記メモリの状態が前記第１の命令列の実行前の状態に戻されたことに応答し、前記第１のマシンが有する第１の情報に基づいて前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１のバイナリコードを読み出して、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行する、
情報処理装置。
【０１７６】
（付記１２）
付記１１において、
前記第１のマシンの処理部は、前記発動がページフォルトとは異なる要因による前記中断に基づくと判定した場合に、前記第３のバイナリコードを再実行する、
情報処理装置。
【０１７７】
（付記１３）
付記１１または１２において、
前記第１のマシンの処理部は、実行頻度が所定値を超える命令列を検出し、検出した前記命令列を前記第１の命令列として、前記第１のマシンの第２のバイナリコードに変換する、
情報処理装置。
【０１７８】
（付記１４）
付記１１乃至１３のいずれかにおいて、
前記第１のマシンの処理部は、
前記第１の命令列内の一部の命令の、前記命令の実行結果の状態を示す状態情報の生成命令を省いた、前記第１のマシンの第２のバイナリコードに変換し、
前記発動がページフォルトによる前記中断に基づくと判定した場合に、前記第１の命令列が有する各命令に対応する前記第１のマシンの第４のバイナリコードを取得し実行するとともに、前記各命令の前記状態情報を生成する、
情報処理装置。
【０１７９】
（付記１５）
付記１４において、
前記一部の命令は、前記第１の命令列内の、分岐命令の前命令及び最後尾の命令以外の命令を示す、
情報処理装置。
【符号の説明】
【０１８０】
１００：ホストマシン、１０１：ＣＰＵ、１０２：メモリ、１０３：通信インタフェース部、１０４：ストレージ装置、１２０：ＲＡＭ、１２１：不揮発性メモリ、１３１：オペレーションシステム、１３２：エミュレーションプログラム、１３３：ターゲットマシンのバイナリコード、５０１：メモリ管理ユニット、５０２：ＨＴＭ
【図１】
2016207129.tif 000003
【図２】
2016207129.tif 000004
【図３】
2016207129.tif 000005
【図４】
2016207129.tif 000006
【図５】
2016207129.tif 000007
【図６】
2016207129.tif 000008
【図７】
2016207129.tif 000009
【図８】
2016207129.tif 000010
【図９】
2016207129.tif 000011
【図１０】
2016207129.tif 000012
【図１１】
2016207129.tif 000013
【図１２】
2016207129.tif 000014
【図１３】
2016207129.tif 000015
【図１４】
2016207129.tif 000016
【図１５】
2016207129.tif 000017
【図１６】
2016207129.tif 000018
【図１７】
2016207129.tif 000019
【図１８】
2016207129.tif 000020