(57)【要約】【課題】自己書き換えコード（ＳＭＣ）による書き換えが発生したことによって変換バイナリコードの一部が使用できなくなった状態から復帰する処理のパフォーマンスを向上する。【解決手段】ＤＢＴのランタイム５０では、ＳＭＣ検出部５１が、オリジナルバイナリコードのＳＭＣによる書き換えの発生を検出し、トレース特定部５４が、ＳＭＣによる書き換えの発生の検出に応じて、オリジナルバイナリコードを最適化して得られた最適化バイナリコードのＳＭＣによる書き換えの影響を受けるトレースを特定し、トレース修正部５５が、複数のスレッドのうちのこのトレースを実行したスレッドが例外を発生するようにこのトレースを修正し、スレッド実行制御部５６が、例外が発生した際に、ＳＭＣにより書き換えられたオリジナルバイナリコードのトレースを、例外を発生したスレッドが実行するように制御する。【選択図】図６
2015179318.tif 000002
【特許請求の範囲】
【請求項１】
複数のスレッドによるバイナリコードの実行を制御する装置であって、
第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、
前記第１の部分の前記自己書き換えコードによる書き換えの発生の検出に応じて、前記第１のバイナリコードを変換して得られた第２のバイナリコードの当該第１の部分に対応する部分である第２の部分を特定する特定部と、
前記複数のスレッドのうちの前記第２のバイナリコードの前記第２の部分を実行した特定スレッドが例外を発生するように当該第２の部分を修正する修正部と
を含む、装置。
【請求項２】
前記修正部は、前記第２の部分に含まれる複数の命令のうち、前記第１の部分に含まれる前記自己書き換えコードにより書き換えられた命令に対応する少なくとも１つの命令を、割り込み命令で置き換えることにより、当該第２の部分を修正する、請求項１の装置。
【請求項３】
前記例外が発生した際に、前記自己書き換えコードにより書き換えられた前記第１のバイナリコードの前記第１の部分を前記特定スレッドが実行するように制御する制御部を更に含む、請求項１又は請求項２の装置。
【請求項４】
前記制御部は、前記第２のバイナリコードの前記第２の部分以外の部分から当該第２の部分へのリンクを切り離した後に、前記第１のバイナリコードの前記第１の部分を前記特定スレッドが実行するように制御する、請求項３の装置。
【請求項５】
前記第１の部分の少なくとも一部が記憶されたメモリ領域であって前記自己書き換えコードにより書き換えられた命令を含むメモリ領域であるページが、ページ保護がかかっておらず使用されていない仮想ページにマッピングされた状態を、前記特定部が前記第２の部分を特定し、前記修正部が当該第２の部分を修正する間、維持する維持部を更に含む、請求項１乃至請求項４の何れかの装置。
【請求項６】
複数のスレッドによるバイナリコードの実行を制御する装置であって、
オリジナルバイナリコードを最適化することにより、最適化バイナリコードを生成する生成部と、
前記最適化バイナリコードを複数のスレッドが実行中に、前記オリジナルバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、
前記第１の部分の前記自己書き換えコードによる書き換えの発生の検出に応じて、前記最適化バイナリコードの当該第１の部分に対応する部分である第２の部分を特定する特定部と、
前記複数のスレッドのうちの前記最適化バイナリコードの前記第２の部分を実行した特定スレッドが例外を発生するように当該第２の部分を修正する修正部と、
前記例外が発生した際に、前記自己書き換えコードにより書き換えられた前記オリジナルバイナリコードの前記第１の部分を前記特定スレッドが実行するように制御する制御部と
を含む、装置。
【請求項７】
複数のスレッドによるバイナリコードの実行を制御する方法であって、
第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出するステップと、
前記第１の部分の前記自己書き換えコードによる書き換えの発生の検出に応じて、前記第１のバイナリコードを変換して得られた第２のバイナリコードの当該第１の部分に対応する部分である第２の部分を特定するステップと、
前記複数のスレッドのうちの前記第２のバイナリコードの前記第２の部分を実行した特定スレッドが例外を発生するように当該第２の部分を修正するステップと
を含む、方法。
【請求項８】
複数のスレッドによるバイナリコードの実行を制御する装置として、コンピュータを機能させるプログラムであって、
前記コンピュータを、
第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、
前記第１の部分の前記自己書き換えコードによる書き換えの発生の検出に応じて、前記第１のバイナリコードを変換して得られた第２のバイナリコードの当該第１の部分に対応する部分である第２の部分を特定する特定部と、
前記複数のスレッドのうちの前記第２のバイナリコードの前記第２の部分を実行した特定スレッドが例外を発生するように当該第２の部分を修正する修正部と
して機能させる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バイナリコードの実行を制御する装置及び方法に関する。特に、本発明は、複数のスレッドによるバイナリコードの実行を制御する装置及び方法に関する。
【背景技術】
【０００２】
オリジナルバイナリコードを変換して得られた変換バイナリコードを実行中にオリジナルバイナリコードの一部が自分自身を書き換えることがある。このような自分自身を書き換えるコードを自己書き換えコード（ＳＭＣ；Self-Modifying Code）と呼ぶ。このＳＭＣによる書き換えが発生すると、書き換えられた部分に対応する変換バイナリコードの部分は使用できなくなる。
【０００３】
このような自己書き換えコードに関する技術は、公報記載の技術としても知られている（例えば、特許文献１〜３参照）。
【０００４】
特許文献１は、保護されたページに対する書き込みを試みると（たとえば自己修正コードによる、あるいはテキストとデータが混合されたページに対する書き込み）それがトラップされ、そのページが再度保護なしにセットされることを開示する。
【０００５】
特許文献２は、自己書換えコードが使用されて、命令が頻繁に書換えられるのでその変換が「オリジナル」の状態に繰返し戻るため、その命令を変換しようとする試みが無駄であるような場合にも、タイプＥＸＥＣＵＴＥＤの命令は使用されることを開示する。
【０００６】
特許文献３は、セグメンテーション違反は、ターゲット・コードが、自己書き換えコードへの書き込みを試みるといった、メモリの保護された領域へのアクセスを試みる場合を検出するために、トラップとして意図的に導入することができることを開示する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１１−４００８７号公報
【特許文献２】特表２００２−５０２５１６号公報
【特許文献３】特表２０１０−５２５４４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記のように、ＳＭＣによる書き換えが発生すると、変換バイナリコードの一部が使用できなくなるので、そのような状態から復帰する必要がある。その際、復帰する処理のパフォーマンスの向上が望まれる。
【０００９】
特許文献１〜３の技術は、自己書き換えコードに関するものではあるが、このような復帰する処理のパフォーマンスを向上するための手段を提案するものではない。
【００１０】
本発明の目的は、ＳＭＣによる書き換えが発生したことによって変換バイナリコードの一部が使用できなくなった状態から復帰する処理のパフォーマンスを向上することにある。
【課題を解決するための手段】
【００１１】
かかる目的のもと、本発明は、複数のスレッドによるバイナリコードの実行を制御する装置であって、第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、第１の部分の自己書き換えコードによる書き換えの発生の検出に応じて、第１のバイナリコードを変換して得られた第２のバイナリコードの第１の部分に対応する部分である第２の部分を特定する特定部と、複数のスレッドのうちの第２のバイナリコードの第２の部分を実行した特定スレッドが例外を発生するように第２の部分を修正する修正部とを含む、装置を提供する。
【００１２】
この装置において、修正部は、第２の部分に含まれる複数の命令のうち、第１の部分に含まれる自己書き換えコードにより書き換えられた命令に対応する少なくとも１つの命令を、割り込み命令で置き換えることにより、第２の部分を修正する、ものであってよい。
【００１３】
また、この装置は、例外が発生した際に、自己書き換えコードにより書き換えられた第１のバイナリコードの第１の部分を特定スレッドが実行するように制御する制御部を更に含む、ものであってよい。その場合、制御部は、第２のバイナリコードの第２の部分以外の部分から第２の部分へのリンクを切り離した後に、第１のバイナリコードの第１の部分を特定スレッドが実行するように制御する、ものであってよい。
【００１４】
更に、この装置は、第１の部分の少なくとも一部が記憶されたメモリ領域であって自己書き換えコードにより書き換えられた命令を含むメモリ領域であるページが、ページ保護がかかっておらず使用されていない仮想ページにマッピングされた状態を、特定部が第２の部分を特定し、修正部が第２の部分を修正する間、維持する維持部を更に含む、ものであってよい。
【００１５】
また、本発明は、複数のスレッドによるバイナリコードの実行を制御する装置であって、オリジナルバイナリコードを最適化することにより、最適化バイナリコードを生成する生成部と、最適化バイナリコードを複数のスレッドが実行中に、オリジナルバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、第１の部分の自己書き換えコードによる書き換えの発生の検出に応じて、最適化バイナリコードの第１の部分に対応する部分である第２の部分を特定する特定部と、複数のスレッドのうちの最適化バイナリコードの第２の部分を実行した特定スレッドが例外を発生するように第２の部分を修正する修正部と、例外が発生した際に、自己書き換えコードにより書き換えられたオリジナルバイナリコードの第１の部分を特定スレッドが実行するように制御する制御部とを含む、装置も提供する。
【００１６】
更に、本発明は、複数のスレッドによるバイナリコードの実行を制御する方法であって、第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出するステップと、第１の部分の自己書き換えコードによる書き換えの発生の検出に応じて、第１のバイナリコードを変換して得られた第２のバイナリコードの第１の部分に対応する部分である第２の部分を特定するステップと、複数のスレッドのうちの第２のバイナリコードの第２の部分を実行した特定スレッドが例外を発生するように第２の部分を修正するステップとを含む、方法も提供する。
【００１７】
更にまた、本発明は、複数のスレッドによるバイナリコードの実行を制御する装置として、コンピュータを機能させるプログラムであって、コンピュータを、第１のバイナリコードの部分である第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部と、第１の部分の自己書き換えコードによる書き換えの発生の検出に応じて、第１のバイナリコードを変換して得られた第２のバイナリコードの第１の部分に対応する部分である第２の部分を特定する特定部と、複数のスレッドのうちの第２のバイナリコードの第２の部分を実行した特定スレッドが例外を発生するように第２の部分を修正する修正部として機能させる、プログラムも提供する。
【発明の効果】
【００１８】
本発明によれば、ＳＭＣによる書き換えが発生したことによって変換バイナリコードの一部が使用できなくなった状態から復帰する処理のパフォーマンスが向上する。
【図面の簡単な説明】
【００１９】
【図１】本発明の実施の形態におけるバイナリ変換装置の機能構成例を示した図である。
【図２】最適化コードキャッシュに記憶されているトレースの例について示した図である。
【図３】（ａ）はオリジナルバイナリコードの命令列を示した図であり、（ｂ）は動作している全てのスレッドに対してグローバル同期を行うことを示した図であり、（ｃ）はグローバル同期を行った後に取り除くべき最適化バイナリコードの命令列を示した図である。
【図４】（ａ）は最適化バイナリコードの命令列が特定されることを示した図であり、（ｂ）はポイズニングを行った後の命令列を示した図であり、（ｃ）はポイズニングを行った後の命令列で割込みが発生することを示した図である。
【図５】新たなトレースの呼び出しの変更に先立って行われる無効なトレースへの分岐の切り離し等について示した図である。
【図６】本発明の実施の形態におけるランタイムの機能構成例を示した図である。
【図７】本発明の実施の形態におけるランタイムの動作例を示したフローチャートである。
【図８】本発明の実施の形態におけるＤＢＴのハードウェア構成例を示した図である。
【発明を実施するための形態】
【００２０】
以下、添付図面を参照して、本発明の実施の形態について詳細に説明する。
【００２１】
［本実施の形態の概要］
図１は、本実施の形態におけるバイナリ変換装置（命令エミュレータ）１の機能構成例を示した図である。図示するように、このバイナリ変換装置１は、オリジナルコードキャッシュ１０と、最適化コードキャッシュ２０と、ＤＢＴ（Dynamic Binary Translator）３０とを含む。ＤＢＴ３０は、オプティマイザ４０と、ランタイム５０とを含む。
【００２２】
オリジナルコードキャッシュ１０は、オプティマイザ４０による最適化前のオリジナルバイナリコードを記憶する。
【００２３】
最適化コードキャッシュ２０は、オプティマイザ４０による最適化後の最適化バイナリコードを記憶する。
【００２４】
オプティマイザ４０は、オリジナルコードキャッシュ１０に記憶されたオリジナルバイナリコードを最適化することにより最適化バイナリコードを生成し、この最適化バイナリコードを最適化コードキャッシュ２０に記憶する。本実施の形態では、最適化バイナリコードを生成する生成部の一例として、オプティマイザ４０を設けている。
【００２５】
ランタイム５０は、最適化コードキャッシュ２０に記憶された最適化バイナリコードの複数のスレッドによる実行を制御する。特に、最適化バイナリコードを複数のスレッドが実行中にオリジナルバイナリコードがＳＭＣにより書き換えられた場合における実行を制御する。
【００２６】
［本実施の形態の背景］
バイナリ変換装置１でＳＭＣに対処するのに、普通に考えられる手法ではコストがかかる。以下、このことについて具体的に説明する。
【００２７】
図２は、最適化コードキャッシュ２０に記憶されているトレースの例について示した図である。ここで、トレースとは、１つの入り口及び複数の出口を有するコンパイル単位である。図では、トレース０ｘＡＡ，０ｘＢＢ，０ｘＣＣ，０ｘＤＤ，０ｘＥＥが記憶されている。また、このうち、トレース０ｘＥＥは、「Ｉｎｖａｌｉｄ」の表記で示すように無効になっているものとする。更に、図では、トレース内にそのトレースを実行しているスレッドの名前も示している。例えば、スレッドＴ１はトレース０ｘＣＣを実行しており、スレッドＴ２はトレース０ｘＢＢを実行している。一方、スレッドＴ５は無効になったトレース０ｘＥＥを実行している。しかしながら、ＤＢＴ３０（図１参照）はそのことを絶対に知り得ない。ＤＢＴ３０はコードキャッシュ内の各スレッドが実行している場所を明示的に追跡しないからである。このように、コードキャッシュ内のどこをスレッドが実行しているかを特定する効率の良いメカニズムがないため、グローバル同期が必要とされる。
【００２８】
図３は、このようなグローバル同期について示した図である。（ａ）は、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードのトレース０ｘＥＥの命令列１１を示す。この命令列１１において、下線で示したように、スレッドＴ５がＳＭＣによりアドレス「０ｘ４０２Ｆ３８」を書き換えたものとする。これにより、図２に示したように、トレース０ｘＥＥは無効になる。（ｂ）は、動作している全てのスレッドＴ１〜Ｔ５に対して、グローバル同期を行うことを示している。（ｃ）は、グローバル同期を行った後に取り除くべき、最適化コードキャッシュ２０に記憶されている最適化バイナリコードのトレース０ｘＥＥの命令列２１を示す。即ち、逐次一貫性を強化するために、ＤＢＴ３０（図１参照）は、全てのスレッドに対してグローバル同期を行い、無効なトレースを取り除く。しかしながら、グローバル同期を行うと、全てのスレッドを停止させる必要があるので、処理が遅くなる。
【００２９】
また、グローバル同期を行おうとすると、無限の待ち状態に陥る可能性がある。例えば、スレッドの１つは条件付きの変数で待っているが、他のスレッドは同期ポイントで待っているといった状態である。つまり、スレッドの１つが、ある変数の値が１になるのを待っていたとする。その場合、このスレッドは、他のスレッドがグローバル同期で停止すると、その変数の値が１になるのを待ち続けるので、グローバル同期は実現できなくなってしまう。
【００３０】
［本実施の形態の概要］
そこで、本実施の形態では、ＳＭＣによる書き換えを発生させたスレッドを用いて、無効になったトレースに対して、ソフトウェア割込み命令を書き込む修正を行う。本実施の形態では、この修正のことを「ポイズニング」と呼ぶ。
【００３１】
図４は、このようなポイズニングについて示した図である。（ａ）は、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードのトレース０ｘＥＥでＳＭＣによる書き換えが発生すると、最適化コードキャッシュ２０に記憶されている最適化バイナリコードのトレース０ｘＥＥの命令列２１が特定されることを示す。（ｂ）は、最適化バイナリコードの無効なトレース０ｘＥＥに対してポイズニングを行った後の命令列２２を示している。ここで、ソフトウェア割込み命令とは、例えば、ｘ８６におけるｉｎｔ３命令である。（ｃ）は、トレース０ｘＥＥに対してポイズニングを行った後の命令列２２をスレッドＴ４が実行することにより割込みが発生することを示している。このようにすれば、動作している全てのスレッドＴ１〜Ｔ５の中から、トレース０ｘＥＥを実行したスレッドを特定できるようになるので、グローバル同期を行う必要はなくなる。その後、ＤＢＴ３０（図１参照）は、トレースポインズニングが行われたトレース０ｘＥＥに代えて、新たなトレース０ｘＥＥを呼び出すように変更する。
【００３２】
図５は、この新たなトレースの呼び出しの変更に先立って行われる無効なトレース０ｘＥＥへの分岐の切り離し等について示した図である。ＤＢＴ３０のランタイム５０は、無効なトレース０ｘＥＥへ入って来る全ての分岐を切り離す。図中、トレース０ｘＤＤからトレース０ｘＥＥへの矢印上の「×」がこの切り離しを表している。また、ランタイム５０は、全てのトレースの開始アドレスを記憶しているので、無効なトレース０ｘＥＥの開始アドレスを、新たなトレース０ｘＥＥの開始アドレスに置き換える。図中、ランタイム５０からトレース０ｘＥＥへの矢印上の「×」がこの開始アドレスの置き換えを表している。全てのスレッドがＳＭＣによる書き換えの発生後に少なくとも１回トレースから抜け出たことをランタイム５０が認識した場合、トレースは安全に取り除かれる。
【００３３】
［本実施の形態におけるランタイムの機能構成］
図６は、以上のような概略動作を行うランタイム５０の機能構成例を示した図である。図示するように、このランタイム５０は、ＳＭＣ検出部５１と、マッピング処理部５２と、フラグ設定部５３と、トレース特定部５４と、トレース修正部５５と、スレッド実行制御部５６とを備える。
【００３４】
ＳＭＣ検出部５１は、オリジナルコードキャッシュ１０にページ保護をかけ、オリジナルバイナリコードのあるトレースに含まれる命令がＳＭＣにより書き換えられようとしたことを検出する。また、オリジナルバイナリコードのページをマッピング処理部５２がマッピングした仮想ページを介して、オリジナルバイナリコードのＳＭＣによる書き換えを許可する。本実施の形態では、第１のバイナリコードの一例として、オリジナルバイナリコードを用いており、第１のバイナリコードの部分である第１の部分として、オリジナルバイナリコードのトレースを用いている。また、第１の部分の自己書き換えコードによる書き換えの発生を検出する検出部の一例として、ＳＭＣ検出部５１を設けている。
【００３５】
マッピング処理部５２は、オリジナルバイナリコードのＳＭＣによる書き換えを可能とするために、オリジナルバイナリコードのページを、ページ保護がかかっておらず使用されていない仮想ページにマッピングする。ここで、マッピングするページは、トレースの少なくとも一部が記憶されたメモリ領域であってＳＭＣにより書き換えられた命令を含むメモリ領域であればよい。また、マッピングは、トレース特定部５４がトレースを特定し、トレース修正部５５がトレースを修正し、ＳＭＣ検出部５１がＳＭＣによる書き換えを許可した後に解除する。本実施の形態では、ページがマッピングされた状態を維持する維持部の一例として、マッピング処理部５２を設けている。
【００３６】
フラグ設定部５３は、オリジナルバイナリコードがＳＭＣにより書き換えられようとしたことをＳＭＣ検出部５１が検出すると、ＳＭＣ処理中フラグを設定する。具体的には、初期状態では、ＳＭＣ処理中フラグをオフとし、あるトレースに含まれる命令がＳＭＣにより書き換えられようとしたことをＳＭＣ検出部５１が検出すると、そのトレースに対するＳＭＣ処理中フラグをオンにし、オプティマイザ４０も参照可能なメモリに保持しておく。そして、オプティマイザ４０が実行する全てのスレッドは最適化を行う前にこのＳＭＣ処理中フラグをチェックする。これは、読込みロック又は書込みロックで実装できる。即ち、通常の最適化を行う場合は読込みロックが保持されるが、ＳＭＣによる書き換えが発生した場合は書込みロックが保持される。最適化を行うコストは読込みロック又は書込みロックを保持するコストよりもはるかに大きいと思われる。これにより、他のスレッドは、ＳＭＣ処理中フラグがオンになっている場合は、最適化を行わないようにする。
【００３７】
トレース特定部５４は、オリジナルバイナリコードのＳＭＣにより書き換えられようとしたトレースに対応する最適化バイナリコードのトレースを特定する。本実施の形態では、第１のバイナリコードを変換して得られた第２のバイナリコードの一例として、最適化バイナリコードを用いており、第２のバイナリコードの第１の部分に対応する部分である第２の部分の一例として、最適化バイナリコードのトレースを用いている。また、第２の部分を特定する特定部の一例として、トレース特定部５４を設けている。
【００３８】
トレース修正部５５は、トレース特定部５４により特定された最適化バイナリコードのトレースに含まれる全ての命令をソフトウェア割込み命令で上書きすることにより、ポイズニングを行う。或いは、オリジナルバイナリコードのＳＭＣにより書き換えられようとした命令に対応する命令列のみをソフトウェア割込み命令で上書きしてもよいが、本実施の形態では、トレースに含まれる全ての命令をソフトウェア割込み命令で上書きするものとして説明する。本実施の形態では、第２のバイナリコードの第２の部分を修正する修正部の一例として、トレース修正部５５を設けている。
【００３９】
スレッド実行制御部５６は、複数のスレッドによる最適化バイナリコードの実行を制御する。また、トレース修正部５５が書き込んだソフトウェア割込み命令を実行したスレッドが例外を発生させた場合には、オリジナルバイナリコードのＳＭＣにより書き換えられたトレースをそのスレッドが実行するように制御する。本実施の形態では、自己書き換えコードにより書き換えられた第１のバイナリコードの第１の部分を特定スレッドが実行するように制御する制御部の一例として、スレッド実行制御部５６を設けている。
【００４０】
［本実施の形態におけるランタイムの動作］
図７は、本実施の形態におけるランタイム５０の動作例を示したフローチャートである。
【００４１】
図示するように、ランタイム５０では、まず、ＳＭＣ検出部５１が、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードがＳＭＣにより書き換えられようとしたことを検出する（ステップ５０１）。具体的には、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードにページ保護をかける。この状態でＳＭＣによりオリジナルバイナリコードが書き換えられようとすると、割込みが発生するので、オリジナルバイナリコードがＳＭＣにより書き換えられようとしたことを検出できる。
【００４２】
すると、ＳＭＣ検出部５１は、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードのＳＭＣにより書き換えられようとした命令を特定する（ステップ５０２）。オリジナルバイナリコードがＳＭＣにより書き換えられようとしたことを検出すると、書き換えられようとしたアドレスは分かる。一方で、命令とアドレスとの対応は命令コードの識別情報やレジスタ情報の取得、分岐先の修正等のために分析済みであるので、ＳＭＣにより書き換えられようとした命令は容易に特定できる。
【００４３】
次に、マッピング処理部５２が、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードのＳＭＣにより書き換えられようとした命令を含むページを、ページ保護がかかっておらず使用されていない仮想ページにマッピングする（ステップ５０３）。ここで、使用されていない仮想ページは、ＬＩＮＵＸ（登録商標）では、「/proc/pid/maps」に問い合わせを行うことにより見つけることができる。また、ＷＩＮＤＯＷＳ（登録商標）では、「MapViewOfFileEx()」にＮＵＬＬを渡すことにより見つけることができる。グローバル同期を行わずに書込みを行う場合、ページ保護ビットをオフにすることができないので、このような仮想ページへのマッピングが必要となる。
【００４４】
また、フラグ設定部５３が、一連の処理が成功及び失敗の何れかになり、かつ、処理の途中で他からアクセスできないように、ＳＭＣ処理中フラグをオンにする（ステップ５０４）。
【００４５】
このようにＳＭＣ処理中フラグがオンになった状態で、まず、トレース特定部５４が、最適化コードキャッシュ２０に記憶されているトレースのうち、オリジナルバイナリコードのＳＭＣによる書き換えの影響を受ける全てのトレースを見つける（ステップ５０５）。
【００４６】
次に、トレース修正部５５が、ステップ５０５で見つけたＳＭＣによる書き換えの影響を受ける全てのトレースに対してソフトウェア割込み命令を書き込む修正（ポイズニング）を行う（ステップ５０６）。これにより、ポイズニングが行われたトレースを実行したスレッドは、割込みを発生させる。
【００４７】
次いで、ＳＭＣ検出部５１が、オリジナルコードキャッシュ１０に記憶されているオリジナルバイナリコードのステップ５０２で特定した命令に対し、命令を分析した情報を用いて、ＳＭＣによる書き換えを行う（ステップ５０７）。これにより、ステップ５０６に対応して割込みを発生させたスレッドが、オリジナルバイナリコードのＳＭＣにより書き換えられたトレースを実行するよう、スレッド実行制御部５６が制御する。その際、スレッド実行制御部５６は、図５に示したように、最適化バイナリコードの無効なトレースへの他のトレースからのリンクを切り離した後に、オリジナルバイナリコードのＳＭＣにより書き換えられたトレースをスレッドが実行するよう、制御する。
【００４８】
これらの処理が終了すると、フラグ設定部５３が、ステップ５０４でオンにしたＳＭＣ処理中フラグをオフにする（ステップ５０８）。ここで、ステップ５０５からステップ５０７の重要な部分は短くなることが期待される。
【００４９】
また、マッピング処理部５２は、ステップ５０３で行ったオリジナルバイナリコードのページの仮想ページへのマッピングを解除する（ステップ５０９）。ＳＭＣに関する処理を行っている途中で、別のスレッドが同じページに対してＳＭＣによる書き換えを行った場合においても、これを高速に処理できるよう、このタイミングまでマッピングした状態を維持している。
【００５０】
尚、この動作例では、オリジナルバイナリコードのＳＭＣにより書き換えられたトレースをステップ５０７の直後に実行できることを述べたが、ステップ５０９の処理の終了後にそのトレースを実行するようにしてもよい。
【００５１】
ところで、本実施の形態において、ポイズニングが行われたトレースを実行したスレッドは、オリジナルバイナリコードのＳＭＣにより書き換えられたトレースを実行するようにしたが、この限りではない。オリジナルバイナリコードのＳＭＣにより書き換えられたトレースを再度最適化することにより、最適化バイナリコードのトレースを生成し、この最適化バイナリコードのトレースを実行するようにしてもよい。
【００５２】
また、本実施の形態では、オリジナルバイナリコードに対して最適化する変換を行うバイナリ変換装置１に本発明を適用した場合について説明したが、この限りではない。オリジナルバイナリコードに対して如何なる変換を行うバイナリ変換装置１であっても本発明は適用可能である。
【００５３】
以上述べたように、本実施の形態では、オリジナルバイナリコードがＳＭＣにより書き換えられると、オリジナルバイナリコードを変換して得られた変換バイナリコードの影響を受けるトレースを特定し、そのトレースを実行したスレッドが例外を発生するようにそのトレースを修正するようにした。これにより、ＳＭＣによる書き換えが発生したことによって変換バイナリコードの一部が使用できなくなった状態から復帰する処理のパフォーマンスを向上させることが可能となった。
【００５４】
［本実施の形態の電子書籍表示装置のハードウェア構成］
図８は、本実施の形態におけるＤＢＴ３０のハードウェア構成例を示した図である。図示するように、ＤＢＴ３０は、演算手段であるＣＰＵ（Central Processing Unit）３０ａと、Ｍ／Ｂ（マザーボード）チップセット３０ｂを介してＣＰＵ３０ａに接続されたメインメモリ３０ｃと、同じくＭ／Ｂチップセット３０ｂを介してＣＰＵ３０ａに接続された表示機構３０ｄとを備える。また、Ｍ／Ｂチップセット３０ｂには、ブリッジ回路３０ｅを介して、ネットワークインターフェイス３０ｆと、磁気ディスク装置（ＨＤＤ）３０ｇと、音声機構３０ｈと、キーボード／マウス３０ｉと、フレキシブルディスクドライブ３０ｊとが接続されている。
【００５５】
尚、図８において、各構成要素は、バスを介して接続される。例えば、ＣＰＵ３０ａとＭ／Ｂチップセット３０ｂの間や、Ｍ／Ｂチップセット３０ｂとメインメモリ３０ｃの間は、ＣＰＵバスを介して接続される。また、Ｍ／Ｂチップセット３０ｂと表示機構３０ｄとの間は、ＡＧＰ（Accelerated Graphics Port）を介して接続されてもよいが、表示機構３０ｄがＰＣＩ Ｅｘｐｒｅｓｓ対応のビデオカードを含む場合、Ｍ／Ｂチップセット３０ｂとこのビデオカードの間は、ＰＣＩ Ｅｘｐｒｅｓｓ（ＰＣＩｅ）バスを介して接続される。また、ブリッジ回路３０ｅと接続する場合、ネットワークインターフェイス３０ｆについては、例えば、ＰＣＩ Ｅｘｐｒｅｓｓを用いることができる。また、磁気ディスク装置３０ｇについては、例えば、シリアルＡＴＡ（AT Attachment）、パラレル転送のＡＴＡ、ＰＣＩ（Peripheral Components Interconnect）を用いることができる。更に、キーボード／マウス３０ｉ、及び、フレキシブルディスクドライブ３０ｊについては、ＵＳＢ（Universal Serial Bus）を用いることができる。
【００５６】
ここで、本発明は、全てハードウェアで実現してもよいし、全てソフトウェアで実現してもよい。また、ハードウェア及びソフトウェアの両方により実現することも可能である。また、本発明は、コンピュータ、データ処理システム、コンピュータプログラムとして実現することができる。このコンピュータプログラムは、コンピュータにより読取り可能な媒体に記憶され、提供され得る。ここで、媒体としては、電子的、磁気的、光学的、電磁的、赤外線又は半導体システム（装置又は機器）、或いは、伝搬媒体が考えられる。また、コンピュータにより読取り可能な媒体としては、半導体、ソリッドステート記憶装置、磁気テープ、取り外し可能なコンピュータディスケット、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、リジッド磁気ディスク、及び光ディスクが例示される。現時点における光ディスクの例には、コンパクトディスク−リードオンリーメモリ（ＣＤ−ＲＯＭ）、コンパクトディスク−リード／ライト（ＣＤ−Ｒ／Ｗ）及びＤＶＤが含まれる。
【００５７】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態には限定されない。本発明の精神及び範囲から逸脱することなく様々に変更したり代替態様を採用したりすることが可能なことは、当業者に明らかである。
【符号の説明】
【００５８】
１０…オリジナルコードキャッシュ、２０…最適化コードキャッシュ、３０…ＤＢＴ、４０…オプティマイザ、５０…ランタイム、５１…ＳＭＣ検出部、５２…マッピング処理部、５３…フラグ設定部、５４…トレース特定部、５５…トレース修正部、５６…スレッド実行制御部
【図１】
2015179318.tif 000003
【図２】
2015179318.tif 000004
【図３】
2015179318.tif 000005
【図４】
2015179318.tif 000006
【図５】
2015179318.tif 000007
【図６】
2015179318.tif 000008
【図７】
2015179318.tif 000009
【図８】
2015179318.tif 000010