(57)【特許請求の範囲】
【請求項１】
模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサが実行を模倣する第１のコードを前記模倣対象のプログラムから取得し、
前記模倣対象のプログラムに含まれるコードに対応する前記複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、前記コードの種別と、前記１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であるか否かを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、前記第１のコードがメモリをアクセスする種別であると判定した場合、前記対応情報を参照して、前記第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを前記複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する、
制御部を有することを特徴とする情報処理装置。
【請求項２】
前記制御部は、
前記第１のコードがメモリをアクセスする種別であると判定した場合、前記第１のコードに対応するネイティブコードによるメモリのアクセスと、前記複数のプロセッサのうちの前記いずれかのプロセッサ以外の他のプロセッサが前記模倣対象のプログラムに含まれる第２のコードに対応する遅延付きネイティブコード列によるメモリのアクセスとの競合を検出することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記対応情報は、不可分操作でないネイティブコードに対応するコードと、当該コードと同一の機能を有し不可分操作であるネイティブコードに対応するコードとの対応関係を記憶しており、
前記制御部は、
前記競合を検出した場合、前記対応情報を参照して、前記第２のコードを、前記第２のコードと同一の機能を有し不可分操作であるネイティブコードに対応するコードに変換することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサに、
前記いずれかのプロセッサが実行を模倣する第１のコードを前記模倣対象のプログラムから取得し、
前記模倣対象のプログラムに含まれるコードに対応する前記複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、前記コードの種別と、前記１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であるか否かを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、前記第１のコードがメモリをアクセスする種別であると判定した場合、前記対応情報を参照して、前記第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを前記複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する、
処理を実行させることを特徴とするエミュレータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、およびエミュレータプログラムに関する。
【背景技術】
【０００２】
従来、あるプロセッサの命令セットとは異なる命令セットを有する別のプロセッサの命令セットを用いて記述されたプログラムの実行を、あるプロセッサが模倣（エミュレーション）する技術がある。また、複数のプロセッサによって実行されるプログラムに対して、複数のプロセッサが共有してアクセス可能なメモリに対する排他制御が正しく行われているか否かをテストする技術がある。
【０００３】
関連する先行技術として、例えば、マルチプロセッサの一方のプロセッサ側の特定プログラムが動作中に、別の周期起動プログラムを起動し、前述の特定プログラムの動作終了後、周期起動プログラムを停止させる技術が開示されている。また、複数のプログラムが並行して実行可能なマルチプログラムシステムにおいて、複数の動作中のプログラムの命令実行遅延により、プログラムが共有するハードウェア資源の使用時間を長くする技術がある。また、マルチプロセッサシステムにおいてプログラムのプロセッサごとの中断点でプロセッサの全てがプログラムの実行を中断した条件で中断解除を指示し、プログラムの実行を同時に再開させて情報資源に対する排他制御をテストする技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平８−７７０３９号公報
【特許文献２】特開平３−１５８９３６号公報
【特許文献３】特開平５−２５００号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、模倣対象のプログラムの実行を模倣する複数のプロセッサのうち、あるプロセッサがメモリアクセスを行うコードの実行を模倣している間に発生するメモリに対する排他制御の不具合を検出することが困難である。具体的には、あるプロセッサがメモリアクセスを行うコードの実行を模倣する時間が短いほど、前述の時間内に他のプロセッサがメモリアクセスを行うコードの実行を模倣する可能性は小さくなり、メモリの排他制御の不具合を検出することが困難になる。
【０００６】
１つの側面では、本発明は、模倣対象のプログラムの実行を複数のプロセッサが模倣する際のメモリに対する排他制御の不具合を検出し易くする情報処理装置、およびエミュレータプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサが実行を模倣する第１のコードを模倣対象のプログラムから取得し、模倣対象のプログラムに含まれるコードに対応する複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、コードの種別と、１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、第１のコードがメモリをアクセスする種別であるか否かを判定し、第１のコードに対応する複数のネイティブコードが不可分操作でなく、第１のコードがメモリをアクセスする種別であると判定した場合、対応情報を参照して、第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する情報処理装置、およびエミュレータプログラムが提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、模倣対象のプログラムの実行を複数のプロセッサが模倣する際のメモリに対する排他制御の不具合を検出し易くすることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。
【図２】図２は、情報処理装置１０１のハードウェア構成例を示すブロック図である。
【図３】図３は、情報処理装置１０１の機能構成例を示すブロック図である。
【図４】図４は、対応情報１２１の記憶内容の一例を示す説明図である。
【図５】図５は、命令エミュレータによる固有の命令コード模倣の一例を示す説明図である。
【図６】図６は、遅延処理中情報３１２の記憶内容の一例を示す説明図である。
【図７】図７は、ログ情報３１３の一例を示す説明図である。
【図８】図８は、排他制御テスト処理手順の一例を示すフローチャートである。
【図９】図９は、命令フェッチ処理手順の一例を示すフローチャートである。
【図１０】図１０は、命令実行処理手順の一例を示すフローチャートである。
【図１１】図１１は、遅延処理中情報設定処理手順の一例を示すフローチャートである。
【図１２】図１２は、競合検出処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、開示の情報処理装置、およびエミュレータプログラムの実施の形態を詳細に説明する。
【００１１】
図１は、本実施の形態にかかる情報処理装置１０１の動作例を示す説明図である。情報処理装置１０１は、複数のプロセッサ１０２＃１〜＃ｎを有するコンピュータである。ここで、ｎは、２以上の自然数である。そして、情報処理装置１０１は、複数のプロセッサとは異なる命令セットを有する模倣対象のプロセッサの実行を複数のプロセッサが模倣することにより、模倣対象のプロセッサの命令セットを用いて記述された模倣対象のプログラム１１１の実行を模倣する。
【００１２】
ここで、模倣対象のプロセッサの命令セットに含まれる命令コードを、複数のプロセッサの各々のプロセッサが実行可能なネイティブコードに変換して実行するソフトウェアとして、命令エミュレータがある。各々のプロセッサは、命令エミュレータを実行することにより、模倣対象のプログラム１１１の実行を模倣する。以下の記載では、模倣対象のプロセッサの命令セットに含まれる命令コードであり、ネイティブコード以外の命令コードを、「固有の命令コード」と呼称する場合がある。または、ネイティブコード以外の命令コードを、単に、「コード」と呼称する場合がある。命令エミュレータを用いることにより、模倣対象のプログラム１１１を複数のプロセッサ用に改変することなく、模倣対象のプログラム１１１の実行結果を得ることができる。
【００１３】
また、複数のプロセッサで模倣対象のプログラムの実行を模倣する際に、メモリにアクセスする複数の操作によって、排他制御すべき箇所で排他制御されていないといった、排他制御の不具合が顕在化することがある。ここで、排他制御を実現する１つの方法として、メモリにアクセスする複数の操作を不可分操作（アトミック操作）とすることがある。ここで、不可分操作とは、複数の操作を行う際に、他者が複数の操作の間に割り込めない操作である。以下の説明では、不可分操作であるコードを、「アトミック性がある」コードと称する。また、不可分操作でないコードを、「アトミック性がない」コードと称する。
【００１４】
以下に、レジスタの値をメモリに書き込む操作を行うアトミック性なしの固有の命令コード１と、命令コード１の書き込み先のメモリから読み出す操作を行うアトミック性ありの固有の命令コード２とを用いて、排他制御の不具合が顕在化する一例を説明する。ここで、固有の命令コード１は、模倣対象のプロセッサの１つのレジスタが２つのネイティブのレジスタで模倣されており、複数のネイティブコードとして、１つ目のネイティブのレジスタの値をメモリに書き込むネイティブコードと、２つ目のネイティブのレジスタの値をメモリに書き込むネイティブコードとに変換されるとする。
【００１５】
排他制御の不具合が顕在化する一例としては、複数のプロセッサのあるプロセッサが命令コード１の実行を模倣する間に、他のプロセッサが命令コード２の実行を模倣する場合である。より詳細には、あるプロセッサが１つ目のネイティブのレジスタの値を書き込んだ後に、他のプロセッサが命令コード２を変換したネイティブコードを実行し、この後、あるプロセッサが２つ目のネイティブのレジスタの値を書き込んだ場合である。この場合、命令コード２の読み出し結果は、１つ目のネイティブのレジスタの値が書き込まれたデータと、２つ目のネイティブのレジスタの値の書き込みが行われていないデータとなり、命令コード１による書き込み前後のメモリのデータが混在するという不具合が発生する。
【００１６】
また、レジスタの値をメモリに書き込む操作を行うアトミック性ありの固有の命令コード３と、命令コード３の書き込み先のメモリから読み出す操作を行うアトミック性なしの固有の命令コード４とを用いて、排他制御の不具合が顕在化する他の例を説明する。ここで、固有の命令コード４は、模倣対象のプロセッサの１つのレジスタが２つのネイティブのレジスタで模倣されており、複数のネイティブコードとして、１つ目のネイティブのレジスタの値をメモリから読み出すネイティブコードと、２つ目のネイティブのレジスタの値をメモリから読み出すネイティブコードとに変換されるとする。
【００１７】
排他制御の不具合が顕在化する他の例としては、複数のプロセッサのあるプロセッサが命令コード４の実行を模倣する間に、他のプロセッサが命令コード３の実行を模倣する場合である。より詳細には、あるプロセッサが１つ目のネイティブのレジスタの値をメモリから読み出した後に、他のプロセッサが命令コード３を変換したネイティブコードを実行し、あるプロセッサが２つ目のネイティブのレジスタの値をメモリから読み出した場合である。この場合、命令コード４の読み出し結果は、１つ目のネイティブのレジスタの値が書き込み前のデータと、２つ目のネイティブのレジスタの値が書き込み後のデータとなり、命令コード３による書き込み前後のメモリのデータが混在するという不具合が発生する。
【００１８】
このように、固有の命令コードの模倣により、メモリをアクセスする操作を行う命令コードのアトミック性がないと、メモリの内容が模倣対象のプロセッサでは存在しなかった値となるタイミングが発生し、排他制御の不具合が顕在化する要因となる。そして、メモリ操作の排他制御の顕在化は、あるプロセッサでメモリのデータを操作中という短い時間、例えば、ナノ秒単位に、他のプロセッサで同一メモリのデータを操作するという、プロセッサ相互の走行タイミングに依存する。このため、一般的なテスト方法では、発生は稀であり、例えば１〜数年に１回の頻度のため、本状況を短期間に発生させることが困難である。
【００１９】
ここで、例えば、模倣対象のプログラム１１１の全命令コードまたは指定範囲の命令コードに対して１命令コードごとに割込型の遅延を起こすことにより、共用データの更新時間を長くし、同一メモリ領域の競合関係の確率を高めることが考えられる。しかしながら、この場合、１命令コードごとに遅延を起こすため、あるプロセッサが模倣対象のプログラム１１１に含まれるメモリアクセスを行うコードの実行を模倣する時間を長くすることにはならない。
【００２０】
そこで、本実施の形態にかかる情報処理装置１０１は、模倣対象となる固有の命令コードがメモリ操作するものであり、アトミック性がない複数のネイティブコードに対応するなら、ネイティブコードの間に遅延処理を含めたネイティブコード列を生成する。遅延処理を含めたネイティブコード列を実行することにより、あるプロセッサ１０２が遅延処理を実行中に、別のプロセッサのメモリ操作が増えるため、排他制御の不具合を検出し易くなる。
【００２１】
図１を用いて、情報処理装置１０１の動作を示す。図１の例では、情報処理装置１０１に含まれるプロセッサ１０２＃１〜＃ｎは、それぞれの命令エミュレータによって、模倣対象のプログラム１１１の実行を模倣する。具体的には、プロセッサ１０２＃１は、模倣対象のプログラム１１１のうちのコード群１１２＃１の実行を模倣しており、プロセッサ１０２＃ｎは、模倣対象のプログラム１１１のうちのコード群１１２＃ｎの実行を模倣する。ここで、プロセッサ１０２＃１〜＃ｎのうちのいずれかのプロセッサ１０２として、プロセッサ１０２＃１は、模倣対象のプログラム１１１から第１のコードとして、コード１１３を取得する。ここで、コード１１３を取得する契機としては、例えば、コード１１３がこれから実行を模倣する対象となった場合である。または、プロセッサ１０２＃１に、コード群１１２＃１の実行を模倣すると決定した際に、プロセッサ１０２＃１は、コード群１１２＃１の全てを取得してもよい。
【００２２】
次に、プロセッサ１０２＃１は、対応情報１２１を参照して、取得したコード１１３に対応する複数のネイティブコードがアトミック性がなく、かつ、コード１１３がメモリにアクセスする種別であるか否かを判定する。ここで、対応情報１２１は、模倣対象のプログラム１１１に含まれるコードに対応する１または複数のネイティブコードと、コードの種別と、１または複数のネイティブコードが不可分操作か否かを示す情報を対応付けた情報である。より具体的な対応情報１２１の記憶内容については、図４で説明する。
【００２３】
ここで、説明の簡略化のため、以下の説明および図面において、「アルファベット１文字＋数字１文字」で表したコードは、固有の命令コードであるとする。また、「ギリシャ文字１文字＋数字１文字」で表したコードは、ネイティブコードであるとする。図１に示す対応情報１２１は、固有の命令コードＹ１が、ネイティブコードΨ１、Ψ２に対応しており、Ｙ１の種別がメモリアクセスを行うことを示す「メモリ操作」であり、Ψ１、Ψ２がアトミック性なしであることを示す。Ψ１、Ψ２は、アトミック性なしであるから、Ψ１とΨ２との間に、プロセッサ１０２＃１以外のプロセッサによる他のネイティブコードが割り込むことを許容することになる。
【００２４】
ここで、固有の命令コードに対応し、アトミック性がないネイティブコードは複数のネイティブコードとなるため、プロセッサ１０２＃１は、取得したコード１１３が複数のネイティブコードに対応するか否かを判定せず、アトミック性の有無だけを判定すればよい。なお、固有の命令コードに対応し、アトミック性があるネイティブコードは、１つのネイティブコードである場合もあるし、複数のネイティブコードである場合もある。
【００２５】
そして、プロセッサ１０２＃１は、コード１１３が対応する複数のネイティブコードがアトミック性がなく、かつ、コード１１３がメモリにアクセスする種別であると判定すると、コード１１３に対応する遅延付きネイティブコード列１１４を生成する。
【００２６】
ここで、遅延付きネイティブコード列１１４は、固有の命令コードに対応する複数のネイティブコードの実行完了を遅延させるコードを複数のネイティブコードのうちの２つのネイティブコードの間に挿入したネイティブコード列である。以下、複数のネイティブコードの実行完了を遅延させるコードは、１つのネイティブコードでもよいし、複数のネイティブコードでもよい。以下、複数のネイティブコードの実行完了を遅延させるコードを、「遅延処理コード列」と呼称する。
【００２７】
遅延処理コード列は、テスト時に情報処理装置１０１の操作者から指定された遅延時間に従って遅延処理を行うコードである。例えば、遅延処理を行うコードとしては、クロックカウンタが指定された値となるまで繰り返し確認するコード等が挙げられる。また、遅延時間の例としては、模倣対象のプログラム１１１がメモリアクセスだけであり、１ネイティブコードの実行時間が１ナノ秒であり、模倣対象のプログラム１１１の規模が１０００ステップであったとする。この場合、例えば、操作者の指示に従って、情報処理装置１０１は、３マイクロ秒程度の遅延時間を指定する。また、模倣対象のプログラム１１１が外部記憶装置への入出力処理を含み、入出力処理にかかる時間が１ミリ秒であったとする。この場合、例えば、操作者の指示に従って、情報処理装置１０１は、３ミリ秒程度の遅延時間を指定する。
【００２８】
遅延付きネイティブコード列１１４の一例として、固有の命令コードに対応する複数のネイティブコードが、３つのネイティブコードであるとする。この場合、遅延付きネイティブコード列１１４を生成するプロセッサ１０２は、３つのネイティブコードのうちの１つ目と２つ目との間に遅延処理コード列を挿入してもよいし、２つ目と３つ目の間に遅延処理コード列を挿入してもよい。また、遅延付きネイティブコード列１１４を生成するプロセッサ１０２は、３つのネイティブコードのうち、１つ目と２つ目との間、２つ目と３つ目との間それぞれに、遅延処理コード列を挿入してもよい。
【００２９】
また、情報処理装置１０１が、対応情報１２１に、固有の命令コードに対応付けて遅延付きネイティブコード列１１４を記憶しておく。そして、遅延付きネイティブコード列１１４を生成するプロセッサ１０２が、対応情報１２１から、取得した固有の命令コードに対応する遅延付きネイティブコード列１１４を取得することをもって、遅延付きネイティブコード列１１４を生成したとしてもよい。
【００３０】
図１の例では、プロセッサ１０２＃１は、遅延付きネイティブコード列１１４として、Ψ１、遅延処理コード列、Ψ２を生成する。そして、プロセッサ１０２＃１は、遅延付きネイティブコード列１１４を実行する。遅延付きネイティブコード列１１４を実行することにより、プロセッサ１０２＃１が、取得したコード１１３の実行を模倣する時間が長くなるため、他のプロセッサ１０２の模倣によるメモリに対する排他制御の不具合が発生し易くなる。次に、情報処理装置１０１のハードウェア構成例を、図２を用いて説明する。
【００３１】
（情報処理装置１０１のハードウェア構成例）
図２は、情報処理装置１０１のハードウェア構成例を示すブロック図である。情報処理装置１０１は、プロセッサ１０２＃１〜＃ｎと、ＲＯＭ（Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０１と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０２と、を含む。また、情報処理装置１０１は、ディスクドライブ２０３およびディスク２０４と、通信インターフェース２０５と、入出力装置２０６とを含む。また、プロセッサ１０２〜ディスクドライブ２０３、通信インターフェース２０５、入出力装置２０６はバス２０７によってそれぞれ接続される。
【００３２】
情報処理装置１０１は、複数のプロセッサ１０２＃１〜＃ｎを有するため、マルチプロセッサシステムであるともいえる。また、情報処理装置１０１は、マルチコアプロセッサを有するシステムでもよい。ここで、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。そして、情報処理装置１０１は、例えば、サーバでもよいし、パーソナル・コンピュータでもよいし、携帯端末でもよい。
【００３３】
プロセッサ１０２＃１〜＃ｎは、情報処理装置１０１の全体の制御を司る演算処理装置である。ＲＯＭ２０１は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ２０２は、プロセッサ１０２＃１〜＃ｎのワークエリアとして使用される揮発性メモリである。
【００３４】
ディスクドライブ２０３は、プロセッサ１０２の制御に従ってディスク２０４に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ２０３には、例えば、磁気ディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク２０４は、ディスクドライブ２０３の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ２０３が磁気ディスクドライブである場合、ディスク２０４には、磁気ディスクを採用することができる。また、ディスクドライブ２０３が光ディスクドライブである場合、ディスク２０４には、光ディスクを採用することができる。また、ディスクドライブ２０３がソリッドステートドライブである場合、ディスク２０４には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００３５】
通信インターフェース２０５は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース２０５は、通信回線を通じてネットワークを介して他の装置に接続される。通信インターフェース２０５には、例えば、モデムやＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）アダプタなどを採用することができる。
【００３６】
入出力装置２０６は、データの入出力を行う装置である。例えば、入出力装置２０６は、キーボード、タッチパネル、ディスプレイ等である。入出力装置２０６は、情報処理装置１０１を操作する操作者からの指示の入力、処理結果の表示などに用いられる。
【００３７】
（情報処理装置１０１の機能構成例）
図３は、情報処理装置１０１の機能構成例を示すブロック図である。情報処理装置１０１に含まれるプロセッサ１０２＃１〜＃ｎは、それぞれ、制御部３００＃１〜＃ｎを有する。そして、制御部３００＃１〜＃ｎは、それぞれ、命令エミュレータ＃１〜＃ｎを有する。そして、命令エミュレータ＃１〜＃ｎは、取得部３０１と、判定部３０２と、生成部３０３と、実行部３０４と、検出部３０５と、変換部３０６とを有する。制御部３００＃１〜＃ｎは、それぞれ、記憶装置に記憶された命令エミュレータのプログラムとなるエミュレータプログラムをプロセッサ１０２＃１〜＃ｎが実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図２に示したＲＯＭ２０１、ＲＡＭ２０２、ディスク２０４などである。また、各部の処理結果は、プロセッサ１０２＃１〜＃ｎのレジスタや、プロセッサ１０２＃１〜＃ｎのキャッシュメモリ等に格納される。
【００３８】
また、プロセッサ１０２＃１〜＃ｎは、記憶部３１１にアクセス可能である。記憶部３１１は、例えば、具体的には、ＲＡＭ２０２の記憶領域の一部である。そして、記憶部３１１は、対応情報１２１と、遅延処理中情報３１２と、ログ情報３１３とを含む。
【００３９】
対応情報１２１は、固有の命令コードと、固有の命令コードを変換したネイティブコードとを対応付けた情報である。対応情報１２１は、さらに、不可分操作でないネイティブコードに対応するコードと、前述のコードと同一の機能を有し不可分操作であるネイティブコードに対応するコードとの対応関係を記憶してもよい。対応関係として、対応情報１２１は、同一の機能を有し不可分操作であるネイティブコードに対応するコードそのものを記憶してもよいし、対応するコードを記憶する記憶領域のポインタを記憶してもよい。対応情報１２１の記憶内容の一例を、図４に示す。
【００４０】
遅延処理中情報３１２は、遅延付きネイティブコード列１１４を実行するプロセッサ１０２に関する情報を記憶する。遅延処理中情報３１２の記憶内容の一例を、図６に示す。ログ情報３１３は、競合を検出した命令エミュレータが出力する情報である。ログ情報３１３の記憶内容の一例を、図７に示す。
【００４１】
命令エミュレータ＃１〜＃ｎは、起動される段階で、プロセッサ１０２と１対１に対応する。ただし、プロセッサ１０２がマルチコアプロセッサのように命令を並列に実行可能な回路を集積したものであれば、コア単位に対応付けられる。なお、カーネルを含むＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）のプログラム群を命令エミュレータで実行する場合、命令エミュレータは、ファームウェアに位置付けられる。
【００４２】
取得部３０１は、プロセッサ１０２＃１〜＃ｎのうちのいずれかのプロセッサ１０２が実行を模倣する第１のコードを模倣対象のプログラム１１１から取得する。
【００４３】
判定部３０２は、対応情報１２１を参照して、取得部３０１が取得した第１のコードに対応する複数のネイティブコードがアトミック性なしであり、かつ、第１のコードがメモリをアクセスする種別であるか否かを判定する。また、判定部３０２は、プロセッサ１０２＃１〜＃ｎのうちのいずれかのプロセッサ１０２以外の他のプロセッサ１０２が、模倣対象のプログラム１１１に含まれる第２のコードに対応する遅延付きネイティブコード列１１４を実行していないかを判定してもよい。ここで、第２のコードは、第１のコードとは別のコードでもよいし、同一のコードでもよい。例えば、いずれかのプロセッサ１０２と他のプロセッサ１０２とが、模倣対象のプログラム１１１内の同一のサブルーチンを呼び出した場合、第１のコードと第２のコードが同一となる可能性がある。
【００４４】
ここで、第１のコードに対応する複数のネイティブコードがアトミック性なしであり、かつ、第１のコードがメモリをアクセスする種別であり、他のプロセッサ１０２が遅延付きネイティブコード列１１４を実行中でない条件を、条件Ａとする。また、第１のコードがメモリをアクセスする種別であり、他のプロセッサ１０２が遅延付きネイティブコード列を実行中である条件を、条件Ｂとする。そして、条件Ａ、条件Ｂ以外の条件を条件Ｃとする。
【００４５】
生成部３０３は、第１のコードに対応する複数のネイティブコードがアトミック性なしであり、第１のコードがメモリをアクセスする種別であると判定した場合、対応情報１２１を参照して、第１のコードに対応する遅延付きネイティブコード列１１４を生成する。
【００４６】
実行部３０４は、第１のコードに対応するネイティブコード、または生成部３０３が生成した第１のコードに対応する遅延付きネイティブコード列１１４を実行する。また、実行部３０４は、条件Ａが満たされたときに限り、第１のコードに対応する遅延付きネイティブコード列１１４を実行してもよい。さらに、生成部３０３は、条件Ａが満たされた場合、第１のコードに対応する遅延付きネイティブコード列１１４を生成し、条件Ａが満たされない場合、第１のコードに対応するネイティブコードを生成してもよい。
【００４７】
また、判定部３０２が第１のコードがメモリをアクセスする種別であると判定したとする。このとき、検出部３０５は、第１のコードに対応するネイティブコードによるメモリのアクセスと、他のプロセッサ１０２が第２のコードに対応する遅延付きネイティブコード列１１４によるメモリのアクセスとの競合を検出する。また、検出部３０５は、条件Ｂが満たされた場合に限り、第１のコードに対応するネイティブコードによるメモリのアクセスと、他のプロセッサ１０２が第２のコードに対応する遅延付きネイティブコード列１１４によるメモリのアクセスとの競合を検出してもよい。
【００４８】
変換部３０６は、検出部３０５が競合を検出した場合、対応情報１２１を参照して、第２のコードを、第２のコードと同一の機能を有し不可分操作であるネイティブコードに対応するコードに変換する。例えば、図１の例を用いると、対応情報１２１が、固有の命令コードＹ１と、Ｙ１と同一の機能を有し不可分操作であるネイティブコードに対応する固有の命令コードＺ１との対応関係を記憶しているとする。そして、第２のコードがＹ１であるとする。このとき、検出部３０５が競合を検出した場合、変換部３０６は、模倣対象のプログラム１１１内の第２のコードにあたるＹ１を、Ｚ１に変換する。
【００４９】
図４は、対応情報１２１の記憶内容の一例を示す説明図である。対応情報１２１は、固有の命令コードと、固有の命令コードを変換したネイティブコードとを対応付けた情報である。図４に示す対応情報１２１は、レコード４０１−１〜５を有する。
【００５０】
対応情報１２１は、固有の命令コードと、命令コード変換定義と、アトミック性ありの固有の命令コードというフィールドを含む。固有の命令コードフィールドは、命令コードと命令コードの種別というフィールドを有する。命令コードフィールドには、固有の命令コードが格納される。命令コードの種別フィールドには、固有の命令コードの種別を示す識別情報が格納される。具体的には、命令コードの種別フィールドには、固有の命令コードが演算を行うコードであることを示す「演算」識別子や、メモリにアクセスすることを示す「メモリ操作」識別子等が格納される。
【００５１】
命令コード変換定義フィールドは、ネイティブコードと、アトミック性有無と、遅延付きネイティブコード列というフィールドを有する。ネイティブコードフィールドには、固有の命令コードに対応するネイティブコードが格納される。固有の命令コードに対応するネイティブコードは、１つの場合もあるし、複数の場合もある。固有の命令コードに対応するネイティブコードが複数である場合、プロセッサ１０２は、複数のネイティブコードをネイティブコードフィールドが示す順にネイティブコードを実行する。
【００５２】
アトミック性有無フィールドには、ネイティブコードのアトミック性の有無を示す識別情報が格納される。具体的には、アトミック性有無フィールドには、アトミック性ありを示す「あり」識別子や、アトミック性なしを示す「なし」識別子等が格納される。遅延付きネイティブコード列フィールドには、固有の命令コードに対応する遅延付きネイティブコード列が格納される。
【００５３】
アトミック性ありの固有の命令コードフィールドには、不可分であるネイティブコードに対応しており命令コードフィールドに格納された固有コードと同一の機能を有する命令コードが格納される。
【００５４】
例えば、レコード４０１−４は、固有の命令コードが「Ｙ１」であり、命令コードの種別が「メモリ操作」であることを示す。さらに、レコード４０１−４は、「Ｙ１」に対応するネイティブコードが「Ψ１、Ψ２」であり、アトミック性がなしであり、遅延付きネイティブコード列が、「Ψ１、遅延処理コード列、Ψ２」であることを示す。さらに、レコード４０１−４は、「Ｙ１」に対応する、アトミック性ありの固有の命令コードが「Ｚ１」であることを示す。
【００５５】
また、レコード４０１−５は、固有の命令コードが「Ｚ１」であり、命令コードの種別が「メモリ操作」であることを示す。さらに、レコード４０１−５は、「Ｚ１」に対応するネイティブコードが「プロセッサ間排他獲得コード列、Ψ１、Ψ２、プロセッサ間排他解放コード列」であり、アトミック性があることを示す。
【００５６】
次に、図５〜図７を用いて、命令エミュレータによる模倣対象のプログラム１１１の排他制御のテストの実行方法について説明する。
【００５７】
図５は、命令エミュレータによる固有の命令コード模倣の一例を示す説明図である。また、図６は、遅延処理中情報３１２の記憶内容の一例を示す説明図である。図５に示す表５０１は、時刻ｔ１〜ｔ１１における命令エミュレータ＃１〜＃ｎが固有の命令コードを実行した結果を示す表である。ここで、表５０１は、対応情報１２１の各レコードから、実行を模倣した固有の命令コードの種別と、アトミック性有無とを抽出した情報を表示する。さらに、表５０１は、実行を模倣した固有の命令コードの解釈結果を表示する。時刻ｔ１、ｔ２において、遅延処理実行中の命令エミュレータがなく、命令コードの種別がメモリ操作で、かつ、アトミック性ありなので、命令エミュレータ＃１〜＃ｎが模倣する固有の命令コードは条件Ｃに合致する。従って、命令エミュレータ＃１〜＃ｎは、命令コードを変換したネイティブコードを即時に実行する。
【００５８】
ここで、遅延処理中情報３１２について説明する。図６では、時刻ｔ２、ｔ３、ｔ７、ｔ９における遅延処理中情報３１２の記憶内容を示す。以下、各時刻における遅延処理中情報３１２を、遅延処理中情報３１２＿ｔｘとして示す。ｘは自然数である。
【００５９】
遅延処理中情報３１２は、実行有無と、遅延命令エミュレータ番号と、メモリアドレス情報と、メモリ操作種別というフィールドを含む。実行有無フィールドには、遅延付きネイティブコード列を実行中の命令エミュレータがあるか否かを示す識別情報が格納される。具体的には、実行有無フィールドには、遅延付きネイティブコード列を実行中の命令エミュレータがあることを示す「あり」識別子か、遅延付きネイティブコード列を実行中の命令エミュレータがないことを示す「なし」識別子かのいずれかが格納される。
【００６０】
遅延命令エミュレータ番号フィールドには、遅延付きネイティブコード列を実行中の命令エミュレータの番号が格納される。メモリアドレス情報フィールドには、命令コードの種別が「メモリ操作」である場合に、アクセス操作されるメモリアドレスの範囲が格納される。メモリ操作種別フィールドには、命令コードの種別が「メモリ操作」である場合に、メモリ操作の種別が格納される。具体的には、メモリ操作種別フィールドには、メモリアクセス操作の種別として、メモリへ書き込む操作である「書き込み」識別子か、メモリから読み出す操作である「読み出し」識別子かのいずれかが格納される。
【００６１】
遅延処理中情報３１２の記憶内容として、例えば、図６に示す遅延処理中情報３１２＿ｔ２が示すように、時刻ｔ２では、遅延付きネイティブコード列を実行中の命令エミュレータがない。
【００６２】
時刻ｔ３において、命令エミュレータ＃１が実行を模倣する命令コードは、遅延付きネイティブコード列を実行中の命令エミュレータがない状態であり、命令コードの種別がメモリ操作で、かつ、アトミック性なしなので、条件Ａに合致する。従って、命令エミュレータ＃１は、遅延処理中情報３１２を更新した後、時刻ｔ６まで遅延付きネイティブコード列を実行する。具体的な更新内容として、図６に示す遅延処理中情報３１２＿ｔ３が示すように、時刻ｔ３では、遅延付きネイティブコード列を実行中の命令エミュレータは、命令エミュレータ＃１である。
【００６３】
そして、命令エミュレータ＃１で遅延処理が実行されている時刻ｔ４、ｔ５において、命令エミュレータ＃１以外の他の命令エミュレータの模倣対象となる命令コードは、命令コードの種別がメモリ操作の時、条件Ｂに合致する。この場合、他の命令エミュレータは、遅延処理中情報３１２を用いたメモリ操作の競合確認を行い、競合しないときはログ情報の出力や命令コードの変換もなく、命令コードに対応するネイティブコードを即時に実行する。
【００６４】
時刻ｔ７において、命令エミュレータ＃ｎが実行を模倣する命令コードは、遅延付きネイティブコード列を実行中の命令エミュレータがない状態であり、命令コードの種別がメモリ操作で、かつ、アトミック性なしなので、条件Ａに合致する。従って、命令エミュレータ＃ｎは、遅延処理中情報３１２を更新した後、時刻ｔ８まで遅延付きネイティブコード列を実行する。図６に示す遅延処理中情報３１２＿ｔ７が示すように、時刻ｔ７では、遅延付きネイティブコード列を実行中の命令エミュレータは、命令エミュレータ＃ｎである。
【００６５】
時刻ｔ９において、命令エミュレータ＃２が実行を模倣する命令コードは、遅延付きネイティブコード列を実行中の命令エミュレータがない状態であり、命令コードの種別がメモリ操作で、かつ、アトミック性なしなので、条件Ａに合致する。従って、命令エミュレータ＃２は、遅延処理中情報３１２を更新した後、時刻ｔ１１まで遅延付きネイティブコード列を実行する。図６に示す遅延処理中情報３１２＿ｔ９が示すように、時刻ｔ９では、遅延付きネイティブコード列を実行中の命令エミュレータは、命令エミュレータ＃２であり、メモリ操作種別が書き込みである。
【００６６】
時刻ｔ１０において、命令エミュレータ＃ｎがメモリアクセスの競合を検出した場合、命令エミュレータ＃ｎは、遅延付きネイティブコード列を実行中の命令エミュレータ＃２と命令エミュレータ＃ｎの情報をログ情報３１３に出力する。具体的な出力例については、図７で説明する。そして、命令エミュレータ＃ｎは、模倣対象のプログラム１１１中にある遅延付きネイティブコード列に対応する固有の命令コードを、アトミック性ありの同一の機能の固有の命令コードに変換する。そして、命令エミュレータ＃ｎは、固有の命令コードに対応するネイティブコードを即時に実行する。
【００６７】
図７は、ログ情報３１３の一例を示す説明図である。ログ情報３１３は、競合を検出した命令エミュレータが出力する情報である。図７に示すログ情報３１３は、レコード７０１−１、２を有する。ここで、レコード７０１−１は、時刻ｔ１０において命令エミュレータ＃ｎが出力した情報に相当する。
【００６８】
ログ情報３１３は、競合検出時刻と、遅延処理中の命令エミュレータ情報と、競合を検出した命令エミュレータ情報というフィールドを有する。競合検出時刻は、競合を検出した時刻を示す。遅延処理中の命令エミュレータ情報フィールドと、競合を検出した命令エミュレータ情報フィールドとは、それぞれ、命令エミュレータ番号と、固有の命令コードのアドレスというフィールドを有する。
【００６９】
遅延処理中の命令エミュレータ情報フィールドにおける命令エミュレータ番号フィールドには、遅延付きネイティブコード列実行中の命令エミュレータの番号が格納される。遅延処理中の命令エミュレータ情報フィールドにおける固有の命令コードのアドレスフィールドには、遅延処理中の命令エミュレータが模倣中である固有の命令コードのアドレスが格納される。競合を検出した命令エミュレータは、このアドレスに格納された固有の命令コードを、アトミック性ありの同一の機能の固有の命令コードに変換する。
【００７０】
競合を検出した命令エミュレータ情報フィールドにおける命令エミュレータ番号フィールドには、競合を検出した命令エミュレータの番号が格納される。競合を検出した命令エミュレータ情報フィールドにおける固有の命令コードのアドレスフィールドには、競合を検出した命令エミュレータが模倣中である固有の命令コードのアドレスが格納される。
【００７１】
例えば、レコード７０１−１は、命令エミュレータ＃２が実行を模倣中のアドレス０ｘ０００ＡＢＣＤＥの命令コードと、命令エミュレータ＃ｎが実行を模倣中のアドレス０ｘ０００ＡＢＣ０Ｃの命令コードとが競合したことを示す。
【００７２】
次に、命令エミュレータ＃１〜＃ｎそれぞれが実行する処理を、図８〜図１２を用いて説明する。また、以下では、説明の簡略化のため、実行主体が命令エミュレータ＃１であるとして説明を行う。
【００７３】
図８は、排他制御テスト処理手順の一例を示すフローチャートである。排他制御テスト処理は、模倣対象のプログラム１１１の排他制御をテストする処理である。
【００７４】
命令エミュレータ＃１は、ディスク２０４から記憶部３１１に対応情報を読み出す（ステップＳ８０１）。ここで、ステップＳ８０１の処理は、命令エミュレータ＃１〜＃ｎのいずれかが行う。そして、命令エミュレータ＃１は、命令フェッチ処理を実行する（ステップＳ８０２）。次に、命令エミュレータ＃１は、命令実行処理を実行する（ステップＳ８０３）。そして、命令エミュレータ＃１は、情報処理装置１０１の停止などによる停止要求があったか否かを判断する（ステップＳ８０４）。ここで、情報処理装置１０１は、操作者からの起動と停止指示に応じて、命令エミュレータ＃１〜＃ｎを起動させる、または停止させてもよい。
【００７５】
停止要求がない場合（ステップＳ８０４：Ｎｏ）、命令エミュレータ＃１は、ステップＳ８０２の処理に移行する。一方、停止要求があった場合（ステップＳ８０４：Ｙｅｓ）、命令エミュレータ＃１は、排他制御テスト処理を終了する。排他制御テスト処理を実行することにより、命令エミュレータ＃１は、模倣対象のプログラム１１１の排他制御をテストすることができる。
【００７６】
図９は、命令フェッチ処理手順の一例を示すフローチャートである。命令フェッチ処理は、模倣対象プログラムから命令コードをフェッチする処理である。
【００７７】
命令エミュレータ＃１〜＃ｎがアクセス可能なＲＡＭ２０２上にある記憶部３１１の排他制御のため、命令エミュレータ＃１は、記憶部３１１のロックを獲得する（ステップＳ９０１）。次に、命令エミュレータ＃１は、模倣対象の固有の命令コードを取得する（ステップＳ９０２）。そして、命令エミュレータ＃１は、テスト時に外部から指定されたテスト対象プログラムのアドレスの範囲をもとに、固有の命令コードがテスト対象か否かを判断する（ステップＳ９０３）。テスト対象か否かの判定に用いるテスト対象のプログラムのアドレスの範囲として、例えば、操作者は、ＯＳのカーネルを形成するプログラムをテスト対象とする場合、カーネル形成時に作成されるアドレスマップから求めた値をテスト時に指定する。
【００７８】
固有の命令コードがテスト対象である場合（ステップＳ９０３：Ｙｅｓ）、命令エミュレータ＃１は、対応情報１２１を参照して、固有の命令コードの種別がメモリ操作か否かを判断する（ステップＳ９０４）。固有の命令コードの種別がメモリ操作である場合（ステップＳ９０４：Ｙｅｓ）、命令エミュレータ＃１は、遅延処理中情報３１２を参照して、遅延付きネイティブコード列を実行中の命令エミュレータの有無を判断する（ステップＳ９０５）。遅延付きネイティブコード列を実行中の命令エミュレータがある場合（ステップＳ９０５：あり）、命令エミュレータ＃１は、競合検出処理を実行する（ステップＳ９０６）。ここで、ステップＳ９０５：ありとなる場合、条件Ｂが満たされたことになる。
【００７９】
一方、遅延付きネイティブコード列を実行中の命令エミュレータがない場合（ステップＳ９０５：なし）、固有の命令コードのアトミック性有無を判断する（ステップＳ９０７）。アトミック性なしの場合（ステップＳ９０７：なし）、命令エミュレータ＃１は、遅延処理中情報設定処理を実行する（ステップＳ９０８）。ここで、ステップＳ９０７：なしとなる場合、条件Ａが満たされたことになる。そして、命令エミュレータ＃１は、固有の命令コードに対応する遅延付きネイティブコード列を生成する（ステップＳ９０９）。次に、命令エミュレータ＃１は、変換した遅延付きネイティブコード列を解釈結果として出力する（ステップＳ９１０）。
【００８０】
ステップＳ９０６の処理終了後、または固有の命令コードがテスト対象でない場合（ステップＳ９０３：Ｎｏ）、または固有の命令コードの種別がメモリ操作でない場合（ステップＳ９０４：Ｎｏ）、またはアトミック性ありの場合（ステップＳ９０７：あり）、命令エミュレータ＃１は、固有の命令コードに対応するネイティブコードを生成する（ステップＳ９１１）。そして、命令エミュレータ＃１は、変換したネイティブコードを解釈結果として出力する（ステップＳ９１２）。
【００８１】
ステップＳ９１０、または、ステップＳ９１２の処理終了後、命令エミュレータ＃１は、記憶部３１１のロックを解放する（ステップＳ９１３）。ステップＳ９１３の処理終了後、命令エミュレータ＃１は、命令フェッチ処理を終了する。命令フェッチ処理を実行することにより、命令エミュレータ＃１は、模倣対象のプログラム１１１から命令コードをフェッチすることができる。
【００８２】
図１０は、命令実行処理手順の一例を示すフローチャートである。命令実行処理は、命令コードに対応するネイティブコードを実行する処理である。
【００８３】
命令エミュレータ＃１は、固有の命令コードの解釈結果となるネイティブコードを実行する（ステップＳ１００１）。次に、命令エミュレータ＃１は、記憶部３１１のロックを獲得する（ステップＳ１００２）。そして、命令エミュレータ＃１は、遅延処理中情報３１２を参照して、遅延付きネイティブコード列を実行中の命令エミュレータの有無を判断する（ステップＳ１００３）。
【００８４】
遅延付きネイティブコード列を実行中の命令エミュレータがある場合（ステップＳ１００３：あり）、命令エミュレータ＃１は、遅延処理中情報３１２を参照して、遅延命令エミュレータ番号が自命令エミュレータを示すか否かを判断する（ステップＳ１００４）。遅延命令エミュレータ番号が自命令エミュレータを示す場合（ステップＳ１００４：Ｙｅｓ）、命令エミュレータ＃１は、遅延処理中情報３１２の実行有無フィールドに「なし」を設定する（ステップＳ１００５）。
【００８５】
ステップＳ１００５の処理終了後、または、遅延付きネイティブコード列を実行中の命令エミュレータがない場合（ステップＳ１００３：なし）、または、遅延命令エミュレータ番号が自命令エミュレータを示さない場合（ステップＳ１００４：Ｎｏ）、命令エミュレータ＃１は、記憶部３１１のロックを解放する（ステップＳ１００６）。そして、命令エミュレータ＃１は、模倣対象のプログラム１１１から次に読み込まれる固有の命令コードのアドレスを更新する（ステップＳ１００７）。ステップＳ１００７の処理終了後、命令エミュレータ＃１は、命令実行処理を終了する。命令実行処理を実行することにより、命令エミュレータ＃１は、命令コードに対応するネイティブコードを実行して、命令コードの実行を模倣することができる。
【００８６】
図１１は、遅延処理中情報設定処理手順の一例を示すフローチャートである。遅延処理中情報設定処理は、遅延処理中情報３１２を設定する処理である。
【００８７】
命令エミュレータ＃１は、遅延処理中情報３１２の実行有無フィールドに「あり」を設定する（ステップＳ１１０１）。次に、命令エミュレータ＃１は、遅延処理中情報３１２の遅延命令エミュレータ番号フィールドに自命令エミュレータ番号を設定する（ステップＳ１１０２）。そして、命令エミュレータ＃１は、遅延処理中情報３１２のメモリアドレス情報フィールドに、遅延付きネイティブコード列により操作が行われるアドレスの範囲を設定する（ステップＳ１１０３）。次に、命令エミュレータ＃１は、遅延処理中情報３１２のメモリ操作種別フィールドに操作の種類を設定する（ステップＳ１１０４）。
【００８８】
ステップＳ１１０４の処理終了後、命令エミュレータ＃１は、遅延処理中情報設定処理を終了する。遅延処理中情報設定処理を実行することにより、命令エミュレータ＃１は、遅延処理中情報３１２を設定することができる。
【００８９】
図１２は、競合検出処理手順の一例を示すフローチャートである。競合検出処理は、メモリへのアクセス操作の競合を検出する処理である。
【００９０】
命令エミュレータ＃１は、遅延処理中情報３１２を参照して、遅延命令エミュレータの操作対象のメモリアドレスの範囲と、自命令エミュレータの操作対象のメモリアドレスの範囲とが重なるかを判定する（ステップＳ１２０１）。次に、命令エミュレータ＃１は、両方の操作対象のメモリアクセスの範囲が重なるか否かを判断する（ステップＳ１２０２）。両方の操作対象のメモリアクセスの範囲が重なる場合（ステップＳ１２０２：Ｙｅｓ）、続けて、命令エミュレータ＃１は、重なる部分のメモリ操作種別が両方とも読み出しか否かを判断する（ステップＳ１２０３）。
【００９１】
重なる部分のメモリ操作種別が両方とも読み出しでない場合（ステップＳ１２０３：Ｎｏ）、競合を検出したとして、命令エミュレータ＃１は、ログ情報３１３に、検出時刻と、遅延命令エミュレータの情報と、自命令エミュレータの情報とを格納する（ステップＳ１２０４）。そして、命令エミュレータ＃１は、模倣対象のプログラム１１１内の遅延付きネイティブコード列に対応する命令コードを、アトミック性ありのメモリ操作の命令コードに書き換える（ステップＳ１２０５）。
【００９２】
ステップＳ１２０５の処理終了後、または、両方の操作対象のメモリアクセスの範囲が重ならない場合（ステップＳ１２０２：Ｎｏ）、または、重なる部分のメモリ操作種別が両方とも読み出しである場合（ステップＳ１２０３：Ｙｅｓ）、命令エミュレータ＃１は、競合検出処理を終了する。競合検出処理を実行することにより、命令エミュレータ＃１は、メモリへのアクセス操作が競合した際に、競合の原因となった命令コードを修正することができる。
【００９３】
以上説明したように、情報処理装置１０１によれば、模倣対象となる固有の命令コードがメモリ操作するものであり、アトミック性がない複数のネイティブコードに対応するなら、ネイティブコードの間に遅延処理を含めたネイティブコード列を生成する。遅延処理を含めたネイティブコード列を実行することにより、あるプロセッサ１０２が遅延処理を実行中に、別のプロセッサ１０２のメモリ操作が増えるため、排他制御の不具合を検出し易くなる。
【００９４】
また、情報処理装置１０１によれば、第１のコードがメモリにアクセスする種別であると判定した場合、第１のコードと、他のプロセッサが第２のコードに対応する遅延付きネイティブコード列１１４によるメモリのアクセスとの競合とを検出してもよい。これにより、情報処理装置１０１は、情報処理装置１０１の操作者に、排他制御の不具合を検出したことを通知することができる。そして、情報処理装置１０１の操作者は、検出した箇所の不具合に対応することができる。
【００９５】
また、情報処理装置１０１によれば、競合を検出した場合、模倣対象のプログラム１１１内の第２のコードを、第２のコードと同一の機能を有しアトミック性があるネイティブコードに対応するコードに変換してもよい。これにより、情報処理装置１０１は、排他制御の不具合を修正することができる。そして、模倣対象のプログラム１１１の実行の模倣を繰り返して行う場合、情報処理装置１０１は、同じ箇所の排他制御の不具合を検出することを抑止して、異なる箇所の排他制御の不具合を検出することができる。
【００９６】
また、情報処理装置１０１によれば、条件Ａが満たされた場合に限り、第１のコードに対応する遅延付きネイティブコード列１１４を実行してもよい。これにより、情報処理装置１０１は、模倣対象のプログラム１１１の実行時間が不要に延びてしまうことを抑制しつつ、排他制御の不具合の顕在化を促進することができる。ここで、上述した説明では、遅延付きネイティブコード列１１４を同時に実行可能なプロセッサの数は１であるが、最大ｎ−１個のプロセッサが遅延付きネイティブコード列１１４を同時に実行してもよい。遅延付きネイティブコード列１１４を同時に実行可能なプロセッサの最大値は、情報処理装置１０１の操作者によって指定されてもよい。例えば、情報処理装置１０１の操作者は、模倣対象のプログラム１１１の規模と、情報処理装置１０１が有するプロセッサの個数とに応じて、遅延付きネイティブコード列１１４を同時に実行可能なプロセッサの最大値を指定する。
【００９７】
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本情報処理プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本情報処理プログラムは、インターネット等のネットワークを介して配布してもよい。
【００９８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【００９９】
（付記１）模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサが実行を模倣する第１のコードを前記模倣対象のプログラムから取得し、
前記模倣対象のプログラムに含まれるコードに対応する前記複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、前記コードの種別と、前記１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であるか否かを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、前記第１のコードがメモリをアクセスする種別であると判定した場合、前記対応情報を参照して、前記第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを前記複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する、
制御部を有することを特徴とする情報処理装置。
【０１００】
（付記２）前記制御部は、
前記第１のコードがメモリをアクセスする種別であると判定した場合、前記第１のコードに対応するネイティブコードによるメモリのアクセスと、前記複数のプロセッサのうちの前記いずれかのプロセッサ以外の他のプロセッサが前記模倣対象のプログラムに含まれる第２のコードに対応する遅延付きネイティブコード列によるメモリのアクセスとの競合を検出することを特徴とする付記１に記載の情報処理装置。
【０１０１】
（付記３）前記対応情報は、不可分操作でないネイティブコードに対応するコードと、当該コードと同一の機能を有し不可分操作であるネイティブコードに対応するコードとの対応関係を記憶しており、
前記制御部は、
前記競合を検出した場合、前記対応情報を参照して、前記第２のコードを、前記第２のコードと同一の機能を有し不可分操作であるネイティブコードに対応するコードに変換することを特徴とする付記２に記載の情報処理装置。
【０１０２】
（付記４）前記制御部は、
さらに、前記複数のプロセッサのうちの前記いずれかのプロセッサ以外の他のプロセッサが、前記模倣対象のプログラムに含まれる第２のコードに対応する遅延付きネイティブコード列を実行中でないかを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であり、かつ、前記他のプロセッサが前記第２のコードに対応する遅延付きネイティブコード列を実行中でないと判定した場合、生成した前記第１のコードに対応する遅延付きネイティブコード列を実行することを特徴とする付記１〜３のいずれか１つに記載の情報処理装置。
【０１０３】
（付記５）模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサに、
前記いずれかのプロセッサが実行を模倣する第１のコードを前記模倣対象のプログラムから取得し、
前記模倣対象のプログラムに含まれるコードに対応する前記複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、前記コードの種別と、前記１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であるか否かを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、前記第１のコードがメモリをアクセスする種別であると判定した場合、前記対応情報を参照して、前記第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを前記複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する、
処理を実行させることを特徴とするエミュレータプログラム。
【０１０４】
（付記６）模倣対象のプログラムの実行を模倣する複数のプロセッサのうちのいずれかのプロセッサが、
前記いずれかのプロセッサが実行を模倣する第１のコードを前記模倣対象のプログラムから取得し、
前記模倣対象のプログラムに含まれるコードに対応する前記複数のプロセッサの各々のプロセッサが実行可能な１または複数のネイティブコードと、前記コードの種別と、前記１または複数のネイティブコードが不可分操作か否かを示す情報とを対応付けた対応情報を参照して、取得した前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、かつ、前記第１のコードがメモリをアクセスする種別であるか否かを判定し、
前記第１のコードに対応する複数のネイティブコードが不可分操作でなく、前記第１のコードがメモリをアクセスする種別であると判定した場合、前記対応情報を参照して、前記第１のコードに対応する複数のネイティブコードの実行完了を遅延させるコードを前記複数のネイティブコードのうちの２つのネイティブコードの間に挿入した遅延付きネイティブコード列を生成する、
処理を実行することを特徴とするエミュレータ方法。
【符号の説明】
【０１０５】
１０１  情報処理装置
１０２＃１〜＃ｎ  プロセッサ
１１１  模倣対象のプログラム
１１４  遅延付きネイティブコード列
１２１  対応情報
３００  制御部
３０１  取得部
３０２  判定部
３０３  生成部
３０４  実行部
３０５  検出部
３０６  変換部
【図１】
0006447280.tif 000002
【図２】
0006447280.tif 000003
【図３】
0006447280.tif 000004
【図４】
0006447280.tif 000005
【図５】
0006447280.tif 000006
【図６】
0006447280.tif 000007
【図７】
0006447280.tif 000008
【図８】
0006447280.tif 000009
【図９】
0006447280.tif 000010
【図１０】
0006447280.tif 000011
【図１１】
0006447280.tif 000012
【図１２】
0006447280.tif 000013