(57)【要約】      （修正有）【課題】バイナリ分析を用いてマネージドコードからネイティブコードを起動する。【解決手段】バイナリ分析を用いてマネージドコードからネイティブコードを起動する計算デバイスが、マネージドコードを実行しているスレッドから、ネイティブコードセグメントを実行するコールを受け取る。計算デバイスは、ネイティブコードセグメントのバイナリ分析を行い、そのバイナリ分析から、ネイティブコードセグメントを少なくとも１つの所定の複雑性規則と比較することによりネイティブコードセグメントの複雑性レベルを示す複雑性指標を生成する。また、計算デバイスは、複雑性指標に基づき、スレッドの状態を記憶し、ネイティブコードセグメントを実行する【選択図】図２
2017117451.tif 000002
【特許請求の範囲】
【請求項１】
バイナリ分析を用いてマネージドコードからネイティブコードを起動する計算デバイスであって、
マネージドコードセグメントを実行するように構成されたスレッドからネイティブコードセグメントを実行するコールを受け取るネイティブコード開始モジュールと、
（ｉ）前記ネイティブコードセグメントのバイナリ分析を行い、（ｉｉ）前記バイナリ分析に基づいて前記ネイティブコードセグメントの複雑性レベルを決定するバイナリ分析モジュールと、
前記決定された複雑性レベルに基づいて前記スレッドの状態を決定し、前記スレッドの状態に基づいて前記ネイティブコードセグメントを実行するネイティブコード実行モジュールであって、前記スレッドの状態は前記ネイティブコードセグメントがネイティブコードセグメントまたはマネージドコードセグメントとして実行されるかを示す、ネイティブコード実行モジュールとを有する、
計算デバイス。
【請求項２】
前記ネイティブコード開始モジュールはさらに、
前記ネイティブコードセグメントが登録を要するか決定し、
ネイティブコードセグメントが登録を要するとの決定に応じて、前記ネイティブコードセグメントを前記バイナリ分析モジュールに送る、
請求項１に記載の計算デバイス。
【請求項３】
前記ネイティブコード開始モジュールはさらに、共有ライブラリから前記ネイティブコードセグメントをロードする、請求項１に記載の計算デバイス。
【請求項４】
前記バイナリ分析モジュールはさらに、前記スレッドに関連するメモリ空間に前記ネイティブコードセグメントをマップする、請求項１に記載の計算デバイス。
【請求項５】
前記バイナリ分析モジュールはさらに、
前記ネイティブコードセグメント中の命令数を決定し、
前記命令数が所定の閾値命令数を満たすか決定し、
前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記命令数が前記所定の閾値命令数を満たすとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有するとの決定、及び（ｉｉ）前記命令数が前記所定の閾値命令数を満たさないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有するとの決定を含む、
請求項１に記載の計算デバイス。
【請求項６】
前記バイナリ分析モジュールはさらに、
前記ネイティブコードセグメント中にループがあるか決定し、
前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記ネイティブコードセグメント中にループが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定すること、及び（ｉｉ）前記ネイティブコードセグメント中にループが存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定することを含む、
請求項１に記載の計算デバイス。
【請求項７】
前記バイナリ分析モジュールはさらに、
間接的制御フローと未確認オプコードとのうち少なくとも１つが前記ネイティブコードセグメントにあるか決定し、
前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとの少なくとも１つが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定すること、及び（ｉｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとがいずれも存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定することを含む、
請求項１に記載の計算デバイス。
【請求項８】
前記バイナリ分析モジュールは、さらに、決定された複雑性レベルを示す複雑性指標を生成する、
請求項１に記載の計算デバイス。
【請求項９】
前記ネイティブコード実行モジュールはさらに、
前記複雑性指標が低い複雑性レベルまたは高い複雑性レベルを示すか特定し、
前記複雑性指標が低い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を維持して、前記ネイティブコードセグメントがマネージドコードとして実行されるべきことを示し、
前記複雑性指標が高い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を設定して、前記ネイティブコードセグメントがネイティブコードとして実行されるべきことを示す、
請求項８に記載の計算デバイス。
【請求項１０】
前記複雑性指標は前記ネイティブコードセグメントと関連付けて記憶され、前記ネイティブコード開始モジュールはさらに、
前記複雑性指標を読み出し、
前記ネイティブコードセグメントに関連付けて記憶された第１のハッシュを読み出し、
前記第１のハッシュを、前記ネイティブコードセグメントに関連する第２のハッシュと比較して、前記ネイティブコードセグメントを実行するコールに応じて、前記複雑性指標が記憶されてから、前記ネイティブコードセグメントが変わったか決定する、
請求項８に記載の計算デバイス。
【請求項１１】
前記バイナリ分析モジュールはさらに、
前記ネイティブコードセグメントの開始アドレスを決定し、
前記ネイティブコードセグメントの開始アドレスにあるネイティブ命令から始まる少なくとも部分的制御フローグラフを生成する、
請求項１に記載の計算デバイス。
【請求項１２】
前記部分的制御フローグラフは第１の部分的制御フローグラフであり、前記バイナリ分析モジュールはさらに、
前記ネイティブコードセグメントにネストされた関数コールがあるか検出し、
前記ネイティブコードセグメントにおけるネストされた関数コールの検出に応じて、前記ネストされた関数コールに基づく第２の部分的制御フローグラフを生成する、
請求項１１に記載の計算デバイス。
【請求項１３】
バイナリ分析を用いてマネージドコードからネイティブコードを起動する方法であって、
計算デバイスが、マネージドコードセグメントを実行するように構成されたスレッドからネイティブコードセグメントを実行するコールを受け取るステップと、
前記計算デバイスが、前記ネイティブコードセグメントのバイナリ分析を行うステップと、
前記計算デバイスが、前記バイナリ分析に基づいて前記ネイティブコードセグメントの複雑性レベルを決定するステップと、
前記計算デバイスが、前記決定された複雑性レベルに基づいて、前記スレッドの状態を決定するステップと、
前記計算デバイスが、前記スレッドの状態に基づいて前記ネイティブコードセグメントを実行するステップであって、前記スレッドの状態は、前記ネイティブコードセグメントをネイティブまたはマネージドコードセグメントとして実行すべきかを示す、
方法。
【請求項１４】
前記計算デバイスが、前記ネイティブコードセグメントが登録を要するか決定するステップと、
前記計算デバイスが、前記ネイティブコードセグメントが登録を要するとの決定に応じて、前記ネイティブコードセグメントに前記バイナリ分析を行うステップとをさらに含む、
請求項１３に記載の方法。
【請求項１５】
前記計算デバイスが、共有ライブラリから前記ネイティブコードセグメントをロードするステップをさらに含む、請求項１３に記載の方法。
【請求項１６】
前記計算デバイスが、前記ネイティブコードセグメントを、前記スレッドに関連するメモリ空間にマップするステップをさらに含む、請求項１３に記載の方法。
【請求項１７】
前記計算デバイスが、前記ネイティブコードセグメント中の命令数を決定するステップと、
前記計算デバイスが、前記命令数が所定の閾値命令数を満たすか決定するステップとをさらに含み、
前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記命令数が前記所定の閾値命令数を満たすとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップ、及び（ｉｉ）前記命令数が前記所定の閾値命令数を満たさないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップとを含む、
請求項１３に記載の方法。
【請求項１８】
前記計算デバイスが、前記ネイティブコードセグメント中にループがあるか決定するステップをさらに含み、
前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記ネイティブコードセグメント中にループが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップ、及び（ｉｉ）前記ネイティブコードセグメント中にループが存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップを含む、
請求項１３に記載の方法。
【請求項１９】
前記計算デバイスは、間接的制御フローと未確認オプコードとのうち少なくとも１つが前記ネイティブコードセグメントにあるか決定するステップをさらに含み、
前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとの少なくとも１つが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップと、（ｉｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとがいずれも存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップとを含む、
請求項１３に記載の方法。
【請求項２０】
前記計算デバイスが、前記決定された複雑性レベルを示す複雑性指標を生成するステップをさらに含む、請求項１３に記載の方法。
【請求項２１】
前記計算デバイスが、前記複雑性指標が低い複雑性レベルまたは高い複雑性レベルを示すか特定するステップと、
前記スレッドの状態を決定するステップは、（ｉ）前記複雑性指標が低い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を維持して、前記ネイティブコードセグメントがマネージドコードとして実行されるべきであると示すステップと、（ｉｉ）前記複雑性指標が高い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を設定して、前記ネイティブコードセグメントがコードとして実行されるべきであると示すステップとを含む、
請求項２０に記載の方法。
【請求項２２】
前記複雑性指標は前記ネイティブコードセグメントと関連付けて記憶され、前記方法はさらに、
前記計算デバイスが前記複雑性指標を受け取るステップと、
前記計算デバイスが、前記ネイティブコードセグメントに関連付けて記憶された第１のハッシュを読み出すステップと、
前記計算デバイスが、前記ネイティブコードセグメントを実行するコールに応じて、前記第１のハッシュを、前記ネイティブコードセグメントに関連する第２のハッシュと比較して、前記複雑性指標が記憶されてから、前記ネイティブコードセグメントが変わったか決定するステップとを含む、
請求項２０に記載の方法。
【請求項２３】
前記計算デバイスが、前記ネイティブコードセグメントの開始アドレスを決定するステップと、
前記計算デバイスが、前記ネイティブコードセグメントの開始アドレスにあるネイティブ命令から始まる少なくとも部分的制御フローグラフを生成する、
請求項１３に記載の方法。
【請求項２４】
実行されると、計算デバイスに請求項１３乃至２３いずれか一項に記載の方法を実行させる複数の命令を含む一以上の機械読み取り可能記憶媒体。
【請求項２５】
バイナリ分析を用いてマネージドコードからネイティブコードを起動する計算デバイスであって、請求項１３乃至２３いずれか一項の方法を実行する手段を有する計算デバイス。
【発明の詳細な説明】
【背景技術】
【０００１】
マネージドランタイムは、マネージドコードがアンマネージドマシンコード（例えば、ネイティブコード）とインターフェースできるようにする方法を提供する。一般的なマネージドランタイムは、「実行」状態や「ネイティブ」状態などの各スレッドの状態を維持する。「実行」状態において、スレッドは、ヒープ中のマネージドデータをアクティブに操作しており、ガーベージコレクタが非使用メモリを回収できるようにするサスペンド要求を定期的にチェックする。逆に、「ネイティブ」状態では、スレッドはサスペンド要求をチェックしない。
【０００２】
一般的なマネージドランタイムでは、スレッドがマネージドコードの実行からネイティブコードの実行に移行する時、スレッドの状態が変更される。同様に、スレッドがネイティブコードの実行からマネージドコードの実行に移行する時、スレッドの状態が変更される。スレッドの状態の変更は、ロックされて行われ、比較的時間がかかる。ユーザインターフェースに関するコードセグメントの場合、キーメソッドは多くの場合ネイティブコードで実装され、マネージドコードから起動される。したがって、マネージドコードからネイティブコードへの移行に関連するロックによるオーバーヘッド（ｌｏｃｋｉｎｇ  ｏｖｅｒｈｅａｄ）により、ユーザインターフェースの応答性に遅れが生じ得る。
【図面の簡単な説明】
【０００３】
ここで説明するコンセプトを、添付した図面において、限定ではなく実施例により説明する。説明を単純かつ明確にするため、図に示した要素は必ずしもスケール通りには描いていない。適当であれば、対応または類似する要素を示すため、複数の図面で同じ参照レベルを用いた。
【図１】マネージドコードセグメントからネイティブコードセグメントを起動する時に、バイナリ分析を用いる計算デバイスの少なくとも一実施形態を示す、単純化したブロック図である。
【図２】図１の計算システムにより確立されてもよい環境の少なくとも一実施形態を示す単純化したブロック図である。
【図３】図１、２の計算デバイスにより実行されてもよいマネージドコードセグメントからネイティブコードセグメントを起動する時に、バイナリ分析を用いる方法の少なくとも一実施形態を示す、単純化したフロー図である。
【図４】図１、２の計算デバイスにより実行されてもよいバイナリ分析の方法を示す単純化されたフロー図である。
【図５】図１、２の計算デバイスにより実行されてもよい複雑性指標の生成方法を示す単純化されたフロー図である。
【図６】図１、２の計算デバイスにより実行されてもよいネイティブコードセグメントのコンポーネントを示す単純化されたブロック図である。
【図７】複雑性指標を生成するために図１、２の計算デバイスが用いてもよい複雑性規則を示す単純化されたブロック図である。
【発明を実施するための形態】
【０００４】
本開示のコンセプトはいろいろな修正を施したり代替的形式を取ったりすることもできるが、その具体的な実施形態を図面において実施例で示し、ここに詳細に説明する。しかし、言うまでもなく、開示した具体的な形式に本開示を限定する意図ではなく、逆に、本発明は本開示と添付した特許請求の範囲に沿ったすべての修正、等価物及び代替物をカバーするものである。
【０００５】
本明細書において「ｏｎｅ  ｅｍｂｏｄｉｍｅｎｔ」、「ａｎ  ｅｍｂｏｄｉｍｅｎｔ」、「ａｎ  ｉｌｌｕｓｔｒａｔｉｖｅ  ｅｍｂｏｄｉｍｅｎｔ」などと言う場合、記載した実施形態が、ある機能、構造、または特徴を含むが、かならずしもすべての実施形態がその機能、構造、または特徴を含んでも含まなくてもよい。さらに、かかる文言は必ずしも同じ実施形態を参照しているとは限らない。さらに、ある機能、構造、または特徴をある実施形態について説明した場合、明示的に記載していようがいまいが、他の実施形態に関するそれらの機能、構造、または特徴に影響が及ぶことは、当業者には自明である。また、言うまでもなく、「少なくとも１つのＡ、Ｂ及びＣ」は、（Ａ）、（Ｂ）、（Ｃ）、（Ａ及びＢ）、（Ａ及びＣ）、（Ｂ及びＣ）又は（Ａ、Ｂ、及びＣ）を意味し得る。同様に、「Ａ、Ｂ又はＣのうちの少なくとも１つ」との形式のリストに含まれるアイテムは、（Ａ）、（Ｂ）、（Ｃ）、（Ａ及びＢ）、（Ａ及びＣ）、（Ｂ及びＣ）又は（Ａ、Ｂ、及びＣ）を意味し得る。
【０００６】
開示した実施形態は、幾つかの場合には、ハードウェア、ファームウェア、ソフトウェア、またはそれらの任意の組み合わせで実装できる。開示の実施形態は、一時的又は非一時的な機械読み取り可能（例えば、コンピュータ読み取り可能）記憶媒体により担われ、又はそれに格納された（一以上のプロセッサにより読み取られ実行され得る）命令として実装することもできる。機械読み取り可能記憶媒体は、機械により読み取り可能な形式で情報を格納又は送信する任意のストレージデバイス、メカニズム、又はその他の物理的構造（例えば、揮発性又は不揮発性メモリ、メディアディスク、又はその他のメディアデバイス）として実施できる。
【０００７】
図中、幾つかの構造的又は方法フィーチャを具体的な構成及び／又は順序で示すかも知れない。しかし、言うまでもなく、かかる具体的な構成及び／又は順序は必須ではない場合がある。むしろ、幾つかの場合には、かかるフィーチャは、例示した図面に示したのとは異なる方法及び／又は順序で構成することもできる。また、ある図面に構造的又は方法フィーチャを含めることは、かかるフィーチャがすべての実施形態において必要であることを意味するのではなく、幾つかの実施形態では、含まれなくてもよいし、他のフィーチャと組み合わされてもよい。
【０００８】
図１を参照して、ソフトウェア分析をする例示の計算デバイス１００は、プロセッサ１２０と、Ｉ／Ｏサブシステム１２２と、メモリ１２４と、データストレージデバイス１２６とを含む。使用に際し、下記の通り、計算デバイス１００は、マネージドコードセグメントがネイティブコードセグメントを起動する時、そのネイティブコードセグメントのバイナリ分析を行うように構成されている。例えば、計算デバイス１００は、マネージドコードセグメントからネイティブコードセグメントへ移行するスレッドを実行してもよい。そうするにあたり、スレッドは、マネージドコードセグメントからネイティブコードセグメントへのコールを行っても良い。応答に際し、計算デバイス１００は、ネイティブコードセグメントのバイナリ分析を行い、そのバイナリ分析に基づくネイティブコードセグメントの複雑性のレベルを示す複雑性指標を生成する。そうするため、計算デバイス１００は、ネイティブコードセグメントに所定の複雑性規則を適用して、複雑性のレベルを決定する。
【０００９】
また、計算デバイス１００は、複雑性指標に基づき、スレッドの状態を記憶する。例えば、ネイティブコードが低レベルの複雑性のものである（例えば、単純である）ことを複雑性指標が示すとき、計算デバイス１００は現在のスレッドの状態を維持し、そのスレッドがネイティブコードを実行していたとしても、計算デバイス１００がマネージドコードを実行していることを示すように構成されている。したがって、スレッドは、複雑性レベルが低いネイティブコードを起動するとき、比較的時間のかかる状態移行を行わない。このように、幾つかのソフトウェア要素は応答性がより高くなることがある。例えば、ネイティブコードで実装されたユーザインターフェース要素は、マネージドコードとネイティブコードとの間で移行（ｔｒａｎｓｉｔｉｏｎ）する従来のランタイムによる実行に対して、応答性がより高くなることがある。他方、複雑性レベルがより高い（例えば、複雑である）ことを複雑性指標が示す場合、計算デバイス１００は、スレッドがネイティブコードを実行しているものとそのスレッドの状態を設定するように構成されている。
【００１０】
計算デバイス１００は、マネージドコードセグメントとネイティブコードセグメントを実行できる、そうでなければここに説明の機能を実行できるいかなる種類のデバイスとして実施してもよい。例えば、計算デバイス１００は、ラップトップコンピュータ、ノートブックコンピュータ、タブレットコンピュータ、スマートフォン、モバイル計算デバイス、コンピュータ、デスクトップコンピュータ、ワークステーション、サーバコンピュータ、分散計算システム、マルチプロセッサシステム、コンシューマエレクトロニクスデバイス、スマート機器、及び／又はその他の計算デバイスであってソフトウェアコードセグメントを分析できるものとして実施してもよいが、これらに限定されない。  図１に示したように、例示の計算デバイス１００は、プロセッサ１２０、Ｉ／Ｏサブシステム１２２、メモリ１２４、及びデータストレージデバイス１２６を含む。もちろん、計算デバイス１００は、他の実施形態では、ワークステーションに一般的に見られるようなその他の又は付加的なコンポーネント（例えば、様々な入出力デバイスなど）を含み得る。また、幾つかの実施形態では、例示したコンポーネントのうち一以上は、他のコンポーネントに組み込まれていても良く、又はその一部を構成していても良い。例えば、メモリ１２４又はその部分は、幾つかの実施形態では、プロセッサ１２０に組み込まれていても良い。
【００１１】
プロセッサ１２０は、ここに説明する機能を実行できる任意のタイプのプロセッサとして実施できる。例えば、このプロセッサは、シングル又はマルチコアプロセッサ、デジタルシグナルプロセッサ、マイクロコントローラ、又はその他のプロセッサ又は処理／制御回路として実施できる。同様に、メモリ１２４は、ここに説明する機能を実行できる、任意のタイプの揮発性又は不揮発性メモリ又はデータストレージとして実施できる。動作中、メモリ１２４は、オペレーティングシステム、アプリケーション、プログラム、ライブラリ、及びドライバなど、計算デバイス１００の動作中に用いられる様々なデータとソフトウェアを記憶できる。メモリ１２４は、Ｉ／Ｏサブシステム１２２を介してプロセッサ１２０に通信可能に結合している。Ｉ／Ｏサブシステム１１２は、プロセッサ１２０、メモリ１２４、及び計算デバイス１００のその他のコンポーネントとの入出力動作を容易にする回路及び／又はコンポーネントとして実施できる。例えば、Ｉ／Ｏサブシステム１２２は、メモリコントローラハブ、入出力制御ハブ、ファームウェアデバイス、通信リンク（すなわち、ポイント・ツー・ポイントリンク、バスリンク、ワイヤ、ケーブル、光ガイド、プリント回路板トレースなど）及び／又は入出力動作を容易にするその他のコンポーネント及びサブシステムとして、又はこれらを含むものとして実施できる。幾つかの実施形態では、Ｉ／Ｏサブシステム１２２は、システム・オン・チップ（ＳｏＣ）の一部を形成でき、単一の集積回路チップ上にプロセッサ１２０、メモリ１２４、及び計算デバイス１００のその他のコンポーネントとともに、組み込むことができる。
【００１２】
データストレージデバイス１２６は、例えば、メモリデバイスと回路、メモリカード、ハードディスクドライブ、固体ドライブ、その他の記憶デバイスなどの、データを短期又は長期にわたり格納するように構成された任意のタイプのデバイスとして実施できる。データストレージデバイス１２６は、マネージドコードセグメント、ネイティブコードセグメント、及びネイティブコードセグメントの複雑性を決定する規則を記憶していてもよい。
【００１３】
計算デバイス１００は通信サブシステム１２８も含んでいてもよい。これは、コンピュータネットワーク（図示せず）を介した計算デバイス１００とその他のリモートデバイスとの間の通信を可能にし得る、任意の通信回路、デバイスまたはそれらの集まりとして実施されてもよい。通信サブシステム１２８は、一以上の任意の通信技術（例えば、無線または有線通信）と、かかる通信を行う関連プロトコル（例えば、イーサネット（登録商標）、Ｂｌｕｅｔｏｏｔｈ（登録商標）、Ｗｉ−Ｆｉ（登録商標）、ＷｉＭＡＸなど）とを用いるように構成されていてもよい。
【００１４】
また、計算デバイス１００はディスプレイ１３を含んでいてもよい。これは、液晶ディスプレイ（ＬＣＤ）、発光ダイオード（ＬＥＤ）、プラズマディスプレイ、陰極線管（ＣＲＴ）、又はその他のタイプのディスプレイデバイスなど、デジタル情報を表示できる任意のタイプのディスプレイとして実施されてもよい。幾つかの実施形態では、計算デバイス１００は、一以上の周辺デバイス１３２を含んでいても良い。周辺デバイス１３２は、別の入出力デバイス、インタフェースデバイス、及び／又はその他のペリフェラルデバイスをいくつ含んでいてもよい。
【００１５】
ここで図２を参照して、例示の実施形態では、計算デバイス１００は、動作中に環境２００を確立する。例示の実施形態２００は、ネイティブコード開始モジュール２２２、バイナリ分析モジュール２２４、及びネイティブコード実行モジュール２３２を含む。環境２００の様々なモジュールは、ハードウェア、ファームウェア、ソフトウェア、またはこれらの組み合わせとして実施されてもよい。例えば、環境２００の様々なモジュール、ロジック、その他のコンポーネントは、計算デバイス１００のプロセッサ１２０又はその他のハードウェアコンポーネントの一部を構成しても、またはそれらにより確立されてもよい。そのため、幾つかの実施形態では、環境２００の一以上のモジュールは、電子デバイスの回路または集まり（例えば、ネイティブコード開始回路２２２、バイナリ分析回路２２４、ネイティブコード実行回路２３２など）として実施してもよい。言うまでもなく、かかる実施形態では、一以上の回路（例えば、ネイティブコード開始回路２２２、バイナリ分析回路２２４、ネイティブコード実行回路２３２など）が、プロセッサ１２０、メモリ１２４、Ｉ／Ｏサブシステム１２２、及び／又はデータストレージ１２６のうちの１つ以上の一部を構成してもよい。また、幾つかの実施形態では、例示のモジュールのうち１つ以上は、他のモジュールの一部を構成してもよく、及び／又は例示のモジュールのうち１つ以上は、互いに独立であってもよい。
【００１６】
使用時、計算デバイス１００はアプリケーション２０２を実行してもよく、それは一以上のスレッドを含んでいてもよい。例えば、図２に示した例示の実施形態では、アプリケーション２０２は第１のスレッド２０４と第２のスレッド２０６とを含む。実行中、第１のスレッド２０４と第２のスレッド２０６はメモリ空間２０８にアクセスしてもよい。例示のアプリケーション２０２は、マネージドコードセグメント２１４とネイティブコードセグメント２１６も含む。幾つかの実施形態では、ネイティブコードセグメント２１６のうちの一以上は、一以上のライブラリ、例えば共有ライブラリ２１８内に記憶されてもよい。共有ライブラリは、例えば、ダイナミックリンクライブラリ（ＤＬＬ）やダイナミックシェアードオブジェクト（ＤＳＯ）を含んでもよい。例示のアプリケーション２０２は、ネイティブコードセグメント２１６で少なくとも部分的に実装されたユーザインターフェース２１２を含み、一方アプリケーション２０２の他の部分はマネージドコードセグメント２１４で実装されている。もちろん、アプリケーション２０２は単に例示を目的として示されており、言うまでもなく、他のタイプのアプリケーション２０２（例えば、より多数のスレッドを有するアプリケーション）がここに説明の技術を用いて計算デバイス１００により実行されてもよい。
【００１７】
ネイティブコード開始モジュール２２２は、例えば、マネージドコードセグメント２１４を実行する第１のスレッド２０４などのスレッドからのコール２２２を受け取り、ネイティブコードセグメント２１６の１つを実行するように構成されている。それに応じて、ネイティブコード開始モジュール２２２は、例えば、関連の共有ライブラリ２１８をロードすることにより、ネイティブコードセグメント２１６をロードするように構成されている。また、ネイティブコード開始モジュール２２２は、ネイティブコードセグメント２１６が事前に登録されているか判断するように構成されている。例えば、ネイティブコード開始モジュール２２２は、ネイティブコードセグメント２１６が計算デバイス１００により分析され実行されたことを示すフラグ２２５が登録データベース２２３に記憶されているか判断してもよい。ネイティブコードセグメント２１６が登録されていれば、ネイティブコード開始モジュール２２２は、そのコードをバイナリ分析モジュール２２４に送り、登録データベース２２３にフラグ２２５を記憶する。これはネイティブコードセグメント２１６が登録されていることを示す。他方、ネイティブコードセグ面２１６が既に登録されている場合、ネイティブコード開始モジュール２２２は、直接、ネイティブコード実行モジュール２３２にネイティブコードセグメント２１６を送る。
【００１８】
バイナリ分析モジュール２２４は、ネイティブコードセグメント２１６のバイナリ分析を実行し、ネイティブコードセグメント２１６の複雑性レベルを決定するように構成されている。そうするために、バイナリ分析モジュール２２４は、ネイティブコードセグメント２１６を、分析する前にメモリ空間２０８にマップする。さらに、バイナリ分析モジュール２２４は、バイナリ分析に基づいて、ネイティブコードセグメント２１６の複雑性レベルを示す複雑性指標２２６を生成するように構成されている。例えば、複雑性指標２２６は、複雑性レベル及び／又はそれに関する品質を示す数値として実施されてもよい。ネイティブコードセグメント２１６の決定される複雑性レベルは、ネイティブコードセグメント２１６に含まれる命令、ループ、及び／又は間接的制御フローの数を含むがこれらに限定されない、複雑なコードを示すネイティブコードセグメント２１６の様々な品質に基づいても良い。このように、例示の実施形態では、複雑性指標２２６は、ネイティブコードセグメント２１６中の命令数、ネイティブコードセグメント２１６中のループ数、及び／又はネイティブコードセグメント２１６中の間接的制御フロー数を示しても良い。幾つかの実施形態では、バイナリ分析モジュール２２４は、後でより詳細に説明するように、ネイティブコードセグメント２１６を一以上の所定の複雑性規則と比較して、複雑性指標２２６の値を決定してもよい。また、バイナリ分析を行うにあたり、バイナリ分析モジュール２２４は、ネイティブコードセグメント２１６を通る可能な実行パスを確定する一以上の制御フローグラフ２３０を生成するように構成されていてもよい。バイナリ分析モジュール２２４による制御フローグラフ２３０の生成を後でより詳しく説明する。
【００１９】
ネイティブコード実行モジュール２３２は、複雑性指標２２６に基づき、対応するスレッド（例えば、第１のスレッド２０４）の状態２３６を記憶し、対応するスレッド（例えば、第１のスレッド２０４）中のネイティブコードセグメント２１６を実行する。例えば、ネイティブコード実行モジュール２３２は、ネイティブコード実行モジュール２３２から複雑性指標２２６を受け取って、その複雑性指標２２６を所定の基準複雑性２３４と比較してもよい。複雑性指標２２６が所定の基準複雑性２３４を満たす場合（例えば、複雑性指標２２６が所定の基準複雑性２３４以下である場合）、ネイティブコード実行モジュール２３２は、対応するスレッド（例えば、第１のスレッド２０４）がマネージドコードを実行していることを示すスレッド状態２３６を設定する。幾つかの実施形態では、スレッド状態２３６は、すでに設定され、第１のスレッド２０４がマネージドコードを実行しており、ネイティブコード実行モジュール２３２は単にスレッド状態２３６を現在の設定に維持してもよい。対照的に、複雑性指標２２６が所定の基準複雑性２３４を満たさない場合（例えば、複雑性指標２２６が所定の基準複雑性２３４より大きい場合）、ネイティブコード実行モジュール２３２は、ネイティブコードセグメント２１６のロックを行い（ｉｎｉｔｉａｔｅ）、スレッド状態２３６を変更して、そのスレッドがネイティブコードを実行していることを示すように構成されている。また、第１のスレッド２０４がネイティブコードセグメント２１６の実行を完了したとき、ネイティブコード実行モジュール２３２は、第２のロックを行い、スレッド状態２３６を変更して、第１のスレッド２０４がマネージドコードを実行していることを示すように構成されている。
【００２０】
図３を参照して、使用時、計算デバイス１００は、バイナリ分析を用いてマネージドコード（例えば、マネージドコードセグメント２１４）からネイティブコード（例えば、ネイティブコードセグメント２１６）を起動する方法３００を実行してもよい。方法３００は、ブロック３０２で始まり、計算デバイス１００のネイティブコード開始モジュール２２２がスレッド（例えば、第１のスレッド２０４）からコール（例えば、コール２２０）を受け取り、ネイティブのコードセグメント（例えば、ネイティブコードセグメント２１６）を実行する。ブロック３０４に示したように、幾つかの実施形態では、ネイティブコード開始モジュール２２２がコール２２０を受け取ってネイティブコードセグメント２１６を実行するとき、コールするスレッドはマネージドコード、例えば、マネージドコードセグメント２１４を実行していてもよい。ブロック３０６に示したように、幾つかの実施形態では、計算デバイス１００は共有ライブラリ、例えば共有ライブラリ２１８からネイティブコードセグメント２１６をロードしてもよい。ブロック３０８において、計算デバイス１００は、ネイティブコードセグメント２１６がすでに登録されているか判断する。例えば、幾つかの実施形態では、計算デバイス１００は、ネイティブコードセグメント２１６が登録されていることを示す指標又はフラグ２２５を登録データベースが含むか判断してもよい。
【００２１】
ネイティブコードセグメント２１６がすでに登録されている場合、方法３００はブロック３２２に進み、計算デバイス１００は、ネイティブコードセグメント２１６を実行する替わりに、ネイティブコードセグメント２１６のバイナリ分析を行う。他方、ブロック３０８においてネイティブコードセグメント２１６がまだ登録されていないと計算デバイス１００が判断すると、方法３００はブロック３１０に進む。ブロック３１０において、計算デバイス１００は、ネイティブコードセグメント２１６の複雑性を分析する。例えば、例示の実施形態では、計算デバイス１００は、ブロック３１２において、ネイティブコードセグメント２１６のバイナリ分析を行う。そうするために、計算デバイス１００は、ネイティブコードセグメント２１６に対するバイナリ分析を行う任意の好適な方法を利用してもよい。ブロック３１２で行っても良いバイナリ分析を行う例示的方法を、図４の方法４００を参照して後で説明する。
【００２２】
ブロック３１４において、計算デバイス１００は、複雑性分析に基づいてネイティブコードセグメント２１６の複雑性レベルの表示（ｉｎｄｉｃａｔｉｏｎ）を提供する複雑性指標（例えば、複雑性指標２２６）を生成してもよい。再び、計算デバイス１００は、好適な方法を利用して、複雑性指標（ｃｏｍｐｌｅｘｉｔｙ  ｉｎｄｉｃａｔｏｒ）を生成してもよい。ブロック３１４で行っても良い複雑性指標を生成する例示的方法は、図５の方法５００を参照して後で説明する。
【００２３】
幾つかの実施形態では、計算デバイス１００（例えば、ネイティブコード開始モジュール２２２）は、マネージドコードを実行しているスレッドからコールを受け取るのに応じてブロック３１０を実行するのではなく、予めネイティブコードをロードして、予めブロック３１２のバイナリ分析を行う。例えば、計算デバイスは、事前コンパイル（ａｈｅａｄ  ｏｆ  ｔｉｍｅ  ｃｏｍｐｉｌａｔｉｏｎ）中に、ネイティブコードをロードして、そのネイティブコードに対するバイナリ分析を行ってもよい。かかる実施形態では、ネイティブコード開始モジュール２２２がスレッド２０４からコールを受け取ると、計算デバイス１００は、コールしているスレッド２０４により、事前コンパイルのネイティブコードのハッシュを実行すべきネイティブコードのハッシュと比較することにより、実行すべきネイティブコード（例えば、共有ライブラリ）が事前コンパイルで以前分析されたのと同じネイティブコードであることを確認する。
【００２４】
計算デバイス１００がブロック３１０においてネイティブコードを分析した後、方法３００はブロック３１６に進む。ブロック３１６において、計算デバイス１００は、複雑性指標２２６は複雑性レベルが低いことを示すか判断する。そうする為に、例えば、計算デバイスは、ブロック３１４において決定した複雑性指標２２６を、所定の基準複雑性２３４と比較してもよい。複雑性指標２２６が所定の基準複雑性２３４を満たす（例えば、以下である）場合、計算デバイス１００は、複雑性レベルが低い（例えば、単純である）ことを複雑性指標２２６が示すものと判断してもよい。しかし、複雑性指標２２６が所定の基準複雑性２３４を満たさない（例えば、より大きい）場合、計算デバイス１００は、複雑性レベルがより高い（例えば、複雑である）ことを複雑性指標２２６が示すものと判断してもよい。
【００２５】
ブロック３１６において、ネイティブコードが複雑であると複雑性指標２２６が示すとき、方法３００はブロック３１８に進み、計算デバイス１００はスレッド状態２３６を変更して、コードセグメントがネイティブコードであることを示す。方法３００はその後ブロック３２２に進み、計算デバイス１００はネイティブコードセグメントを実行する。
【００２６】
しかし、ブロック３１６においてネイティブコードが複雑でないと複雑性指標２２６が示す場合、方法３００はブロック３２０に進む。ブロック３２０において、計算デバイス１００はスレッド状態２３６を設定または維持して、（コードセグメントが実際にはネイティブコードであったとしても）コードセグメントがマネージドコードであることを示す。スレッド状態２３６がマネージドコードの表示からネイティブコードの表示に移行することを避けることにより、計算デバイス１００は、ネイティブコードセグメント２１６の処理に大幅な遅延を生じさせるロックが、ネイティブコードセグメント２１６にかけられることを防止する。例えば、ネイティブコードセグメント２１６がユーザインターフェース２１２の機能を制御する実施形態では、スレッド状態２３６がマネージドコードの表示からネイティブコードの表示に移行することを防止することにより、ユーザインターラクションに対するユーザインターフェースの応答性が向上してもよく、ロックされてスレッド状態２３６が変わることを回避してもよい。
【００２７】
ブロック３１８においてスレッド状態２３６が変更された後、又はブロック３２０で設定／維持された後、方法はブロック３２２に進む。ブロック３２２において、計算デバイス１００はネイティブコードセグメントを実行する。方法３００はその後ブロック３００にループバックし、計算デバイス１００のネイティブコード開始モジュール２２２が、ネイティブコードセグメントを実行するスレッドから他のコールを受け取っても良い。
【００２８】
ここで図４を参照して、上記の通り、計算デバイス１００は、（例えば、図３の方法３００のブロック３１２における）動作中にネイティブコードにバイナリ分析を行う方法４００を実行してもよい。方法４００はブロック４０２で始まり、計算デバイス１００はネイティブコードセグメント２１６を第１のスレッド２０４のメモリ空間２０８にマップする。その後、ブロック４０４において、計算デバイス１００は、メモリ空間２０８中のネイティブコードセグメントの開始アドレス（例えば、図６に示す開始アドレス６０２）を決定する。ブロック４０６において、計算デバイス１００は、開始アドレスにおいて部分的制御グラフ（例えば、制御フローグラフ２３０の１つ）を開始する。
【００２９】
その後、ブロック４０８において、計算デバイス１００は、ネイティブコードセグメント２１６中に未確認のオプコード（例えば、図６の未確認オプコード）が検出されたか判断する。そうであれば、方法４００はブロック４１２に進み、計算デバイス１００は、そのコードセグメントが複雑な構造（すなわち、未確認オプコード）を有することを特定する。方法４００はその後ブロック４２０に進み、計算デバイス１００は現在の部分的制御フローグラフを終了する。
【００３０】
ブロック４０８に戻り、計算デバイス１００がネイティブコードセグメント２１６中に未確認オプコード６０４を何も発見しない場合、方法４００はブロック４１０に進む。  ブロック４１０において、計算デバイス１００は、ネイティブコードセグメント２１６中に間接的制御フロー（例えば、図６の間接的制御フロー６１２）が検出されたか判断する。そうであれば、方法４００はブロック４１２に進み、計算デバイス１００は、そのコードセグメントが複雑な構造（すなわち、間接的制御フロー）を有することを特定する。方法４００はその後ブロック４２０に進み、計算デバイス１００は現在の部分的制御フローグラフを終了する。
【００３１】
ブロック４１０に戻り、計算デバイス１００が間接的制御フローを何も検出しない場合、方法４００はブロック４１４に進む。ブロック４１４において、計算デバイス１００は、ネイティブコードセグメント２１６中にリターンコマンド（例えば、図６のリターンコマンド６０８）が検出されたか判断する。そうであれば、方法４００はブロック４２０に進み、計算デバイス１００は現在の部分的制御フローグラフを終了する。
【００３２】
ブロック４１４に戻り、計算デバイス１００がリターンコマンド６０８を検出しない場合、方法４００はブロク４１６に進む。ブロック４１６において、計算デバイス１００は、ネイティブコードセグメント２１６中にネストされた関数コール（例えば、図６のネストされた関数コール６１０）が検出されたか判断する。そうであれば、方法４００はブロック４１８に進み、計算デバイス１００は新しい部分的制御フローグラフを開始し（ｉｎｉｔｉａｔｅ）、方法はブロック４０８にループバックして、上記の通り、ブロック４０８−４１６における新しい部分的制御フローグラフの分析を開始する。しかし、計算デバイス１００がネイティブコードセグメント２１６中にネストされた関数コール６１０を検出しない場合、方法４００はブロック４２０に進み、計算デバイス１００は現在の部分的制御フローグラフを終了する。
【００３３】
ここで図５を参照して、上記の通り、計算デバイス１００は、（例えば、図３の方法３００のブロック３１４における）動作中にネイティブコードセグメント２１６の複雑性レベルを示す複雑性指標を生成してもよい。方法５００はブロック５０２で始まり、計算デバイス１００はネイティブコードセグメント２１６にある命令数６００とループ数６０６を決定する。そうするため、計算デバイス１００は、例えば、図４の方法４００により生成された制御フローグラフを分析してもよい。その後、ブロック５０４において、計算デバイス１００は、ネイティブコードセグメント２１６中の命令数６００が所定の閾値命令数７００を満たすか判断する。例えば、計算デバイス１００は、命令数６００が所定の閾値命令数７００より大きいか（又は、以上か）判断してもよい。所定閾値命令数７００は、例えば、複雑性規則２２８に格納されていてもよい。命令数６００が所定閾値命令数７００を満たすとき、方法５００はブロック５０６に進み、計算デバイス１００が複雑性指標２２６を、より高い複雑性レベル（例えば、複雑）を示すように設定する。
【００３４】
しかし、命令数６００が所定閾値命令数７００を満たさないとき、不お法５００はブロック５０８に進み、ネイティブコードセグメント２１６中にループ６０６があるか、計算デバイス１００が判断する。そうするために、幾つかの実施形態では、計算デバイス１００は、ブロック５０２で決定されたループ数６０６が所定閾値ループ数を満たすか判断してもよい。他の実施形態では、計算デバイス１００は、少なくとも１つのループがあるとき、ネイティブコードセグメント２１６にはループ６０６があると判断する。それにも関わらず、ネイティブコードセグメント２１６中にループがあると計算デバイス１００が判断すると、方法５００はブロック５０６に進み、計算デバイス１００が複雑性指標２２６を、より高い複雑性レベル（例えば、複雑）を示すように設定する。
【００３５】
しかし、ネイティブコードセグメント２１６中にループ６０６がないと計算デバイス１００が判断すると、方法５００はブロック５１０に進む。ブロック５１０において、計算デバイスは、上記の方法４００で決定されるように、ネイティブコードセグメント２１６中に複雑なコード構造があるか判断する。例えば、計算デバイス１００は、ネイティブコードセグメント２１６中に未確認オプコード及び／又は関節的制御フローが検出されたか判断する。そうであれば、方法５００はブロック５０６に進み、計算デバイス１００は複雑性指標２２６を、より高い複雑性レベル（例えば、複雑）を示すように設定する。しかし、ネイティブコードセグメント２１６中に複雑な構造が検出されないと、方法５００はブロック５１２に進み、計算デバイス１００が複雑性指標２２６を、より低い複雑性レベル（例えば、単純）を示すように設定する。
【００３６】
ここで図６を参照して、計算デバイス１００により実行されてもよいネイティブコードセグメント２１６のコンポーネントの単純化したブロック図が示される。例示のネイティブコードセグメント２１６は命令６００を含む。これは、バイトコードではなく、オブジェクトコードまたはマシンコードなどのバイナリ命令として実施されてもよい。また、ネイティブコードセグメント２１６は、開始アドレス６０２、例えばネイティブコードセグメント２１６中の関数の第１の命令のロケーションを示すメモリアドレスを例示的に含む。より具体的には、幾つかの実施形態において、図２を参照して説明するコール２２０は、開始アドレス６０２で始まる関数を実行するコールとして実施してもよい。例示のネイティブコードセグメント２１６は、付加的に、計算デバイス１００により実行される演算を指定するオプコード（ｏｐｃｏｄｅｓ）６０４を含んでいてもよい。また、少なくとも幾つかの実施形態において、ネイティブコードセグメント２１６は一以上のループ６０６を含んでもよい。さらに、幾つかの実施形態において、ネイティブコードセグメント２１６は、実行スレッド（例えば、第１のスレッド２０４）をコールしている関数に返すリターンコマンド６０８を含んでもよい。また、幾つかの実施形態において、例示のネイティブコードセグメント２１６は、一以上のネストされた関数コール６１０を含んでいてもよい。すなわち、ネイティブコードセグメント２１６に規定された関数は、ネストされた関数コール６１０を用いて他の関数をコールしてもよい。さらに、例示のネイティブコードセグメント２１６は、間接的制御フロー６１２を含んでもよい。これは、実行すべき次の命令のアドレスを含むメモリロケーションを指定するプログラム制御命令として実施されるものである。
【００３７】
ここで図７を参照して、計算デバイス１００により適用されて複雑性指標２２６を生成してもよい複雑性規則２２８の一実施形態の単純化したブロック図を示す。例示の複雑性規則２２８は、所定の閾値命令数７００を含む。例えば、図５を参照して上で説明したように、計算デバイス１００は、ネイティブコードセグメント２１６中の命令６００の数を、閾値命令数７００と比較して、ネイティブコードセグメント２１６が複雑か判断してもよい。さらに、例示の複雑性規則２２８は、閾値ループ数７０２を含んでもよい。幾つかの実施形態では、上記の通り、閾値ループ数７０２は１と規定されてもよい。したがって、かかる実施形態では、計算デバイス１００は、ネイティブコードセグメント２１６中に１つのループ６０６を検出すると、そのネイティブコードセグメント２１６がより高い複雑性レベル（例えば、複雑）を有すると判断する。もちろん、他の実施形態では、閾値ループ数７０２は１より大きくてもよい。また、例示の複雑性規則２２８は、複雑な構造規則７０４を含んでいてもよい。例えば、複雑性構造規則７０４は、計算デバイスが、ネイティブコードセグメント２１６中に複雑な構造（例えば、間接的制御フロー６１２または未確認オプコード６０４）を検出したとき、ネイティブコードセグメント２１６を複雑であると考えねばならないことを示す規則として実施してもよい。
《実施例》
本明細書に開示の技術の例を以下に記載する。本技術の実施形態は、以下に記載の一以上の例、及びそれらの組み合わせを含み得る。
【００３８】
実施例１は、バイナリ分析を用いてマネージドコードからネイティブコードを起動する計算デバイスであって、マネージドコードセグメントを実行するように構成されたスレッドからネイティブコードセグメントを実行するコールを受け取るネイティブコード開始モジュールと、（ｉ）前記ネイティブコードセグメントのバイナリ分析を行い、（ｉｉ）前記バイナリ分析に基づいて前記ネイティブコードセグメントの複雑性レベルを決定するバイナリ分析モジュールと、前記決定された複雑性レベルに基づいて前記スレッドの状態を決定し、前記スレッドの状態に基づいて前記ネイティブコードセグメントを実行するネイティブコード実行モジュールであって、前記スレッドの状態は前記ネイティブコードセグメントがネイティブコードセグメントまたはマネージドコードセグメントとして実行されるかを示す、ネイティブコード実行モジュールとを有する。
【００３９】
実施例２は実施例１の主題を含み、前記ネイティブコード開始モジュールはさらに、前記ネイティブコードセグメントが登録を要するか決定し、ネイティブコードセグメントが登録を要するとの決定に応じて、前記ネイティブコードセグメントを前記バイナリ分析モジュールに送る。
【００４０】
実施例３は実施例１及び２のどちらかの主題を含み、前記ネイティブコード開始モジュールはさらに、共有ライブラリから前記ネイティブコードセグメントをロードする。
【００４１】
実施例４は実施例１−３のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記スレッドに関連するメモリ空間に前記ネイティブコードセグメントをマップする。
【００４２】
実施例５は実施例１−４のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメント中の命令数を決定し、前記命令数が所定の閾値命令数を満たすか決定し、前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記命令数が前記所定の閾値命令数を満たすとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有するとの決定、及び（ｉｉ）前記命令数が前記所定の閾値命令数を満たさないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有するとの決定を含む。
【００４３】
実施例６は実施例１−５のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメント中にループがあるか決定し、前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記ネイティブコードセグメント中にループが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定すること、及び（ｉｉ）前記ネイティブコードセグメント中にループが存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定することを含む。
【００４４】
実施例７は実施例１−６のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、間接的制御フローと未確認オプコードとのうち少なくとも１つが前記ネイティブコードセグメントにあるか決定し、前記ネイティブコードセグメントの複雑性レベルの決定は、（ｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとの少なくとも１つが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定すること、及び（ｉｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとがいずれも存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定することを含む。
【００４５】
実施例８は実施例１−７のいずれかの主題を含み、前記バイナリ分析モジュールは、さらに、決定された複雑性レベルを示す複雑性指標を生成する。
【００４６】
実施例９は実施例１−８のいずれかの主題を含み、前記ネイティブコード実行モジュールはさらに、前記複雑性指標が低い複雑性レベルまたは高い複雑性レベルを示すか特定し、前記複雑性指標が低い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を維持して、前記ネイティブコードセグメントがマネージドコードとして実行されるべきことを示し、前記複雑性指標が高い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を設定して、前記ネイティブコードセグメントがネイティブコードとして実行されるべきことを示す。
【００４７】
実施例１０は実施例１−９のいずれかの主題を含み、前記複雑性指標は前記ネイティブコードセグメントと関連付けて記憶され、前記ネイティブコード開始モジュールはさらに、前記複雑性指標を読み出し、前記ネイティブコードセグメントに関連付けて記憶された第１のハッシュを読み出し、前記第１のハッシュを、前記ネイティブコードセグメントに関連する第２のハッシュと比較して、前記ネイティブコードセグメントを実行するコールに応じて、前記複雑性指標が記憶されてから、前記ネイティブコードセグメントが変わったか決定する。
【００４８】
実施例１１は実施例１−１０のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメントの開始アドレスを決定し、前記ネイティブコードセグメントの開始アドレスにあるネイティブ命令から始まる少なくとも部分的制御フローグラフを生成する。
【００４９】
実施例１２は実施例１−１１のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメントにリターンコマンドがあるか検出し、前記ネイティブコードセグメント中のリターンコマンドの検出に応じて、前記部分的制御フローグラフを終了する。
【００５０】
実施例１３は実施例１−１２のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメントに未確認オプコードがあるか検出し、前記ネイティブコードセグメント中の未確認オプコードの検出に応じて、前記部分的制御フローグラフを終了する。
【００５１】
実施例１４は実施例１−１３のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメントに間接制御フローがあるか検出し、前記ネイティブコードセグメント中の間接制御フローの検出に応じて、前記部分的制御フローグラフを終了する。
【００５２】
実施例１５は実施例１−１４のいずれかの主題を含み、前記部分的制御フローグラフは第１の部分的制御フローグラフであり、前記バイナリ分析モジュールはさらに、前記ネイティブコードセグメントにネストされた関数コールがあるか検出し、前記ネイティブコードセグメントにおけるネストされた関数コールの検出に応じて、前記ネストされた関数コールに基づく第２の部分的制御フローグラフを生成する。
【００５３】
実施例１６は実施例１−１５のいずれかの主題を含み、前記バイナリ分析モジュールはさらに、事前コンパイルプロセス中に前記ネイティブコードセグメントのバイナリ分析を行う。
【００５４】
実施例１７は、バイナリ分析を用いてマネージドコードからネイティブコードを起動する方法であって、計算デバイスが、マネージドコードセグメントを実行するように構成されたスレッドからネイティブコードセグメントを実行するコールを受け取るステップと、前記計算デバイスが、前記ネイティブコードセグメントのバイナリ分析を行うステップと、前記計算デバイスが、前記バイナリ分析に基づいて前記ネイティブコードセグメントの複雑性レベルを決定するステップと、前記計算デバイスが、前記決定された複雑性レベルに基づいて、前記スレッドの状態を決定するステップと、前記計算デバイスが、前記スレッドの状態に基づいて前記ネイティブコードセグメントを実行するステップであって、前記スレッドの状態は、前記ネイティブコードセグメントをネイティブまたはマネージドコードセグメントとして実行すべきかを示すステップを含む。
【００５５】
実施例１８は実施例１７の主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメントが登録を要するか決定するステップと、前記計算デバイスが、前記ネイティブコードセグメントが登録を要するとの決定に応じて、前記ネイティブコードセグメントに前記バイナリ分析を行うステップとをさらに含む。
【００５６】
実施例１９は実施例１７及び１８のどちらかの主題を含み、さらに、前記計算デバイスが、共有ライブラリから前記ネイティブコードセグメントをロードするステップを含む。
【００５７】
実施例２０は実施例１７−１９のいずれかの主題を含み、前記計算デバイスが、前記ネイティブコードセグメントを、前記スレッドに関連するメモリ空間にマップするステップをさらに含む。
【００５８】
実施例２１は実施例１７−２０のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメント中の命令数を決定するステップと、前記計算デバイスが、前記命令数が所定の閾値命令数を満たすか決定するステップと、前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記命令数が前記所定の閾値命令数を満たすとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップ、及び（ｉｉ）前記命令数が前記所定の閾値命令数を満たさないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップとを含む。
【００５９】
実施例２２は実施例１７−２１のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメント中にループがあるか決定するステップをさらに含み、前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記ネイティブコードセグメント中にループが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップ、及び（ｉｉ）前記ネイティブコードセグメント中にループが存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップを含む。
【００６０】
実施例２３は実施例１７−２２のいずれかの主題を含み、さらに、前記計算デバイスは、間接的制御フローと未確認オプコードとのうち少なくとも１つが前記ネイティブコードセグメントにあるか決定するステップをさらに含み、前記ネイティブコードセグメントの複雑性レベルを決定するステップは、（ｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとの少なくとも１つが存在するとの決定に応じて、前記ネイティブコードセグメントが高い複雑性レベルを有すると決定するステップと、（ｉｉ）前記ネイティブコードセグメントに間接的制御フローと未確認オプコードとがいずれも存在しないとの決定に応じて、前記ネイティブコードセグメントが低い複雑性レベルを有すると決定するステップとを含む。
【００６１】
実施例２４は実施例１７−２３のいずれかの主題を含み、さらに、前記計算デバイスが、前記決定された複雑性レベルを示す複雑性指標を生成するステップをさらに含む。
【００６２】
実施例２５は実施例１７−２４のいずれかの主題を含み、さらに、前記計算デバイスが、前記複雑性指標が低い複雑性レベルまたは高い複雑性レベルを示すか特定するステップと、前記スレッドの状態を決定するステップは、（ｉ）前記複雑性指標が低い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を維持して、前記ネイティブコードセグメントがマネージドコードとして実行されるべきであると示すステップと、（ｉｉ）前記複雑性指標が高い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を設定して、前記ネイティブコードセグメントがコードとして実行されるべきであると示すステップとを含む。
【００６３】
実施例２６は実施例１７−２５のいずれかの主題を含み、前記複雑性指標は前記ネイティブコードセグメントと関連付けて記憶され、前記方法はさらに、前記計算デバイスが前記複雑性指標を受け取るステップと、前記計算デバイスが、前記ネイティブコードセグメントに関連付けて記憶された第１のハッシュを読み出すステップと、前記計算デバイスが、前記ネイティブコードセグメントを実行するコールに応じて、前記第１のハッシュを、前記ネイティブコードセグメントに関連する第２のハッシュと比較して、前記複雑性指標が記憶されてから、前記ネイティブコードセグメントが変わったか決定するステップとを含む。
【００６４】
実施例２７は実施例１７−２６のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメントの開始アドレスを決定するステップと、前記池井さんデバイスが、前記ネイティブコードセグメントの開始アドレスにあるネイティブ命令から始まる少なくとも部分的制御フローグラフを生成する。
【００６５】
実施例２８は実施例１７−２７のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメントにリターンコマンドがあるか検出するステップと、前記計算デバイスが、前記ネイティブコードセグメント中のリターンコマンドの検出に応じて、前記部分的制御フローグラフを終了するステップとを含む。
【００６６】
実施例２９は実施例１７−２８のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメントに未確認オプコードがあるか検出するステップと、前記計算デバイスが、前記ネイティブコードセグメント中の未確認オプコードの検出に応じて、前記部分的制御フローグラフを終了するステップとを含む。
【００６７】
実施例３０は実施例１７−２９のいずれかの主題を含み、さらに、前記計算デバイスが、前記ネイティブコードセグメントに間接制御フローがあるか検出するステップと、前記計算デバイスが、前記ネイティブコードセグメント中の間接制御フローの検出に応じて、前記部分的制御フローグラフを終了するステップとを含む。
【００６８】
実施例３１は実施例１７−３０のいずれかの主題を含み、前記部分的制御フローグラフは第１の部分的制御フローグラフであり、前記方法はさらに、前記計算デバイスが、前記ネイティブコードセグメントにネストされた関数コールがあるか検出するステップと、前記計算デバイスが、前記ネイティブコードセグメントにおけるネストされた関数コールの検出に応じて、前記ネストされた関数コールに基づく第２の部分的制御フローグラフを生成するステップとを含む。
【００６９】
実施例３２は実施例１７−３１のいずれかの主題を含み、前記バイナリ分析を行うステップは、事前コンパイルプロセス中に前記ネイティブコードセグメントのバイナリ分析を行うステップを含む。
【００７０】
実施例３３は、実行されると、計算デバイスに請求項１７乃至３２いずれか一項に記載の方法を実行させる複数の命令を含む一以上の機械読み取り可能記憶媒体を含む。
【００７１】
実施例３４は、バイナリ分析を用いてマネージドコードからネイティブコードを起動する計算デバイスであって、マネージドコードセグメントを実行するように構成されたスレッドからネイティブコードセグメントを実行するコールを受け取る手段と、前記ネイティブコードセグメントのバイナリ分析を行う手段と、前記バイナリ分析に基づいて前記ネイティブコードセグメントの複雑性レベルを決定する手段と、前記決定された複雑性レベルに基づいて前記スレッドの状態を決定する手段と、前記スレッドの状態に基づいて前記ネイティブコードセグメントを実行する手段であって、前記スレッドの状態は、前記ネイティブコードセグメントをネイティブまたはマネージドコードセグメントとして実行すべきかを示す手段とを含む。
【００７２】
実施例３５は実施例３４の主題を含み、さらに、前記ネイティブコードセグメントが登録を要するか決定する手段と、前記ネイティブコードセグメントが登録を要するとの決定に応じて、前記ネイティブコードセグメントに前記バイナリ分析を行う手段とを含む。
【００７３】
実施例３６は実施例３４及び３５のどちらかの主題を含み、さらに、共有ライブラリから前記ネイティブコードセグメントをロードする手段を含む。
【００７４】
実施例３７は実施例３４−３６のいずれかの主題を含み、さらに、前記ネイティブコードセグメントを前記スレッドに関連するメモリ空間にマップする手段を含む。
【００７５】
実施例３８は実施例３４−３７のいずれかの主題を含み、さらに、前記ネイティブコードセグメント中の命令数を決定する手段と、前記命令数が所定の閾値命令数を満たすか決定する手段とを含み、前記ネイティブコードセグメントの複雑性レベルを決定する手段は、命令数が所定の閾値命令数を満たすとの決定に応じて、前記コードセグメントが高い複雑性レベルを有すると決定する手段と、命令数が所定の閾値命令数を満たさないとの決定に応じて、前記コードセグメントが低い複雑性レベルを有すると決定する手段とを有する。
【００７６】
実施例３９は実施例３４−３８のいずれかの主題を含み、さらに、前記ネイティブコードセグメント中にループがあるか決定する手段を含み、前記ネイティブコードセグメントの複雑性レベルを決定する手段は、前記ネイティブコードセグメント中にループがあるとの決定に応じて、前記コードセグメントが高い複雑性レベルを有すると決定する手段と、前記ネイティブコードセグメント中にループが無いとの決定に応じて、前記コードセグメントが低い複雑性レベルを有すると決定する手段とを含む。
【００７７】
実施例４０は実施例３４−３９のいずれかの主題を含み、さらに、間接的制御フローと未確認オプコードとのうち少なくとも１つが前記ネイティブコードセグメントにあるか決定する手段を含み、前記ネイティブコードセグメントの複雑性レベルを決定する手段は、前記ネイティブコードセグメント中に間接的制御フローと未確認オプコードとのうち少なくとも１つがあるとの決定に応じて、前記コードセグメントが高い複雑性レベルを有すると決定する手段と、前記ネイティブコードセグメントに間接的制御フローも未確認オプコードもどちらも無いとの決定に応じて、前記ネイティブコードセグメントが低い複雑性を有すると決定する手段とを含む。
【００７８】
実施例４１は実施例３４−４０のいずれかの主題を含み、さらに、決定された複雑性レベルを示す複雑性指標を生成する手段を含む。
【００７９】
実施例４２は実施例３４−４１のいずれかの主題を含み、さらに、前記複雑性指標が低い複雑性レベルまたは高い複雑性レベルを示すか特定する手段を含み、前記スレッドの状態を決定する手段は、さらに、前記複雑性指標が低い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を維持して、前記ネイティブコードセグメントがマネージドコードとして実行すべきことを示す手段と、前記複雑性指標が高い複雑性レベルを示すとの決定に応じて、前記スレッドの状態を設定して、前記ネイティブコードセグメントがネイティブコードとして実行されるべきことを示す手段とを含む。
【００８０】
実施例４３は実施例３４−４２のいずれかの主題を含み、前記複雑性指標は前記ネイティブコードセグメントと関連付けて記憶され、前記計算デバイスは、さらに、前記複雑性指標を読み出す手段と、前記ネイティブコードセグメントに関連付けて記憶された第１のハッシュを読み出す手段と、前記第１のハッシュを、前記ネイティブコードセグメントに関連する第２のハッシュと比較して、前記ネイティブコードセグメントを実行するコールに応じて、前記複雑性指標が記憶されてから、前記ネイティブコードセグメントが変わったか決定する手段とを含む。
【００８１】
実施例４４は実施例３４−４３のいずれかの主題を含み、さらに、前記ネイティブコードセグメントの開始アドレスを決定する手段と、前記ネイティブコードセグメントの開始アドレスにあるネイティブ命令から始まる少なくとも部分的制御フローグラフを生成する手段と、を含む。
【００８２】
実施例４５は実施例３４−４４のいずれかの主題を含み、さらに、前記ネイティブコードセグメントにリターンコマンドがあるか検出する手段と、前記ネイティブコードセグメント中のリターンコマンドの検出に応じて、前記部分的制御フローグラフを終了する手段とを含む。
【００８３】
実施例４６は実施例３４−４５のいずれかの主題を含み、さらに、前記ネイティブコードセグメントに未確認オプコードがあるか検出する手段と、前記ネイティブコードセグメント中の未確認オプコードの検出に応じて、前記部分的制御フローグラフを終了する手段とを含む。
【００８４】
実施例４７は実施例３４−４６のいずれかの主題を含み、さらに、前記ネイティブコードセグメントに間接制御フローがあるか検出する手段と、前記ネイティブコードセグメント中の間接制御フローの検出に応じて、前記部分的制御フローグラフを終了する手段とを含む。
【００８５】
実施例４８は実施例３４−４７のいずれかの主題を含み、前記部分的制御フローグラフは第１の部分的制御フローグラフであり、前記計算デバイスはさらに、前記ネイティブコードセグメントにネストされた関数コールがあるか検出する手段と、前記ネイティブコードセグメントにおけるネストされた関数コールの検出に応じて、前記ネストされた関数コールに基づく第２の部分的制御フローグラフを生成する手段とを含む。
【００８６】
実施例４９は実施例３４−４８のいずれかの主題を含み、前記バイナリ分析を行う手段は、事前コンパイルプロセス中に前記ネイティブコードセグメントのバイナリ分析を行う手段を含む。
【図１】
2017117451.tif 000003
【図２】
2017117451.tif 000004
【図３】
2017117451.tif 000005
【図４】
2017117451.tif 000006
【図５】
2017117451.tif 000007
【図６】
2017117451.tif 000008
【図７】
2017117451.tif 000009
【外国語明細書】
2017117451000001.pdf