(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2023-09-12
(54)【発明の名称】コードストリーム折り畳み対応ハイブリッドバイナリ
(51)【国際特許分類】
G06F 9/44 20180101AFI20230905BHJP
G06F 8/41 20180101ALI20230905BHJP
【FI】
G06F9/44
G06F8/41
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023503141
(86)(22)【出願日】2021-04-20
(85)【翻訳文提出日】2023-03-14
(86)【国際出願番号】 US2021028042
(87)【国際公開番号】W WO2022046185
(87)【国際公開日】2022-03-03
(32)【優先日】2020-08-31
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
(71)【出願人】
【識別番号】314015767
【氏名又は名称】マイクロソフト テクノロジー ライセンシング,エルエルシー
(74)【代理人】
【識別番号】100079108
【氏名又は名称】稲葉 良幸
(74)【代理人】
【識別番号】100109346
【氏名又は名称】大貫 敏史
(74)【代理人】
【識別番号】100117189
【氏名又は名称】江口 昭彦
(74)【代理人】
【識別番号】100134120
【氏名又は名称】内藤 和彦
(74)【代理人】
【識別番号】100108213
【氏名又は名称】阿部 豊隆
(72)【発明者】
【氏名】レベディンスキー,パブロ
(72)【発明者】
【氏名】セケイラ デ ジュスト テイシェイラ,ペドロ ミゲル
(72)【発明者】
【氏名】ミホカ,ダレク ヨシップ
(72)【発明者】
【氏名】ベリー,ジョン ロバート
(72)【発明者】
【氏名】ダン,クラレンス シウ イェーン
(72)【発明者】
【氏名】タン,ティアンシェン
(72)【発明者】
【氏名】クリアリー,ジェームズ デイビッド
(72)【発明者】
【氏名】チュー,ヨンカン
(72)【発明者】
【氏名】トーマス,テオドール マックスウェル
(72)【発明者】
【氏名】ニウ,ベン
(72)【発明者】
【氏名】ハドリー,ラッセル チャールズ
【テーマコード(参考)】
5B081
5B376
【Fターム(参考)】
5B081CC00
5B376DA26
(57)【要約】
ネイティブプロセス及び互換(例えばエミュレートされた)プロセスの両方で動作可能なハイブリッドバイナリ。当該ハイブリッドバイナリがネイティブプロセスによりロードされた場合、当該プロセスはバイナリに含まれるネイティブコードストリームをプロセッサで直接実行する。ハイブリッドバイナリが互換プロセスによりロードされた場合、当該プロセスはエミュレーション互換(EC)コードストリームをプロセッサで直接実行する。互換プロセスで動作する場合、ECコードストリームはエミュレータで動作する外来コードストリームと対話することができる。外来コードストリームは、ハイブリッドバイナリ自身に含まれていても、又はハイブリッドバイナリの外来にあってもよい。ハイブリッドバイナリフォーマットは、ネイティブコードストリームとECコードストリームとの間のコードの折り畳みをサポートする。ハイブリッドバイナリは、互換プロセスで実行された場合にバイナリから得られたイメージデータに適用されるメモリ変換の集合を含んでいる。
【特許請求の範囲】
【請求項1】
ハイブリッドバイナリイメージを生成するプロセッサを含むコンピュータシステムに実装された方法であって、前記ハイブリッドバイナリイメージが、ネイティブアプリケーションバイナリインターフェース(ABI)及び互換ABIの両方で実行可能であり、前記方法が、
少なくとも前記ネイティブABIの第1の機械種別の識別に基づいて、前記第1の機械種別を前記ハイブリッドバイナリイメージの機械種別フィールドにエミットし、前記機械種別フィールドを、前記ハイブリッドバイナリイメージが前記ネイティブABIで実行されるネイティブプロセスによりロードされた場合に使用されるように構成することと、
少なくとも折り畳み不可能な第1の関数を識別することに基づいて、(i)前記ネイティブABIで実行可能な前記第1の関数の第1のコンパイル済みバージョン、及び(ii)前記互換ABIで実行可能な前記第1の関数の第2のコンパイル済みバージョンの両方を前記ハイブリッドバイナリイメージにエミットすることと、
少なくとも折り畳み可能な第2の関数を識別することに基づいて、前記ネイティブABI及び前記互換ABIの両方で実行可能な前記第2の関数のコンパイル済みバージョンであって、前記ハイブリッドバイナリイメージが前記ネイティブプロセスによりロードされた場合に前記第1の関数の第1のコンパイル済みバージョンを呼び出すように構造化された前記第2の関数のコンパイル済みバージョンを前記ハイブリッドバイナリイメージにエミットすることと、
前記ハイブリッドバイナリイメージが前記互換ABIで実行される互換プロセスによりロードされた場合に使用されるように構成された補正テーブルを前記ハイブリッドバイナリイメージにエミットすることと、を含み、前記補正テーブルが、前記ハイブリッドバイナリイメージからロードされたメモリデータに対する複数の変換を定義し、前記複数の変換が、
前記互換ABIの第2の機械種別を含むように前記機械種別フィールドを調整する第1の変換、及び
前記第1の関数の第1のコンパイル済みバージョンではなく前記第1の関数の第2のコンパイル済みバージョンを呼び出すように前記第2の関数のコンパイル済みバージョンを設定する第2の変換を含む方法。
【請求項2】
(i)前記第1の関数の第1のコンパイル済みバージョンを用いて少なくとも前記第1の関数を参照する第1の領域、(ii)前記第2の関数の前記コンパイル済みバージョンを用いて少なくとも前記第2の関数を参照する第2の領域、及び(iii)前記第1の関数の第2のコンパイル済みバージョンを用いて少なくとも前記第1の関数を参照する第3の領域を含む1個以上のテーブルを前記ハイブリッドバイナリイメージにエミットすること、及び
前記第3の領域を除いて前記第1の領域及び前記第2の領域を含む前記1個以上のテーブルのネイティブビューを提供する前記1個以上のテーブルへの参照であって前記ハイブリッドバイナリイメージが前記ネイティブプロセスによりロードされた場合に使用されるべく構造化された前記参照を前記ハイブリッドバイナリイメージにエミットすることを更に含み、
前記複数の変換がまた、前記1個以上のテーブルへの前記参照を調整して前記第1の領域を除いて前記第2の領域及び前記第3の領域を含む前記1個以上のテーブルの互換ビューを提供する第3の変換を更に含んでいる、請求項1に記載の方法。
【請求項3】
前記1個以上のテーブルが1個以上のインポートテーブルを含み、前記第1、第2、及び第3の領域が第1、第2、及び第3の関数インポートを含む、又は
前記1個以上のテーブルが1個以上のエクスポートテーブルを含み、前記第1、第2、及び第3の領域が第1、第2、及び第3の関数エクスポートを含んでいる、請求項2に記載の方法。
【請求項4】
前記1個以上のテーブルへの前記参照が、オフセット及びサイズを指定することにより前記1個以上のテーブルの前記ネイティブビューを提供し、前記第3の変換が前記オフセット又は前記サイズのうちの1個以上を補正することにより前記参照を調整して前記互換ビューを提供する、請求項2に記載の方法。
【請求項5】
前記第1の関数の第1のコンパイル済みバージョンを参照するエントリポイントを前記ハイブリッドバイナリイメージにエミットすることを更に含み、前記エントリポイントが、前記ハイブリッドバイナリイメージが前記ネイティブプロセスによりロードされた場合に使用されるべく構造化されている、請求項1に記載の方法。
【請求項6】
前記複数の変換がまた、前記第1の関数の第2のコンパイル済みバージョンを参照すべく前記エントリポイントを調整する第3の変換も含んでいる、請求項5に記載の方法。
【請求項7】
前記第2の関数の前記コンパイル済みバージョンが、前記第1の関数の第1のコンパイル済みバージョンを参照するディスパッチテーブルを介して前記第1の関数の第1のコンパイル済みバージョンを呼び出すべく構造化されていて、前記第2の変換が、前記第1の関数の第1のコンパイル済みバージョンではなく、前記第1の関数の第2のコンパイル済みバージョンを参照すべく前記ディスパッチテーブルを変更する、請求項1に記載の方法。
【請求項8】
前記ディスパッチテーブルを前記ハイブリッドバイナリイメージにエミットすることを更に含んでいる、請求項7に記載の方法。
【請求項9】
互換アプリケーションバイナリインターフェース(ABI)で動作するプロセスによりハイブリッドバイナリイメージを使用する、少なくとも1個のプロセッサを含むコンピュータシステムに実装された方法であって、前記ハイブリッドバイナリイメージがネイティブABI及び前記互換ABIの両方で動作可能であり、前記方法が、
前記ハイブリッドバイナリイメージのロード中に、前記ハイブリッドバイナリイメージの機械種別フィールドに保存されている第1の機械種別が、前記プロセスが動作している前記互換ABIの第2の機械種別と不適合であると判定することと、
前記第1の機械種別が前記第2の機械種別と不適合であるとの判定に基づいて、前記バイナリイメージ内で、前記ハイブリッドバイナリイメージからロードされたメモリデータに対する複数の変換を定義する補正テーブルを特定することと、
前記ハイブリッドバイナリイメージからロードされた前記メモリデータに対する前記複数の変換の少なくとも一部を、
前記互換ABIの第2の機械種別を含めるべく前記機械種別フィールドを調整する第1の変換、及び
前記ネイティブABIで実行可能な折り畳まれていない関数の第1のコンパイル済みバージョンを呼び出す呼び出しサイトを、代替的に前記互換ABIで実行可能な前記折り畳まれていない関数の第2のコンパイル済みバージョンを呼び出すべく変更する第2の変換を少なくとも適用することを含めて適用することと、を含む方法。
【請求項10】
前記ハイブリッドバイナリイメージが、
(a)(i)前記折り畳まれていない関数の第1のコンパイル済みバージョンを用いて前記折り畳まれていない関数を参照する第1のエントリ、(ii)前記折り畳まれていない関数の第2のコンパイル済みバージョンを用いて前記折り畳まれていない関数を参照する第2のエントリ、及び(iii)折り畳まれた関数を参照する第3のエントリを含む1個以上のテーブルと、
(b)前記第3のエントリを除いて前記第1のエントリ及び前記第2のエントリを含む前記1個以上のテーブルのネイティブビューを提供する前記1個以上のテーブルへの参照とを含み、
前記ハイブリッドバイナリイメージからロードされた前記メモリに前記複数の変換の少なくとも一部を適用することが、前記第1のエントリを除いて前記第2のエントリ及び前記第3のエントリを含む前記1個以上のテーブルの互換ビューを提供すべく前記1個以上のテーブルへの前記参照を調整する第3の変換を適用することも含んでいる、請求項9に記載の方法。
【請求項11】
前記1個以上のテーブルが1個以上のインポートテーブルを含み、前記第1、第2、及び第3領域が第1、第2、及び第3の関数インポートを含む、又は
前記1個以上のテーブルが1個以上のエクスポートテーブルを含み、前記第1、第2、及び第3の領域が第1、第2、及び第3の関数エクスポートを含んでいる、請求項10に記載の方法。
【請求項12】
前記ハイブリッドバイナリイメージが、前記折り畳まれていない関数の第1のコンパイル済みバージョンを参照するエントリポイントを含み、
前記ハイブリッドバイナリイメージからロードされた前記メモリに対して前記複数の変換の少なくとも一部を適用することもまた、前記折り畳まれていない関数の第2のコンパイル済みバージョンを参照すべく前記エントリポイントを調整する第3の変換を適用することを含んでいる、請求項10に記載の方法。
【請求項13】
前記呼び出しサイトが、前記折り畳まれていない関数の第1のコンパイル済みバージョンを参照するディスパッチテーブルを介して前記折り畳まれていない関数の第1のコンパイル済みバージョンを呼び出すべく構造化されていて、前記第2の変換が、前記折り畳まれていない関数の第1のコンパイル済みバージョンではなく、前記折り畳まれていない関数の第2のコンパイル済みバージョンを参照すべく前記ディスパッチテーブルを変更する、請求項9に記載の方法。
【請求項14】
前記ハイブリッドバイナリイメージからロードされた前記メモリに対する前記複数の変換の少なくとも一部が、メモリページ障害の処理に関連して前記ハイブリッドバイナリイメージからロードされたメモリページに適用される、請求項9に記載の方法。
【発明の詳細な説明】
【背景技術】
【0001】
背景
[001] コンピュータ処理に際して、各プロセッサ、又は中央処理装置(CPU)は、当該プロセッサで機械コード命令がネイティブに動作可能となるために遵守すべき構文及び規則を記述する命令セットアーキテクチャ(ISA)を実装している。最新のISAの例として、INTEL CORPORATIONが設計したIA-32 ISA、ADVANCED MICRO DEVICES, INC.が設計したx86-64 ISA、ARM LIMITEDが設計したAArch64 ISA、INTERNATIONAL BUSINESS MACHINES CORPORATIONが設計したPOWER ISA、UNIVERSITY OF CALIFORNIA, BERKELEYが設計したRISC-V ISA等があるが、他の多くのISAが存在している。また、コンピュータ処理に際して、アプリケーションバイナリインターフェース(ABI)は、同一ISAを対象とする機械コード命令を含む2個のバイナリプログラム要素間のインターフェースである。ABIは往々にしてオペレーティングシステム(OS)により定義され、同一ABIを対象とする他のライブラリ/要素をサードパーティソフトウェアコンポーネントが対象とし、従ってインターフェースをとれるようにする。例えば、MICROSOFT WINDOWSは、x86-64 ISAを実装するプロセッサを含むWINDOWS機器にソフトウェアを対応可能にする「Windows-X64」ABIを提供し、Aarch64 ISAを実装するプロセッサを含むWINDOWS機器にソフトウェアを対応可能にする「ARM64」ABIを提供している。
【0002】
[002] 一般に、ソフトウェアコンポーネントは、当該コンポーネントがコンパイルされるABIを(例えばOSを介して)提供すると共に、当該コンポーネントを定義する機械コード命令に適合するISAを有するプロセッサを構成する機器にとって「ネイティブ(固有)」である。従って、所与のコンピューティング機器が提供するABIに適合しないソフトウェアコンポーネントはいずれも当該機器にとって「外来」であると見なすことができる。例えば、x86-64用のLinux ABIを対象とするアプリケーションは、x86-64 ISAを対象とするプロセッサを有するがWindows-X64 ABIしか提供しないコンピューティング機器でネイティブに動作できない。同様に、Windows-X64 ABIを対象とするアプリケーションはx86-64 ISAを対象とするプロセッサを有するがx86-64用のLinux ABIしか提供しないコンピューティング機器でネイティブに動作できない。
【0003】
[003] また、機器のプロセッサのISAに適合しないソフトウェアコンポーネントはいずれも当該機器にとって「外来」であると見なすことができる。例えば、x86_64 ISAを対象とするアプリケーションは(対象とするABIに依らず)、AArch64プロセッサを有するいずれのコンピューティング機器でもネイティブに動作できない。同様に、AArch64 ISAを対象とするアプリケーションは(対象とするABIに依らず)、x86-64プロセッサを有するいずれのコンピューティング機器でもネイティブに動作できない。
【0004】
[004] WINDOWS等、いくつかの環境ではソフトウェアベースのISAエミュレーションを介して外来ソフトウェアを実行可能にするが、往々にして重大な性能上のペナルティを伴う。従って、例えばARM64 ABIを対象とするアプリケーションを、AArch64エミュレータを介してx86-64プロセッサを有する機器でエミュレートできる、及び/又はWindows-X64 ABIを対象とするアプリケーションを、x86-64エミュレータを介してAArch64プロセッサを有する機器でエミュレートできる場合がある。
【0005】
[005] 所与のソフトウェアアプリケーションが複数のABIで使用可能な場合であっても、当該アプリケーションの配布及び使用が問題となり得る。例えば、平均的なコンピュータユーザーは自身のコンピューティング機器がサポートするISA及び/又はABIを知らないため、自身のコンピュータにどのバージョンのプログラムをインストールすべきかに関する情報に基づく決断ができないため、困惑及び苛立ちにつながる。また、開発者にとって、異なるABI/ISAを対象に同一アプリケーションの複数のバージョンを配布及びサポートすることは負担である。これらの問題への対処を試みる1つの素朴なソリューションは、「ネイティブ」及び「外来」のコードストリームを両方含む「ファット」バイナリとして知られるものの生成をサポートすること及びOSサポートである。従って、例えばソフトウェアベンダーはアプリケーション毎に1個のファットバイナリを生成及び配布でき、当該バイナリは、AArch64ベースの機器にロードされた場合に使用されるAArch64コードストリームと、x86-64ベースの機器にロードされた場合に使用されるx86-64コードストリームを含んでいる。ファットバイナリは、異なるプロセッサISAの複雑さをエンドユーザーからほぼ見えなくするが、これはバイナリに含まれるコード量を実質的に2倍にする(すなわちコードサイズを100%増加させる)ことで実現され、その半分は所与の機器では実際には使用されない。多くの場合記憶容量が限られた携帯機器が一般的な時代においてファットバイナリは瞬く間に貴重な記憶リソースを使い果たしてしまい、ソフトウェアの不具合やユーザーの不満につながる恐れがある。
【0006】
[006] 今日使用可能な機器の広範且つ多様なエコシステムを前提として、ユーザーが外来ソフトウェアを自身のコンピューティング機器で実行できることが望ましい場合が多い。このように、コンピュータ製造業者及び/又はOSベンダーは、外来製ソフトウェアの実行を比較的シームレスに体感できるようにすべく動機付けられる可能性がある。いくつかのソリューションにおいて、エミュレーションを介して外来ソフトウェアを動作可能にしながら、外来ソフトウェアがネイティブのOSライブラリとインターフェースをとれるようにしている。しかし、これらのソリューションは、当該アプリケーションが依然としてネイティブではなくエミュレーションにより動作する点が限界であった。
【発明の概要】
【0007】
簡単な概要
[007] 本明細書に記述する少なくともいくつかの実施形態は、エミュレートされた外来コードと緊密に相互運用すべく構成され且つ外来コードとの高レベルの相互運用性及び互換性を提供する「エミュレーション互換」(EC)コードを含むネイティブバイナリ(例えばアプリケーション、モジュール、ライブラリ等)の生成及び/又は使用を可能にする。例えば、本明細書に記述する複数の実施形態により、アプリケーション開発者は、オペレーティングシステム(OS)が提供するネイティブECアプリケーションバイナリインターフェース(ABI)にアプリケーションを対応させて、コンピューティング機器でネイティブに動作するアプリケーションを生成及び配布できるようになる。
【0008】
[008] 複数の実施形態において、EC ABIは、外来ABIの多くの挙動を示すことにより、EC ABIを対象とするネイティブコードが(エミュレータを介して)外来コードを呼び出して相互運用できるようにする。従って、EC ABIにより、これらのネイティブに動作するアプリケーションは、当該アプリケーションの実行コンテキスト内にロードされる従来型ライブラリ及びプラグイン等、エミュレートされた外来コードと(例えばエンドユーザーの観点から)効率的且つシームレスにインターフェースをとることが可能になる。
【0009】
[009] 複数の実施形態において、EC ABIは、エミュレートされた外来コード内における例外巻き戻し及び/又はスレッド中断をサポートするネイティブコード用のコンテキスト及び呼び出し規約(CC)を提供する。例えば、複数の実施形態において、EC ABIは、現行ネイティブABIが期待するコンテキストデータ及びCCとの互換性を維持しながら、外来ABIと互換性のあるコンテキストデータ及びCCを使用する。
【0010】
[010] 複数の実施形態において、EC ABIが外来ABIと互換であっても、EC ABI用にコンパイルされたコードの多くが現行ネイティブABI用にコンパイルされたコードと同一であるように現行ネイティブABIと充分な互換性を維持している。このため、(現行ネイティブABIを認識しているがEC ABIを認識しない従来型システムでバイナリを使用可能にする)現行ネイティブABIと、(EC ABIを認識している知識システムでのエミュレートされた外来コードとの相互運用性を強化できる)EC ABIとの両方をサポートするハイブリッドバイナリ内で当該コードを「折り畳む」ことが可能になる。
【0011】
[011] 特に、本明細書に記述する複数の実施形態において、EC ABI用にコンパイルされた関数のエントリポイントが3個存在する可能性があることである。第1に、当該関数は、別のEC ABI関数により呼び出された場合は自身の「実」アドレスで入ることができる。第2に、当該関数は、外来ABIから呼び出された場合は「入口サンク」を介して入ることができる。第3に、当該関数が外来ABIで動作しているコードにより実行時に変更された場合は「早送りシーケンス」を介して入ることができる。関数への実際のエントリポイントに依らず、EC ABI用にコンパイルされたコードと外来ABI用にコンパイルされたコードが対話する場合、複数の実施形態において、関数がABI境界を越えた場合に一貫したメモリアドレス参照を行うことができるため、互換性が向上する。
【0012】
[012] 1個以上の実施形態が、ネイティブな第1の命令セットアーキテクチャ(ISA)を対象とするバイナリファイルにソースコードをコンパイルする一方で、外来の第2のISA用にコンパイルされたコードで動作可能な方法、システム、及びコンピュータプログラム製品を目的としている。これらの実施形態において、コンピュータシステムは、(i)第1のISAに対応する第1のABI、(ii)第1のISAに対応する第2のABI、及び(iii)第2のISAに対応する第3のABIを識別する。第2のABIは、(i)第3のABIが使用する第2のコンテキストデータフォーマットの第2のサイズを超えない第1のサイズを有する第1のコンテキストデータフォーマットを定義し、(ii)第1のISAの複数のレジスタのうち第1のABIが使用するレジスタの部分集合の使用を定義し、当該レジスタの部分集合は第3のABIが使用する第2のISAのレジスタの集合にマッピングされ、第1のABI及び第2のABIの各々を用いてコンパイルされた場合に複数の関数の少なくとも一部が折り畳み可能となる。ソースコードに定義された関数に対して、コンピュータシステムは、第1のABIを対象とする関数の第1のコンパイル済みバージョンを生成し(第1のISAに準拠する第1の命令セットの生成を含む)、第2のABIを対象とする関数の第2のコンパイル済みバージョンを生成する(第1のISAに準拠する第2の命令セットの生成を含む)。コンピュータシステムは、少なくとも第1の命令セットと第2の命令セットが適合するか否かの判定に基づいて、関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能か否かを判定する。コンピュータシステムは、少なくとも関数の第1のコンパイル済みバージョンと関数の第2のコンパイル済みバージョンとがバイナリファイル内で折り畳み可能か否かの判定に基づいて、(i)関数の第1のコンパイル済みバージョンと関数の第2のコンパイル済みバージョンの両方をバイナリファイルにエミットする(すなわち関数の第1のコンパイル済みバージョンと関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能でないと判定された場合)、又は(ii)関数の第1のコンパイル済みバージョン又は関数の第2のコンパイル済みバージョンの一方のみをバイナリファイルにエミットする(すなわち関数の第1のコンパイル済みバージョンと関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能であると判定された場合)。
【0013】
[013] 1個以上の実施形態はまた、ハイブリッドバイナリイメージを生成する方法、システム、及びコンピュータプログラム製品も目的としており、ハイブリッドバイナリイメージは、ネイティブABI及び互換ABIの両方で実行可能である。これらの実施形態において、コンピュータシステムは、少なくともネイティブABIに対応する第1の機械種別の識別に基づいて、第1の機械種別をハイブリッドバイナリイメージの機械種別フィールドにエミットする。機械種別フィールドは、ハイブリッドバイナリイメージがネイティブABIで実行されるネイティブプロセスによりロードされた場合に使用されるように構造化されている。少なくとも折り畳み不可能な第1の関数を識別することに基づいて、コンピュータシステムは、(i)ネイティブABIで実行可能な第1の関数の第1のコンパイル済みバージョン、及び(ii)互換ABIで実行可能な第1の関数の第2のコンパイル済みバージョンの両方をハイブリッドバイナリイメージにエミットすることも可能である。少なくとも折り畳み可能な第2の関数を識別することに基づいて、コンピュータシステムはまた、ネイティブABI及び互換ABIの両方で実行可能な第2の関数のコンパイル済みバージョンをハイブリッドバイナリイメージにエミットする。第2の関数のコンパイル済みバージョンは、ハイブリッドバイナリイメージがネイティブプロセスによりロードされた場合に第1の関数の第1のコンパイル済みバージョンを呼び出すように構造化されている。コンピュータシステムはまた、ハイブリッドバイナリイメージが互換ABIで実行される互換プロセスによりロードされた場合に使用されるように構造化された補正テーブルをハイブリッドバイナリイメージにエミットする。補正テーブルは、ハイブリッドバイナリイメージからロードされた、メモリに対する複数の変換を定義し、互換ABIに対応する第2の機械種別を含むように機械種別フィールドを調整する第1の変換、及び第1の関数の第1のコンパイル済みバージョンではなく第1の関数の第2のコンパイル済みバージョンを呼び出すように第2の関数のコンパイル済みバージョンを設定する第2の変換を含んでいる。
【0014】
[014] 1個以上の実施形態はまた、互換ABIで動作するプロセスによりハイブリッドバイナリイメージを使用する方法、システム、及びコンピュータプログラム製品も目的としており、ハイブリッドバイナリイメージは、ネイティブABIと互換ABIとの両方で実行可能である。これらの実施形態において、ハイブリッドバイナリイメージのロード中に、コンピュータシステムは、ハイブリッドバイナリイメージの機械種別フィールドに格納された第1の機械種別が、プロセスが実行されている互換ABIに対応する第2の機械種別と不適合であると判定する。第1の機械種別が第2の機械種別と不適合であるとの判定に基づいて、コンピュータシステムは、バイナリイメージ内で、ハイブリッドバイナリイメージからロードされたメモリに対する複数の変換を定義する補正テーブルを特定する。コンピュータシステムは次いで、ハイブリッドバイナリイメージからロードした複数の変換の少なくとも一部分をメモリに適用し、これは少なくとも互換ABIに対応する第2の機械種別を含めるように機械種別フィールドを調整する第1の変換、及びネイティブABIで実行可能な折り畳まれていない関数の第1のコンパイル済みバージョンを呼び出す呼び出しサイトを変更して、代わりに互換ABIで実行可能な折り畳まれていない関数の第2のコンパイル済みバージョンを呼び出す第2の変換を適用することを含んでいる。
【0015】
[015] 1個以上の実施形態はまた、(i)ネイティブISAに対応し且つ第1のCCを有するネイティブABIを対象とするネイティブコード、及び(ii)外来ISAに対応し且つ第2のCCを有する外来ABIを対象とする外来コードの両方の実行をサポートするプロセス内の呼び出しを処理する場合に共通の参照メモリアドレスを用いる方法、システム、及びコンピュータプログラム製品も目的としている。これらの実施形態において、コンピュータシステムは、少なくとも呼び出され側関数の参照メモリアドレスを対象とする呼び出しを識別することに基づいて、呼び出され側関数がネイティブABI又は外来ABIのどちらに対応するかを判定する。呼び出され側関数は、(i)参照メモリアドレスがネイティブコードを保存する第1のメモリ内に含まれていることを示す参照構造、又は(ii)参照メモリアドレスで識別される早送りシーケンスの一方に基づいてネイティブABIに対応すると判定される。呼び出され側関数は、少なくとも参照メモリアドレスがネイティブコードを保存しない第2のメモリ内に含まれていることを示す参照構造に基づいて外来ABIに対応すると判定される。コンピュータシステムは、少なくとも当該判定に基づいて、(A)呼び出し側関数が外来ABIに対応し、且つ呼び出し側関数が外来ABIに対応すると判定された場合、エミュレータ内の参照メモリアドレスを用いて呼び出され側関数を直接呼び出すこと、(B)呼び出し側関数が外来ABIに対応し、且つ呼び出され側関数がネイティブABIに対応すると判定された場合に(i)第2のCCを第1のCCに適合させ、次いで(ii)参照メモリアドレスを用いて呼び出され側関数を直接呼び出す入口サンクを呼び出すこと、(C)呼び出し側関数がネイティブABIに対応し、且つ呼び出され側関数が外来ABIに対応すると判定された場合に(i)ネイティブABIの第1のCCを外来ABIの第2のCCに適合させ、次いで(ii)エミュレータを起動して参照メモリアドレスを用いて呼び出され側関数を直接呼び出す出口サンクを呼び出すこと、又は(D)呼び出し側関数がネイティブABIに対応し、且つ呼び出され側関数がネイティブABIに対応すると判定された場合に参照メモリアドレスを用いて呼び出され側関数を直接呼び出すこと、のいずれかを実行することに基づいて呼び出され側関数の実行を開始する。
【0016】
[016] 当該概要部は、詳細な説明においていかにより詳細に記述する概念の集合を簡素化した形式で紹介すべく提供する。本概要部は、権利請求する主題の主な特徴又は必須の特徴を指定することを意図しておらず、また、権利請求する主題の範囲の確定に資するものとして用いることを意図していない。
【0017】
図面の簡単な説明
[017] 本発明の上述の及び他の利点並びに特徴が得られるように記述すべく、添付の図面に示す特定の実施形態を参照しながら、上で簡単に記述した本発明のより詳細な説明を行う。これらの図面が本発明の典型的な実施形態のみを示し、従ってその範囲を限定するものと考えるべきでないことを理解した上で、本発明について、添付図面を参照しながら、より具体的及び詳細に説明する。
【図面の簡単な説明】
【0018】
【
図1】[018]エミュレートされた外来コードと緊密に相互運用すべく構成され、且つ外来コードとの高レベルの相互運用性及び互換性を提供するエミュレーション互換(EC)コードを含むネイティブバイナリの生成及び/又は使用を可能にする例示的なコンピュータシステムを示す。
【
図2】[019]現行ネイティブABIとの互換性を維持しながら、外来ABIをミラーリングするコンテキスト及び呼び出し規約(CC)を定義するECネイティブアプリケーションバイナリインターフェース(ABI)の一例を示す。
【
図3A】[020]デュアルアーキテクチャハイブリッドバイナリの一例を示す。
【
図3B】[021]インポート及び/又はエクスポートテーブルのウィンドウビューの一例を示す。
【
図4A】[022]現行ABIを対象としてコンパイルされた「現行」ネイティブ関数の呼び出し挙動、及びEC ABIを対象としてコンパイルされた「EC」ネイティブ関数の呼び出し挙動を示す。
【
図4B】[023]現行ABI及びEC ABIの両方に対してソースコード関数をコンパイルした結果同一コードが得られたため折り畳まれた「EC」ネイティブ関数の呼び出し挙動を示す。
【
図5】[024]外来の第2のISA用にコンパイルされたコードで動作可能である一方で、ネイティブな第1の命令セットアーキテクチャ(ISA)を対象としてソースコードをバイナリファイル用にコンパイルする方法の一例を示すフロー図である。
【
図6】[025]ネイティブABI及び互換ABIの両方で実行可能なハイブリッドバイナリイメージを生成する例示的方法のフロー図を示す。
【
図7】[026]互換ABIで実行されるプロセスによりハイブリッドバイナリイメージであって、ネイティブABI及び互換ABIの両方で実行可能なハイブリッドバイナリイメージを使用する例示的方法のフロー図を示す。
【
図8】[027](i)ネイティブISAに対応し且つ第1のCCを有するネイティブアプリケーションバイナリインターフェース(ABI)を対象とするネイティブコード、及び(ii)外来ISAに対応し且つ第2のCCを有する外来ABIを対象とする外来コードの両方の実行をサポートするプロセス内の呼び出しを処理する場合に共通参照メモリアドレスを用いる例示的方法のフロー図である。
【発明を実施するための形態】
【0019】
詳細な説明
[028]
図1に、エミュレートされた外来コードと緊密に相互運用すべく構成され且つ外来コードとの高レベルの相互運用性及び互換性を提供する「エミュレーション互換」(EC)コードを含むネイティブバイナリ(例えばアプリケーション、モジュール、ライブラリ等)の生成及び/又は使用を可能にする例示的コンピュータシステム101を示す。コンピュータシステム101はまた、ECコードを含む一方、これらのバイナリ内に含まれるEC特徴を認識しない「従来型」コンピューティング機器と依然として互換であるネイティブバイナリを生成及び/又は使用することを可能にする。
【0020】
[029] 一般に、コンピュータシステム101は、外来ABIの多くの挙動を示すECネイティブアプリケーションバイナリインターフェース(ABI)に基づいて動作することにより、ECネイティブABIを対象とするネイティブコードが従来型プラグイン、ライブラリ等の外来コードを(エミュレータを介して)呼び出して相互運用できるようにする。複数の実施形態において、ECネイティブABIは、エミュレートされた外来コード内で例外巻き戻し及び/又はスレッド中断をサポートするネイティブコードに用のンテキスト及び呼び出し規約(CC)を提供する。例えば、複数の実施形態において、ECネイティブABIは、現行ネイティブABIが期待するコンテキストデータ及びCCとの互換性を維持しながら、外来ABIと互換性のあるコンテキストデータ及びCCを使用する。これを行う場合、ECネイティブABI用にコンパイルされたコードの多くは、現行ネイティブABI用にコンパイルされたコードと同一であるため、(現行ネイティブABIを認識するがECネイティブABIを認識しない従来型システムによりバイナリを使用できるようにする)現行ネイティブABIと(ECネイティブABIを認識する知識システムでエミュレートされた外来コードとの相互運用性を向上できるようにする)ECネイティブABIの両方をサポートするハイブリッドバイナリ内でのコードの「折り畳み」が可能になる。また、ECネイティブABI用にコンパイルされたコードと外来ABI用にコンパイルされたコードとが対話する場合、複数の実施形態により、関数がABI境界を越える場合に一貫したメモリアドレス参照を行えるようにして互換性を向上させる。
【0021】
[030] 複数の実施形態において、コンピュータシステム101は、例えば、通信バス105を用いて通信可能に結合されたプロセッサ102(又は複数のプロセッサ)、持続性記憶装置103、及びシステムメモリ104等の専用又は汎用コンピュータハードウェアを含むか又は使用する。コンピュータシステム101において、プロセッサ102は、x86-64、AArch64、POWER、RISC-V等、任意の使用可能なプロセッサ命令セットアーキテクチャ(ISA)が実装されていてよく、これを本明細書ではプロセッサ102の「ネイティブ」ISAと称する。プロセッサ102のネイティブISAに適合しないISAはいずれも本明細書で「外来」ISAと称する。一般に、プロセッサ102のISAは、プロセッサ102により実行可能な機械コード命令の構文、当該機械コード命令で使用されるべくプロセッサ102が公開するレジスタの集合、プロセッサ102が使用するメモリモデル等、プロセッサ102の多くのハードウェア態様を定義する。従って、例えば、プロセッサ102がAArch64 ISAを実装する場合、機械コード命令セット(例えば1個以上の使用可能な命令、命令フォーマット等を含む)を実行して、プロセッサ102がx86-64 ISAを実装する場合とは異なるレジスタの集合(例えばレジスタ名、レジスタサイズ、レジスタ個数等のうち1個以上を含む)を公開するであろう。
【0022】
[031] 持続性記憶装置103は、コンピュータ実行可能命令及び/又は実行可能なソフトウェアコンポーネントを表すデータ構造を保存し、これに対応して、プロセッサ102において当該ソフトウェアの実行中に、当該コンピュータ実行可能命令及び/又はデータ構造の1個以上の部分がシステムメモリ104にロードされる。例えば、持続性記憶装置103は、オペレーティングシステム106、開発環境107、ハイブリッドバイナリ108、外来バイナリ109、及びソースコード110に対応するコンピュータ実行可能命令及び/又はデータ構造を潜在的に保存するものとして示されている。
【0023】
[032] システムメモリ104は、持続性記憶装置103からロード、プロセッサ102により保存、及び/又はネットワーク機器(図示せず)等の他の場所から提供できる広範なデータを保存することができる。一般に、コンピュータシステム101は、持続性記憶装置103に保存された1個以上のバイナリイメージ(例えばハイブリッドバイナリ108、外来バイナリ109等)により定義されたメモリページをシステムメモリ104にロードして、プロセッサ102を用いて(システムメモリ104にロードされたような)当該メモリページで動作させることにより動作する。これは、当該メモリページ内に保存された機械コード命令を実行して当該メモリページに保存されたデータに作用することを含んでいる。
【0024】
[033] オペレーティングシステム106(以後OS 106と称する)は、プロセッサ102のネイティブISAを用いる1個以上のABIを対象とするアプリケーションバイナリの実行をサポートするライブラリ等のライブラリ106aを含んでいる。開発環境107を起点とする矢印で示すように、いくつかの実施形態においてライブラリ106aは、以下でより詳細に記述する現行ネイティブABI(107a)(以後現行ABI(107a)と称する)及びECネイティブABI(107b)(以後EC ABI(107b)と称する)に対するサポートを含んでいる。OS 106はまた、バイナリイメージをシステムメモリ104にロードするローダー106cを含み、当該ローダーは現行ABI(107a)及びEC ABI(107b)の両方を認識する。従って、ライブラリ106a及びローダー106cを保有することに基づいて、OS 106は、現行ABI(107a)又はEC ABI(107b)の一方又は両方を対象とするコードを含むネイティブバイナリ(例えばアプリケーション、モジュール、ライブラリ等)の使用をサポートする。
【0025】
[034] 複数の実施形態において、OS 106はまた、開発環境107を起点とする矢印で示すように、エミュレーションを介して、(例えば外来ISAに基づいて)外来ABI(107c)を対象とするバイナリの実行をサポートするエミュレータ106bも含んでいる。複数の実施形態において、エミュレータ106bは、EC ABI(107b)を提供するライブラリを含むライブラリ106aと相互運用すべく構成されている。従って、エミュレータ106bを保有することに基づいて、OS 106は外来ABI(107c)を対象とするコードを含む外来バイナリ(例えばアプリケーション、モジュール、ライブラリ等)の実行をサポートする。
【0026】
[035] 本明細書で用いる「エミュレーション」という用語は、翻訳及び/又は解釈を含んでいてよい。例えば、事前(AOT)翻訳では、外来ISA命令はネイティブISA命令に翻訳されて記憶装置(例えば持続性記憶装置103)に保持され、当該翻訳済命令は次いで実行時に必要な場合に呼び出される。一般に、AOT翻訳は、アプリケーションのインストール時等、プログラムの実行が要求される前に行われる。別の例において、適時(JIT)翻訳では、外来ISA命令は外来ISA命令の実行が要求された際に(例えばユーザーがプログラムを実行する時点で)ネイティブISA命令に翻訳される。JIT翻訳では、翻訳済みネイティブコードは外来コードから翻訳された場合は直ちに実行される。複数の実施形態において、JIT翻訳は、実行のために「発見」された外来コードが増えるにつれて断片的に生じる。複数の実施形態において、外来ISAコードの同一ブロックのJIT翻訳は1回だけ実行されるため、コードが複数回実行される場合、翻訳のコストは1回しか生じない。更に別の例において、解釈では外来ISA命令は実行が必要な場合に読み取られ、インタプリタにより同等の関数が実行されるが、対応するネイティブISAコードは生成されない。解釈では外来コードは翻訳されないため、同じ外来ISA関数を2回実行すると解釈のコストが2倍になる。
【0027】
[036] 開発環境107は、少なくともEC ABI(107b)を対象とするが多くの場合現行ABI(107a)も対象とする(すなわちデュアルアーキテクチャ又は「ハイブリッド」バイナリイメージとして)バイナリの生成をサポートする。複数の実施形態において、開発環境107は、更に外来ABI(107c)を対象とする(従って、外来ABI(107c)がネイティブであるコンピュータシステムで直接実行可能である)バイナリの生成もサポートする。複数の実施形態において、現行ABI(107a)は、プロセッサ102のネイティブISAを対象とする「従来型」ABIであり、外来ABI(107c)は何らかの外来ISAを対象とするABIである。一方、EC ABI(107b)はプロセッサ102のネイティブABIであるが、外来ABI(107c)をミラーリングするか又は少なくともいくつかの属性を共有するコンテキストデータ及びCCを定義する。従って、複数の実施形態において、現行ABI(107a)は、完全に「ネイティブ」なデータの構造及び挙動を定義すると見なすことができ、EC ABI(107b)は、同様にネイティブであるが、外来ABI(107c)と少なくともいくつかのデータ構造属性及び挙動を共有すると見なすことができる。一例において、現行ABI(107a)はAArch64 ISAを対象とするARM64 ABIであり、外来ABI(107c)はx86-64 ISAを対象とするWindows-X64 ABIであり、EC ABI(107b)は、AArch64 ISAを対象とするがWindows-X64 ABIを少なくとも部分的にミラーリングするコンテキストデータ及びCCを含むAArch64 ISAを対象とする。複数の実施形態において、EC ABI(107b)は、エミュレートされた外来コード及びECネイティブコードが極めて低レベルで対話できるように外来ABI(107c)をミラーリング又はマッピングするのに充分なコンテキストデータ及びCCを定義するが、現行ABI(107a)及びEC ABI(107b)の各々に向けてソース関数の少なくとも一部をコンパイルして同一のコンパイル済み関数本体が得られるように現行ABI(107a)と充分に共通点(例えば使用可能なレジスタの集合)を有している。コンパイルされた関数本体が同一である場合、得られたバイナリに実際には1個の関数本体だけが含まれ、現行ABI(107a)を対象とするコードストリーム及びEC ABI(107b)を対象とするコードストリームの両方が当該単一の関数本体を(例えばポインタエイリアシングを介して)使用するように「折り畳み可能」であると見なすことができる。
【0028】
[037] EC ABI(107b)の複数の実施形態を更に示すべく、
図2に、現行ネイティブABIとの互換性を維持しながら、外来ABIをミラーリングするコンテキスト及びCCを定義するECネイティブABIの一例200を示す。最初に、
図2は、
図1の現行ABI(107a)、EC ABI(107b)、及び外来ABI(107c)の各々の表現を示す。図示するように、現行ABI(107a)は、例200においてネイティブISAで全ての使用可能なレジスタであると仮定するレジスタN:A~N:Iを含む9個の使用可能なレジスタ201aの集合を定義している。一方、外来ABI(107c)は、レジスタF:V~F:Zを含む5個の使用可能なレジスタ201cの集合を定義しており、例200において外来ISAで全ての使用可能なレジスタであると仮定されている。同様に、AArch64 ISA(例えば「ネイティブ」ISA)は31個の汎用64ビットレジスタを定義するのに対し、x86-64 ISA(例えば「外来」ISA)は16個の汎用64ビットレジスタを定義する。EC ABI(107b)は、レジスタN:A、N:C、N:D、N:E、及びN:Gを含む5個の使用可能なレジスタ201bの集合を定義することにより、現行ABI(107a)と外来ABI(107c)との橋渡しをする。従って、ネイティブISAが9個の使用可能なレジスタを有しているにせよ、例200においてEC ABI(107b)は当該レジスタのうち、外来ISAで使用可能なレジスタ数に対応して5個しか使用できないという制限がある。当業者には理解されるように、EC ABI(107b)を対象とするネイティブコードは、ネイティブISAが定義する全てのレジスタを使用しなくてもよいが、当該ネイティブコードは依然としてネイティブISAで実行可能である。従って、EC ABI(107b)は、EC ABI(107b)を対象とするネイティブコードが現行ABI(107a)しかサポートしないシステムでも実行可能であるように、使用可能なレジスタ201bの使用を現行ABI(107a)と互換性のある仕方で定義することができる。
【0029】
[038] 複数の実施形態において、使用可能なレジスタ201bの集合は現行ABI(107a)用にコンパイルされたコードにより最も共通に使用されるレジスタを用いるように選択される。従って、例200において、使用可能なレジスタ201bの集合が使用可能なレジスタ201aの集合の全数よりも少ない個数を使用するにせよ、使用可能なレジスタ201aの集合を対象としながらコンパイルされたコードは実際には使用可能なレジスタ201bの集合から選択されたレジスタしか使用しない場合が多い。このような状況において、現行ABI(107a)及びEC ABI(107b)の各々に向けてコンパイルされたコードは同一であり、得られたバイナリ内に折り畳むことができる。特に、例200において、EC ABI(107b)の使用可能なレジスタ201bの集合は、現行ABI(107a)の使用可能なレジスタ201aの集合の全数よりも少ないものを含むが、代替例は、(例えば外来ISAがネイティブISAに適合するレジスタの個数を有する場合)使用可能なレジスタ201aの集合の全てを用いるように使用可能なレジスタ201bの集合を定義してもよい。
【0030】
[039] また、
図2内の矢印は、EC ABI(107b)の使用可能なレジスタ201bと外来ABI(107c)の使用可能なレジスタ201cとの間にマッピングが定義されていることを示す。従って、例えば、EC ABI(107b)は外来ABI(107c)によるレジスタF:Vの使用をミラーリングする仕方でレジスタN:Aを使用し、EC ABI(107b)は外来ABI(107c)によるレジスタF:Wの使用をミラーリングする仕方でレジスタN:Cを使用し、以下同様である。一例において、EC ABI(107b)は、外来ABI(107c)が使用するCCをミラーリングする仕方で使用可能なレジスタ201bの使用を定義する。例えば、EC ABI(107b)は、外来ABI(107c)の挙動を実現すべく関数にパラメータを渡すのに使用可能なレジスタの個数を(すなわち現行ABI(107a)と比べて)制限することができる。同様に、X64 ABIはパラメータを渡すのに4個のレジスタしか使用しないため、現行ARM64 ABIがパラメータを渡す目的で追加レジスタを使用すべく定義されていても、EC ABI(107b)はパラメータを渡すのに4個のレジスタしか使用を許可しない場合がある。また、EC ABI(107b)は、当該目的でレジスタを用いる(現行ABI(107a)ではそうであるように)のではなく、外来ABI(107c)によるスタックの使用(例えば戻りアドレスを保存、関数から値を戻す等)をミラーリングすることができる。複数の実施形態において、レジスタ間のマッピングはレジスタ間の揮発性のマッピングを含んでいる。従って、例えば、現行ABI(107a)で不揮発性と考えられるネイティブISAのレジスタは、外来ABI(107c)が揮発性であると見なされたレジスタにマッピングされた場合はEC ABI(107b)により揮発性と見なされる場合がある。
【0031】
[040]
図2はまた、現行ABI(107a)がコンテキストデータ202aを定義し、EC ABI(107b)がコンテキストデータ202bを定義し、外来ABI(107c)がコンテキストデータ202cを定義することを示す。複数の実施形態において、コンテキストデータは、レジスタ及びフラグ等のプロセッサコンテキストのスナップショットを保存するABIにより定義されるフォーマットである。当該コンテキストデータは様々な目的、例えばアプリケーションが自身の状態を観察する(例えばウイルス又はマルウェア検出等の一部としてコピー保護スキームの一部として)、例外巻き戻しルーティンが例外発生後にスタックを元に戻す、又はスレッドの中断/再開を可能にするために使用可能である。コンテキストデータ202a、コンテキストデータ202b、及びコンテキストデータ202cの各々の視覚的サイズにより示すように、複数の実施形態において、EC ABI(107b)は、外来ABI(107c)が使用するコンテキストデータ202cのサイズを超えないコンテキストデータ202bの形式(例えば使用可能なレジスタ201bの選択及び配置)を定義するが、現行ABI(107a)が当該サイズを超えるコンテキストデータ202aを定義することもある。コンテキストデータ202cのサイズを超えないよう用にコンテキストデータ202bを定義することにより、EC ABI(107b)と外来ABI(107c)との間の相互運用が可能となる。例えば、外来ABI(107c)で動作するアプリケーションがコンテキストデータ202cのフォーマットを保存するためのメモリバッファを割り当て、当該メモリバッファが、コンテキストデータ202bのフォーマット(例えば例外の扱いの一部として)を用いてEC ABI(107b)により満たされるならば、EC ABI(107b)が書き込むコンテキストデータ202bは割り当てられたメモリバッファを超えない。
【0032】
[041] いくつかの実施形態において、コンテキストデータ202bは、コンテキストデータ202aとコンテキストデータ202cを混合したフォーマットを有するように定義されている。例えば、コンテキストデータ202aのフォーマットは前方斜め線で視覚的に表現されるのに対し、コンテキストデータ202cのフォーマットは後方斜め線で視覚的に表現されている。次いで、コンテキストデータ202bのフォーマットは、前方斜め線及び後方斜め線の両方で視覚的に表現され、フォーマットの少なくとも部分的な混合を表現している。例えば、コンテキストデータ202bがネイティブISAのレジスタの配置を定義するとしても、外来ISAが期待する仕方で(例えば使用可能なレジスタ201bと使用可能なレジスタ201cとの間に示すマッピングに基づいて)当該レジスタを配置することができる。
【0033】
[042] 特に、EC ABI(107b)(使用可能なレジスタ201b、コンテキストデータ202b、又は使用可能なレジスタ201bと使用可能なレジスタ201cとのマッピングのうち1個以上を含む)を定義する場合、EC ABI(107b)を現行ABI(107a)により近似して定義することと、EC ABI(107b)を外来ABI(107c)により近似して定義することの間にトレードオフがあり得る。例えば、EC ABI(107b)が現行ABI(107a)に近似しているほど、EC ABI(107b)用にコンパイルしたコードをネイティブABI(107a)用にコンパイルしたコードにより「折り畳む」ことができる可能性が高いが、EC ABI(107b)と外来ABI(107c)との間を遷移する際に(後述の入口サンク及び/又は出口サンクを介して)ABI翻訳が必要な可能性も高くなり得る。逆に、EC ABI(107b)が外来ABI(107c)に近似しているほど、EC ABI(107b)内のネイティブコードと外来ABI内の外来コードがABI翻訳(サンク)を使用せずに対話できる可能性が高くなるが、これはまた、EC ABI(107b)用にコンパイルしたコードをネイティブABI(107a)用にコンパイルしたコードにより「折り畳む」ことができない可能性も高める。
【0034】
[043] 再び
図1を参照するに、いくつかの実施形態において、開発環境107は、2個以上のABIを対象にする「デュアルアーキテクチャ」ハイブリッドバイナリの生成をサポートする。例えば、様々な矢印で示すように、
図1は、コンパイラツールチェーン107dが、現行ABI(107a)(すなわち現行ネイティブコード108a)及びEC ABI(107b)(すなわちECネイティブコード108b)の両方を対象とするコードを含むハイブリッドバイナリ108を生成すべくソースコード110を使用することを示す。従って、ネイティブコードしか含んでいないにもかかわらず、ハイブリッドバイナリ108は、現行ネイティブ挙動(すなわち現行ネイティブコード108a)及び外来挙動(すなわちECネイティブコード108b)の両方を対象にしていると見なすことができる。図示していないが、いくつかの実施形態において、ハイブリッドバイナリはまた、外来ABI(107c)等、1個以上の追加的ABIを対象とするコードも含んでいる。
【0035】
[044]
図1に、現行ネイティブコード108aとECネイティブコード108bの間に太い矢印があり、現行ネイティブコード108aとECネイティブコード108bが互いに少なくとも部分的に「折り畳まれて」いる(すなわち現行ネイティブコード108aとECネイティブコード108bの両方が単一の命令セットを使用するように)ことを示しれている。上述のように、EC ABI(107b)が少なくともいくつかの外来挙動を対象としているにもかかわらず、現行ABI(107a)と充分に共通であるため、現行ABI(107a)及びEC ABI(107b)の各々に向けてソース関数の少なくとも一部をコンパイルして同一のコンパイル済み関数本体が得られる。複数の実施形態において、現行ABI(107a)及びEC ABI(107b)の各々に向けた関数のコンパイルから同一のコンパイル済みコードが得られる場合、コンパイラツールチェーン107dは当該関数をハイブリッドバイナリ108内で「折り畳み」、現行ネイティブコード108a及びECネイティブコード108bの両方で用いる当該関数の単一のコンパイル済みバージョンだけをエミットする。例えば、コンパイラツールチェーン107dがコンパイル済みコードの現行ネイティブ「バージョン」とコンパイル済みコードのECネイティブ「バージョン」の両方を当該関数用に生成したとしても、コンパイラツールチェーン107dは当該「バージョン」が適合する(すなわち同一のネイティブコードを有する)場合に当該バージョンの一方だけをハイブリッドバイナリ108にエミットする。試験において本発明者らは、コードの折り畳みにより、この仕方でデュアルABI(すなわち現行ABI(107a)及びEC ABI(107b))をサポートしても単一のABIを対象とするバイナリに比べてバイナリサイズが10~30%しか増加しないことを見出した。これは、コードを折り畳む機能がないためバイナリサイズが100%近く増大する従来のファットバイナリとは対照的である。
【0036】
[045] 複数の実施形態において、EC ABI(107b)を対象としてソースコード110をコンパイルする場合、コンパイラツールチェーン107dは、(コンパイラツールチェーン107dがネイティブコードを生成しているにもかかわらず)あたかもコンパイラツールチェーン107dが外来ABI(107c)のISAを対象としているかのようにプリプロセッサ指令等のソースコードの定義に従う。これは、EC ABI(107b)が外来ABI(107c)の挙動を示すためである。例えば、以下の関数は対象ABIに依存して異なる論理経路を辿る。
int functionl (int x) {
#if defined (_ARM64_)
return x + 10;
#else
return x - 2;
#endif
}
特に、プリプロセッサディレクティブは、ARM64 ISAを対象とする場合は値10を「x」に加算すべきであり、ARM64 ISAを対象としない場合は値2を「x」から減算すべきであると定義している。複数の実施形態において、ARM64 ISAを用いる現行ABI(107a)を対象として当該関数をコンパイルする場合、コンパイラツールチェーン107dは「x」に値10を加算する命令(すなわちARM64論理経路)を生成し、逆にEC ABI(107b)を対象として当該関数をコンパイルする場合、コンパイラツールチェーン107dは「x」から値2を減算する命令(すなわち非ARM64論理経路)を生成する。
【0037】
[046] 複数の実施形態において、ハイブリッドバイナリ108はコンパイラツールチェーン107dにより、従来型ローダー(すなわち現行ABI(107a)を認識するがEC ABI(107b)を認識していない)によりネイティブに解析されて使用されるが、知識ローダー(すなわちEC ABI(107b)を認識する)により使用できるように構成されている。複数の実施形態において、ハイブリッドバイナリ108は、従来型ローダーが期待するレイアウト/フォーマットを使用し、従って、現行ABI(107a)での動作を「デフォルト」にする。しかし、ハイブリッドバイナリ108はまた、ハイブリッドバイナリ108をEC ABI(107b)も使用できるようにする補正テーブル108c等の追加情報も含んでいる。
【0038】
[047]
図3Aに、「デュアルアーキテクチャ」ハイブリッドバイナリの一例300aを示す。より具体的には、
図3Aは
図1のハイブリッドバイナリ108のより詳細な表現すなわち、2個の相互に関連するコードストリームであるコードストリーム301a及びコードストリーム301bを示す。複数の実施形態において、コードストリーム301aは現行ネイティブコード108aに対応し、コードストリーム301bは、ECネイティブコード108bに対応している。従って、ハイブリッドバイナリ108は、2個の異なるネイティブABI(すなわち現行ABI(107a)及びEC ABI(107b))を、それらの異なる挙動(すなわち完全ネイティブ挙動及び外来挙動)と合わせて対象にする。コードストリーム301aとコードストリーム301bの間に矢印で示すように、いくつかの関数間に関数の折り畳みがある。特に、コードストリーム301a及びコードストリーム301bの各々は、実線で示すボックスとして定義された「折り畳まれていない」関数を含み、これらの関数の異なるコンパイル済みバージョンがコードストリーム301a及びコードストリーム301bの各々に存在することを示す。しかし、コードストリーム301a及びコードストリーム301bの各々は、破線で示すボックスとして定義されていて矢印により接続された「折り畳まれた」関数も含み、コードストリーム301a及びコードストリーム301bの両方が(例えばエイリアシングを介して)使用する各関数のバージョンは1個しか存在しないことを示す。
図3Aは、ハイブリッドバイナリ108が、外来コードストリーム等の追加的コードストリーム301cを含み得ることを示す。しかしより典型的には、複数の実施形態において、ハイブリッドバイナリ108は、外来コードストリーム302を含む(例えば従来型プラグイン/ライブラリに対応する)外来バイナリ109と対話する。
【0039】
[048] 上述のように、複数の実施形態において、ハイブリッドバイナリ108は現行ABI(107a)によるネイティブ実行のために構成されている。例えば、ハイブリッドバイナリ108の機械識別子303フィールドは、現行ABI(107a)が期待する機械種別を識別し、エントリポイント304はコードストリーム301aへのエントリポイントを指定し、任意のインポート及び/又はエクスポートテーブル(入力/エクスポートテーブル305)は、現行ABI(107a)に関連する関数(及びその位置)を公開する「ネイティブ」ビューを提供する。また、折り畳まれていない関数を呼び出す「折り畳み」関数は全て、コードストリーム301b内の「EC」バージョンではなく、コードストリーム301a内の関数の「現行」バージョンを呼び出すべく構成されている。このように、従来型ローダーは、コードストリーム301aを実行すべく、他の互換バイナリと同様にハイブリッドバイナリ108をロードするだけでよい。
【0040】
[049] 知識ローダー(例えばローダー106c)によりロード可能にすべく、
図1、3Aに、ハイブリッドバイナリ108が補正テーブル108cを含むことを示す。複数の実施形態において、補正テーブル108cは、ハイブリッドバイナリ108がエミュレートされたプロセス111(例えばエミュレータ106bを介して外来バイナリ109等の外来コードだけでなくECネイティブコード108bもプロセッサ102でネイティブに実行可能な互換プロセス)にロードされた場合に、ローダー106cによりメモリに適用すべきハイブリッドバイナリ108からロードされた1個以上のメモリ変換を指定する。
【0041】
[050] 複数の実施形態において、ローダー106cは、ハイブリッドバイナリ108内の機械識別子303がEC ABI(107b)に不適当であると認識したならば、補正テーブル108cを特定する。次いで、ローダー106cは、コードストリーム301aではなくコードストリーム301bを実行すべく、補正テーブル108cで指定された1個以上の変換を、ハイブリッドバイナリ108からロードされたメモリページを含むシステムメモリ104の部分に適用する。複数の実施形態において、補正テーブル108cで指定された各変換は、(例えば相対アドレス、絶対アドレス等により)メモリ位置を、(例えば当該メモリ位置で算術演算を適用するため当該メモリ位置で1個以上のバイトを代替すべく)当該メモリ位置で適用される変換と共に識別する。複数の実施形態において、補正テーブル108cは、ハイブリッドバイナリ108がロードされたプロセス(例えばエミュレートされたプロセス111)のISAに適合すべく機械識別子303を調整する1個以上の補正項目を含んでいる。複数の実施形態において、これは外来ABI(107c)に対応する外来ISAである。複数の実施形態において、補正テーブル108cは、コードストリーム301bへのエントリポイントを指定すべくエントリポイント304を調整する1個以上の補正項目を含んでいる。複数の実施形態において、補正テーブル108cは、コードストリーム301a内の関数の現行バージョンではなく、コードストリーム301b内の折り畳まれていない関数のECバージョンを折り畳まれた関数に呼び出させる1個以上の補正項目を含んでいる。複数の実施形態において、補正テーブル108cは、EC ABI(107b)に関連する関数(及びそれらの位置)を公開する「互換」ビューをインポート/エクスポートテーブル305に提示させる1個以上の補正項目を含んでいる。
【0042】
[051] いくつかの実施形態において、コードストリーム301a内の関数の現バージョンではなく、コードストリーム301b内の折り畳まれていない関数のECバージョンを折り畳まれた関数に呼び出させることは、折り畳まれた関数自身での呼び出しにパッチを当てることを含んでいる。しかし他の複数の実施形態において、折り畳まれた関数は、ディスパッチテーブル306を介して折り畳まれていない関数を間接的に呼び出すべく構成されている。これらの実施形態において、補正テーブル108cは当該ディスパッチテーブル306に対する、コードストリーム301a内の関数の現行バージョンへのアドレス又はオフセットを、コードストリーム301b内の関数のECバージョンへのアドレス又はオフセットに代替する1個以上の補正項目を含んでいる。複数の実施形態において、ディスパッチテーブル306の使用により、コードストリーム301aではなくコードストリーム301bを実行するためにメモリ補正項目を適用する必要があるメモリページ数を制限することにより効率化することができる。
【0043】
[052] いくつかの実施形態において、EC ABI(107b)に関連する関数(及びそれらの位置)を公開する「互換」ビューをインポート/エクスポートテーブル305に設けさせることは、インポート/エクスポートテーブル305の異なる部分(ウィンドウ)を公開すべくインポート/エクスポートテーブル305への参照にパッチを当てることを含んでいる。この概念を説明すべく、
図3Bに、インポート/エクスポートテーブルのウィンドウビューの一例300bを示す。特に、
図3Bは、複数の関数をそれらの対応するメモリ位置(例えばアドレス又はオフセット)にマッピングするインポート/エクスポートテーブル305を示す。例300bにおいて、インポート/エクスポートテーブル305は、コードストリーム301aだけに(例えば折り畳まれていない関数として)適用可能な関数を含む第1の影付き部分/領域(すなわちA、B、及びC)、コードストリーム301a及びコードストリーム301bの両方に(例えば折り畳まれた関数として)適用可能な関数を含む非影付き部分/領域(すなわちD及びE)、及びコードストリーム301bだけに(例えば折り畳まれていない関数として)適用可能な関数を含む第2の影付き部分/領域(すなわちA’、B’、及びF)を含んでいる。括弧は、インポート/エクスポートテーブル305のネイティブビュー307aとインポート/エクスポートテーブル305の互換ビュー307bを区切っている。複数の実施形態において、ネイティブビューは、インポート/エクスポートテーブル305の第1のエントリへのベース参照及びサイズ/カウント(例えば5)として指定され、関数A、B、及びC(コードストリーム301aだけに適用可能)と共に関数D及びE(両方のコードストリームに適用可能)を含んでいる。複数の実施形態において、互換ビューは、インポート/エクスポートテーブル305の第4のエントリへの基本参照及びサイズ/カウント(例えば5)として指定され、関数D及びE(両方のコードストリームに適用可能)と共に関数A’、B’、及びF(コードストリーム301bだけに適用可能)を含んでいる。従って、複数の実施形態において、インポート/エクスポートテーブル305の異なるウィンドウを公開すべくベース参照にパッチを当てることは、当該ベース参照又はサイズ/カウントの一方又は両方にパッチを当てることを含んでいる。
【0044】
[053] 上述のように、EC ABI(107b)は、EC ABI(107b)でネイティブに動作するアプリケーションのコンテキスト内で従来型プラグイン/ライブラリを(エミュレーションを介して)実行する等、外来ABI(107c)との相互運用性を可能にする。これにはECネイティブコード108b内の関数が外来コード内の関数(例えば外来バイナリ109内のコードストリーム302)を呼び出せるようにすること、及び外来コード内の関数がECネイティブコード108b内の関数を呼び出せるようにすることが含まれている。外来コードはエミュレータ106bで動作するため、これらのクロスABI関数呼び出しの各々について、エミュレータ106b内への遷移、又はエミュレータ106bからの退出がある。複数の実施形態において、ハイブリッドバイナリ108は、外来ABI(107c)からEC ABI(107b)に遷移するため(すなわち外来バイナリ109内のコードがECネイティブコード108b内の関数を呼び出す場合)の入口サンク、及びEC ABI(107b)から外来ABI(107c)に遷移するため(すなわちECネイティブコード108b内のコードが外来バイナリ109内の関数を呼び出す場合)の出口サンクを含んでいてよい。いくつかの実施形態において、外来コードから呼び出され得るECネイティブコード108bに含まれる各関数は1個の入口サンク(サイズがゼロであり得る)、及び異なる外来関数への各々の呼び出し用の出口サンクを含んでいる。複数の実施形態において、サンクは、EC ABI(107b)のCCを外来ABI(107c)のCCに適合させる(又はその逆)等、EC ABI(107b)と外来ABI(107c)の差違に適合されている。
【0045】
[054] 複数の実施形態において、各入口サンクは、外来関数によりECネイティブ関数に渡されるパラメータがECネイティブ関数による使用に適した位置に存在することを保証する。これは例えば、あるレジスタから別のレジスタへの値の移動、スタック位置からレジスタへの値の移動、レジスタからスタック位置への値の移動等を含んでいてよい。いくつかの実施形態において、EC ABI(107b)は、外来関数によりECネイティブ関数に渡されたパラメータが、ECネイティブ関数による使用に適した位置に既に存在するように定義されていてよい。これらの状況において、入口サンクのサイズはゼロ(従って何もしないか又は省略される)であってよい。いくつかの実装において、これはECネイティブ関数に渡されるパラメータの個数が閾値を下回る場合に特にあてはまると言える。例えば、本発明者らは、AArch64ネイティブISA及びx86_64外来ISAの場合、外来関数からECネイティブ関数に4個未満のパラメータが渡され、これらのパラメータの全てが初等整数であれば、入口サンクのサイズをゼロにできるようにEC ABI(107b)(AArch64とx86_64レジスタの間のマッピングを含む)を定義できることを見出した。
【0046】
[055] 複数の実施形態において、出口サンクは、ECネイティブ関数による外来関数の各々の呼び出しに用いられ、従って単一のECネイティブ関数は(ECネイティブ関数が呼び出す何種類の外来関数に依存して)ゼロ個以上の出口サンクを有していてよい。複数の実施形態において、各出口サンクは(i)ECネイティブ関数に戻るのに適した位置(例えばスタック又はレジスタ)への関数の戻りアドレスの保存、(ii)呼び出された外来関数にECネイティブ関数から渡される複数のパラメータが外来関数による使用のため適切な位置に存在することの保証、又は(iii)エミュレータ106b内での外来関数の実行の開始のうち1個以上を実行する。
【0047】
[056]
図4A、4Bに、ネイティブ関数同士、及びネイティブ関数と外来関数との間の呼び出しの例400a、400bを示す。特に、
図4Aは、現行ABI(107a)を対象としてコンパイルされた現行ネイティブ関数403の呼び出し挙動、及びEC ABI(107b)を対象としてコンパイルされたECネイティブ関数404の呼び出し挙動を示す。複数の実施形態において、現行ネイティブ関数403及びECネイティブ関数404は同一ソースコード関数の異なるコンパイル済みバージョンであるが、得られたコンパイル済みコード間の不適合に起因して互いに折り畳まれていない。複数の実施形態において、この不適合が生じ得るのは、現行ネイティブ関数403が現行ABI(107a)で使用可能な(しかしEC ABI(107b)では使用不可能な)1個以上のレジスタを使用するのに対し、ECネイティブ関数403は(
図3Aに関して議論したように)外来ABI(107c)にマッピングされるレジスタの縮小集合しか用いないためである。代替的に、この不適合が生じ得るのは、現行ABI(107a)及びEC ABI(107b)を対象とする場合に条件付きコードコンパイルによりコード論理が分岐してしまうためである。例えば、上述のように、複数の実施形態において、コンパイラツールチェーン107dは、現行ABI(107a)及びEC ABI(107b)の各々を対象として同一関数をコンパイルする場合に異なるプリプロセッサディレクティブ(従って異なる論理経路)を辿る。特に、コンパイラツールチェーン107dは、現行ABI(107a)を対象とする場合は「ネイティブISA」論理経路を辿るが、EC ABI(107b)を対象とする場合は「外来ISA」論理経路を辿る。
【0048】
[057]
図4Aにおいて、経路#1はネイティブCC(図では「ネイティブCC」)を用いて現行ネイティブ関数403が呼び出されることを示す。また、経路#1は現行ネイティブ関数403がネイティブCCを用いて呼び出しを行うことができることを示す。一方、経路#2は、入口サンク401を介して外来CC(図では外来CC)を用いてECネイティブ関数404が間接的に呼び出されるため、外来CCとネイティブCCの間に差違があれば適合させ、次いでECネイティブ関数404を起動することを示す。また、経路#2はECネイティブ関数404が出口サンク402を介して外来関数を間接的に呼び出すことにより、ネイティブCCと外来CCとの間の差違があれば適合させ、次いで外来関数を起動できることを示す。経路#3は、(例えばコードストリーム301c及び/又はコードストリーム302内の)外来関数405が(例えば出口サンク402又は別の外来関数により)外来CCを用いて呼び出されることを示す。
【0049】
[058]
図4Bに、ソースコード関数を現行ABI(107a)及びEC ABI(107b)の両方に向けてコンパイルすることから同一のコードが得られたために折り畳まれたECネイティブ関数406の呼び出し挙動を示す。
図4Bにおいて、経路#1はネイティブCCを用いてECネイティブ関数406を呼び出せることを示し、経路#2は入口サンク401を介して外来CCを用いてECネイティブ関数406を間接的に呼び出せることも示す。また、
図4Bは「ECネイティブ関数404はネイティブCCを用いて出口サンク402を介して他のネイティブ関数又は外来関数を呼び出すことが出来る」ことを示す。経路#3は外来CCを用いて(例えば出口サンク402又は別の外来関数により)外来関数405が呼び出されることを示す。
【0050】
[059] 複数の実施形態において、コンピュータシステム101は、ネイティブと外来コード(すなわちABI(107b)と外来ABI(107c)の間)を橋渡しする場合であっても、関数呼び出しサイトが一貫して呼び出され側関数の真のメモリアドレスの呼び出す/参照することを可能にする。特に、呼び出しサイトで真のメモリアドレスを用いるのは、ABI遷移の橋渡しに入口サンクと出口サンクを用いるため、ネイティブコードと外来コードを橋渡しする場合に困難になる。これは、2個のネイティブ関数内の呼び出しサイトが同じ外来関数を呼び出すのに異なるアドレスを実際には使用する可能性があるネイティブコードと外来コードを橋渡しする従来のソリューションとは対照的である。その理由は、これらの従来ソリューションでは呼び出しサイトが実際には外来関数の真のアドレスではなくサンクのアドレスを呼び出しているからである。この挙動は、ネイティブコード内のプログラム論理がアドレス比較(例えば第1のネイティブ関数により得られた外来関数への第1のポインタと第2のネイティブ関数により得られた外来関数への第2のポインタとの比較)に依存する場合、ポインタがネイティブコードから外来コードに渡された場合(外来コードに対して無効/使用不可能な場合)、又はポインタが外来コードからネイティブコードに渡された場合(ネイティブコードに対して無効/使用不可能な場合)互換性に関する懸念が生じ得る。本明細書に記述するソリューションを用いる前提で、第1の外来関数の(例えば外来バイナリ109内の)メモリアドレスを取得する(又は「取る」)場合、複数の実施形態が、ECネイティブコード108bに含まれる第1のネイティブ関数及びECネイティブコード108bに含まれる第2のネイティブ関数が共に、第1の外来関数に対して同じメモリアドレスであって、第1の外来関数が始まる真のメモリアドレスを取得することを保証する。更に、複数の実施形態はまた、(例えば外来バイナリ109内の)第2の外来関数もまた第1の外来関数に対して同一の真のメモリアドレスを取得することを保証する。複数の実施形態はまた、ネイティブ関数のアドレスが、外来関数又は別のネイティブ関数のどちらで取得されたかに依らず同一であることを保証する。
【0051】
[060] 複数の実施形態において、一貫したメモリアドレス参照は、ハイブリッドバイナリ108内のEC探索構造体307(例えばコンパイラツールチェーン107dによりハイブリッドバイナリ108にエミットされる)及びディスパッチャ112(すなわちライブラリ106a内のディスパッチャ112a及びエミュレータ106b内のディスパッチャ112b)により可能とされる。複数の実施形態において、EC探索構造体307は、ハイブリッドバイナリ108により定義されるメモリイメージのメモリアドレスのどの範囲がECネイティブコード108bを含むか否かの判定に使用できる任意の種類の構造である。複数の実施形態において、EC探索構造体307はビットマップであり、1ビットの値を用いて、対応するメモリの範囲(例えばメモリページ)がECネイティブコード108bを損傷させるか否かを示す。しかし、EC探索構造体307は、ハッシュテーブル又は二分木等の代替的なデータ構造種類を含んでいてよい。
【0052】
[061] 複数の実施形態において、呼び出し側関数から呼び出され側関数への呼び出しが行われている場合、ディスパッチャ112はEC探索構造体307を用いて、呼び出され側関数の宛先メモリアドレスがECネイティブコード内に存在するか否かを判定する。次いで、呼び出し側関数がネイティブコードであるか外来コードであるかに関する固有の知識に基づいて、ディスパッチャ112は適宜呼び出しを発する。複数の実施形態において、ディスパッチャ112は少なくとも4通りのシナリオ、すなわちネイティブの呼び出し側とネイティブの呼び出され側、ネイティブの呼び出し側と外来の呼び出され側、外来の呼び出し側と外来の呼び出され側、及び外来の呼び出し側とネイティブの呼び出され側で動作する。
【0053】
[062] 第1のシナリオでは、呼び出し側関数はEC ABI(107b)で動作するネイティブ関数であり、従って呼び出しはライブラリ106aのディスパッチャ112aにより処理される。ディスパッチャ112aはEC探索構造体307を用いて、呼び出され側の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内にあり、従って呼び出され側関数もEC ABI(107b)で動作するネイティブ関数であると判定する。この状況において、呼び出し側は呼び出され側関数の真のメモリアドレスを呼び出しており、サンクを必要としないため、ディスパッチャ112aは参照メモリアドレスを用いて呼び出され側関数を直接起動する。
【0054】
[063] 第2のシナリオでは、呼び出し側関数はEC ABI(107b)で実行されるネイティブ関数であり、従って当該呼び出しはライブラリ106aのディスパッチャ112aにより処理される。ディスパッチャ112aはEC探索構造体307を用いて、呼び出され側の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内になく、従って呼び出され側関数が外来ABI(107c)で動作する外来関数であると判定する。
図4Aを参照するに、これはECネイティブ関数404が出口サンク402を介して外来関数を呼び出す経路#2の状況である。このように、ディスパッチャ112aが参照メモリアドレス(すなわち呼び出され側関数の)を直接呼び出すのは出口サンク402を迂回するため不可能である。その代わり、ディスパッチャ112aは、出口サンク402への新たな参照アドレスを特定し、この新たな参照メモリアドレスを用いて出口サンク402を起動する。複数の実施形態において、出口サンク402はこれによりEC ABI(107b)のCCを外来ABI(107c)のCCに適合させ、次いでエミュレータ106bを起動する。エミュレータ106bはこれにより元の参照メモリアドレスを用いて呼び出され側関数を直接呼び出す。
【0055】
[064] 複数の実施形態において、出口サンクへの新たな参照アドレスは呼び出され側関数自身の内部に含まれている。これらの実施形態において、呼び出しサイトには2個の参照メモリアドレス、すなわち呼び出され側関数の元の参照メモリアドレス、及び出口サンクへの新たな参照アドレスが関連付けられる。ハイブリッドバイナリ108が現行ABI(107a)に基づいてロードされた場合、現行ABI(107a)が使用するディスパッチャは出口サンクへの新たな参照アドレスを無視して、呼び出され側関数の元の参照メモリアドレスを直接使用する。特に、現行ABI(107a)は、外来コードと対話しないため、出口サンクへの新たな参照アドレスを無視することができる。一方、ハイブリッドバイナリ108がEC ABI(107b)に基づいてロードされた場合、ディスパッチャ112aもまた、外来コードと対話すべく出口サンクへの新たな参照アドレスを使用する。特に、コンパイラツールチェーン107dは、関数が現行ABI(107a)又はEC ABI(107b)のいずれを対象とするかに依らず、元の参照メモリアドレス及び新たな参照アドレスの両方をコンパイル済みコードに含めることにより折り畳みを可能にする。
【0056】
[065] 第3のシナリオにおいて、呼び出し側関数はエミュレータ106b内の外来ABI(107c)で動作する外来関数であり、従って呼び出しはエミュレータ106bのディスパッチャ112bにより処理される。ディスパッチャ112bはEC探索構造体307を用いて、呼び出され側の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内に存在せず、従って呼び出され側関数も外来ABI(107c)で動作する外来関数であると判定する。この状況において、呼び出し側は呼び出され側関数の真のメモリアドレスを呼び出しており、サンクを必要としないため、ディスパッチャ112bはエミュレータ106b内の参照メモリアドレスを用いて呼び出され側関数を直接起動する。
【0057】
[066] 第4のシナリオにおいて、呼び出され側関数は、エミュレータ106b内の外来ABI(107c)で動作する外来関数であり、従って呼び出しはエミュレータ106bのディスパッチャ112bにより処理される。ディスパッチャ112bはEC探索構造体307を用いて、呼び出され側の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内にあり、従って呼び出され側関数がEC ABI(107b)で動作するネイティブ関数であると判定する。
図4Aを参照するに、これは外来関数が入口サンク401を介してECネイティブ関数404を呼び出している経路#2の状況である。このように、ディスパッチャ112bが参照メモリアドレス(すなわち呼び出され側関数の)を直接呼び出すのは入口サンク401を迂回するため不可能である。その代わり、ディスパッチャ112bは、入口サンク401への新たな参照アドレスを特定し、この新たな参照メモリアドレスを用いて入口サンク401を起動する。複数の実施形態において、入口サンク401はこれにより、外来ABI(107c)のCCをEC ABI(107b)のCCに適合させ、次いで元の参照メモリアドレスを用いて呼び出され側関数を起動する。
【0058】
[067] 特に、第4のシナリオにおいて、呼び出し側関数は、EC ABI(107b)を想定して、又は互換性を有するように設計されていない従来型外来コードであってよい。従って、第2のシナリオとは異なり、呼び出し側関数は入口サンクのアドレスを含むように(例えばコンパイラツールチェーンにより)変更できない。複数の実施形態において、ディスパッチャ112bは、呼び出され側関数の元の参照メモリアドレスの直前のメモリブロックから入口サンクへの新たな参照アドレスを取得する。複数の実施形態において、入口サンクへの新たな参照アドレスを取得するためのデータは、ハイブリッドバイナリ108の生成中用にコンパイラツールチェーン107dにより当該メモリブロックに挿入される。当該メモリブロックに含まれる特定のデータは様々であるが、いくつかの実施形態において、(例えばハイブリッドバイナリ108により定義されるメモリイメージの先頭からの)メモリオフセットである。他の複数の実施形態では入口サンクへの直接アドレス参照であってよい。他の複数の実施形態において、ディスパッチャ112bは、データツリー又はアドレスの順序付きアレイ等、何らかの代替的な仕方で新たな参照アドレスを取得する。
【0059】
[068] 複数の実施形態において、EC ABI(107b)はコンパイラツールチェーン107d及びディスパッチャ112と共に、ネイティブ関数を呼び出す外来コードが、ネイティブ関数の先頭に挿入された外来コードを首尾よく識別し、潜在的にパッチを当てることを可能にする「互換性モード」をサポートする。これにより、外来コードは、呼び出された関数の先頭を(例えばウイルス対策、コピー防止等の一部として)逆アセンブルすること、及び/又は当該関数の呼び出しに関連して(例えばプロファイリングリダイレクションの一部として)呼び出された関数の先頭にパッチを当てることが可能になる。エミュレートされていることを認識していない外来コードは、呼び出された関数の先頭に認識可能な外来コードを見つけることを期待する場合があるため、コンパイラツールチェーン107dはいくつかの実施形態において、外来コードがディスアセンブル及び/又はパッチ当て動作を行うことができるネイティブ関数用の「早送りシーケンス」(サンクの一形式)をハイブリッドバイナリ108にエミットする。複数の実施形態において、「早送りシーケンス」は、ネイティブ関数の真のアドレスを参照するか、又は真のアドレスへジャンプして完了するプレースホルダ外来コードを含んでいる。複数の実施形態において、この早送りシーケンスは、ECネイティブコードを含んでいないものとしてEC探索構造体307でマークされたメモリページに保存される。従って、複数の実施形態において、外来の呼び出し側が早送りシーケンスを有するネイティブ関数を呼び出したならば、当該呼び出しは当初は外来から外来への呼び出し(すなわち上記第3のシナリオのように)として、エミュレータ106bが早送りシーケンスを実行し、早送りシーケンスの完了時点で外来からネイティブへの呼び出しを行うように(すなわち上記第4のシナリオのように)扱われる。
【0060】
[069] 特に、この構成は、エミュレータ106bが、(例えば第3のシナリオのように)早送りサンク内でいくつかの命令をエミュレートするためだけに、次いで別のサンク、すなわちネイティブ関数への入口サンクの呼び出しを開始する(例えば第4のシナリオのように)ためだけに起動された場合、ダブルサンク性能問題を起こし得る。いくつかの実施形態は、呼び出され側の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内に存在しないと判定した後で(すなわちEC探索構造体307を用いて)追加のチェックを行うべく(エミュレータ106b内の)ディスパッチャ112bを設定することによりこのダブルサンク性能問題を回避する。この追加的チェックは、呼び出され側関数の先頭で「ピーク」して早送りシーケンスのシグネチャが存在するか否かを判定するものである。存在する場合、ディスパッチャ112bは、早送りシーケンスからネイティブ関数の真のアドレスを取得して、ネイティブ関数への呼び出しを直接開始する(すなわち上述の第4のシナリオのように)。この追加的なチェックを行うことにより、エミュレータ106bによる早送りサンクの処理が回避されている。
【0061】
[070] 上述の序文に参考に、以下の記述では多くの方法及び方法動作に言及する。方法動作は、特定の順序で記述、又は特定の順序で生じるようにフロー図に示す場合があるが、具体的に明示しない限り特定の順序で行われる必要はなく、又はある動作が当該動作の実行前に別の動作が完了していることを前提として行われる必要はない。
【0062】
[071] 外来コードのエミュレーションをサポートするネイティブエミュレーション互換アプリケーションバイナリインターフェース
0063 [072]
図5に、外来の第2のISA用にコンパイルされたコードで動作可能である一方で、ネイティブな第1のISAを対象とするバイナリファイルにソースコードをコンパイルする例示的方法500のフロー図を示す。最初に、方法500は、第1のISAの第1及び第2のABI、並びに第2のISAの第3のABIを識別する動作501を含み、第2のABIは、第3のABIのコンテキストデータサイズを超えないコンテキストデータを定義すると共に、第3のABIにマッピングされるレジスタの部分集合の使用を定義することを含んでいる。複数の実施形態において、動作501は、(i)第1のISAに対応する第1のABI、(ii)第1のISAに対応する第2のABI、及び(iii)第2のISAに対応する第3のABIを識別することを含んでいる。一例において、コンパイラツールチェーン107dは現行ABI(107a)(すなわち第1のABI)、EC ABI(107b)(すなわち第2のABI)、及び外来ABI(すなわち第3のABI)の各々を識別する。
【0063】
[073] これらの実施形態において、第2のABIは、第3のABIが使用する第2のコンテキストデータフォーマットの第2のサイズを超えない第1のサイズを有する第1のコンテキストデータフォーマットを定義する。
図3Aを参照するに、例えばコンテキストデータ202bのフォーマットはEC ABI(107b)により、(外来ABI(107c)により定義される)コンテキストデータ202cのサイズを超えないサイズを有するように定義される。
【0064】
[074] これらの実施形態において、第2のABIはまた、第1のISAの複数のレジスタのうち、第1のABIが使用するレジスタの部分集合の使用を定義する。いくつかの実施形態において、レジスタの部分集合は(例えば例200のように)第1のISAの複数のレジスタの全てよりも少ない個数を含むが、他の複数の実施形態ではレジスタの部分集合は第1のISAの複数のレジスタの全てを含んでいる。複数の実施形態において、当該レジスタの部分集合は、第3のABIが使用する第2のISAのレジスタの集合にマッピングされる。複数の実施形態において、第2のABIは、第1のABIが許可した1個以上の他のレジスタを除き、レジスタの部分集合の使用だけを許可する。再び
図3Aを参照するに、EC ABI(107b)は、現行ABI(107a)が使用する使用可能なレジスタ201aの部分集合である(すなわち現行ABI(107a)が使用する1個以上の使用可能なレジスタ201aを除外した)使用可能なレジスタ201bの集合を定義する。また、使用可能なレジスタ201bはEC ABI(107b)により、外来ABI(107c)が使用する使用可能なレジスタ201cの集合にマッピングされる。
【0065】
[075] 複数の実施形態において、第2のABIがレジスタの部分集合を使用した結果、第1のABI及び第2のABIの各々を用いてコンパイルされた場合に関数の少なくとも一部が折り畳み可能になる。例えば、複数の実施形態において、使用可能なレジスタ201bの選択は、使用可能なレジスタ201aを充分密接にミラーリングするため、少なくともいくつかのケースにおいて、現行ABI(107a)及びEC ABI(107b)の各々に向けてコンパイルされた関数が同一のコンパイル済みコードとなる。複数の実施形態において、第2のABIがレジスタの部分集合を使用することもまた、第2のABIを対象としてコンパイルされた関数の少なくとも一部を入口サンクなしで第3のABIから呼び出せるようにする。例えば、第1のABIがAArch64 ABIであり、第3のABIがWindows-X64 ABIである場合、4個以下の入力パラメータを受け取るネイティブ関数に対する入口サンクを省略できる仕方で第2のABIを定義することが可能になる。
【0066】
[076] 方法500はまた、関数をバイナリにエミットする動作502を含んでいる。図示するように、動作502は、第1のABIを対象として関数をコンパイルして第1のコンパイル済みバージョンを生成する動作503、及び第2のABIを対象として関数をコンパイルして第2のコンパイル済みバージョンを生成する動作504を含んでいる。図示するように、動作503と504の間に特定の順序は示しておらず、これらの動作が並列又は直列に(いずれか順序でも)実行され得ることが理解されよう。複数の実施形態において、ソースコードに定義された関数の場合、動作503は(第1のISAに準拠する第2の命令セットの生成を含めて)第2のABIを対象とする関数の第2のコンパイル済みバージョンを生成することを含んでいるのに対し、動作504は(第1のISAに準拠する第1の命令セットの生成を含めて)第1のABIを対象とする関数の第1のコンパイル済みバージョンを生成することを含んでいる。一例において、コンパイラツールチェーン107dはソースコードの関数を、第1のABIを対象として1回、及び第2のABIを対象として1回の計2回コンパイルする結果、関数の2個のコンパイル済みバージョンが得られる。上述のように、複数の実施形態において、コンパイラツールチェーン107dは、現行ABI(107a)を対象とする場合「ネイティブISA」論理経路を辿り、EC ABI(107b)を対象とする場合「外来ISA」論理経路を辿る。従って、いくつかの実施形態において、動作502で第1のABIを対象とする関数の第1のコンパイル済みバージョンを生成することは第1のISAのソースコード定義を用いることを含み、動作503で第2のABIを対象とする関数の第2のコンパイル済みバージョンを生成することは第2のISAのソースコード定義を用いることを含んでいる。
【0067】
[077] 動作502はまた、第1及び第2のコンパイル済みバージョンが適合し、従って折り畳み可能か否かを判定する動作505を含んでいる。複数の実施形態において、動作505は、少なくとも第1の命令セットと第2の命令セットが適合するか否かの判定に基づいて、関数の第1のコンパイル済みバージョンと関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能か否かを判定することを含んでいる。一例において、コンパイラツールチェーン107dは、動作503及び動作504で生成された関数の2個のコンパイル済みバージョン同士の比較を実行する。これらが適合する場合、関数の2個のコンパイル済みバージョンは折り畳み可能であり、さもなければ折り畳み不可能である。
【0068】
[078] 動作505の結果に応じて、動作502は、(コンパイルされた関数が折り畳み不可能な場合)両方のコンパイル済みバージョンをバイナリにエミットする動作506、又は(コンパイルされた関数が折り畳み可能な場合)1個のコンパイル済みバージョンだけをバイナリにエミットする動作507のいずれかを含んでいる。複数の実施形態において、動作506は、少なくとも関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能か否かの判定に基づいて、関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み不可能と判定された場合に、関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンの両方をバイナリファイルにエミットすることを含んでいる。一例において、コンパイラツールチェーン107dは、コンパイルされた関数が折り畳み不可能な場合、関数の現行バージョン(例えば現行ネイティブ関数403等)及び関数のECバージョン(例えばECネイティブ関数404等)の両方をハイブリッドバイナリ108にエミットする。複数の実施形態において、動作507は、少なくとも関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能か否かの判定に基づいて、関数の第1のコンパイル済みバージョン及び関数の第2のコンパイル済みバージョンがバイナリファイル内で折り畳み可能と判定された場合、関数の第1のコンパイル済みバージョン又は関数の第2のコンパイル済みバージョンの一方だけをバイナリファイルにエミットすることを含んでいる。一例において、コンパイラツールチェーン107dは、コンパイルされた関数が折り畳み可能な場合、関数の単一のECバージョン(例えばECネイティブ関数406等)をハイブリッドバイナリ108にエミットする。
【0069】
[079] 複数の実施形態において、第2のABIはバイナリファイルを(i)第1のABIを実装するが第2のABIを実装しない第1のコンピュータシステム、及び(ii)第2のABIを実装する第2のコンピュータシステムの両方でネイティブに動作可能にする。例えば、方法500を用いて生成されたハイブリッドバイナリ108は、現行ABI(107a)だけを実装する「従来型」コンピュータシステム、又はEC ABI(107b)も実装する最新のコンピュータシステムで実行可能である。
【0070】
[080] いくつかの実施形態において、方法500はまた、入口サンクをバイナリファイルにエミットすることも含み、入口サンクは第3のABIを第2のABIに適合させる第1のISA内にコードを含んでいる。一例において、動作506が実行された場合、コンパイラツールチェーン107dは、エミットされた関数のECバージョン(例えばECネイティブ関数404)に入口サンクをエミットすることにより、外来コードが当該関数を呼び出せるようにする。別の例において、動作507が実行された場合、コンパイラツールチェーン107dは、EC関数(例えばECネイティブ関数406)と考えられる単一のエミットされた関数に対して入口サンクをエミットすることにより、外来コードが当該関数を呼び出せるようにする。
【0071】
[081] いくつかの実施形態において、方法500はまた、1個以上の出口サンクをバイナリファイルにエミットすることも含み、各出口サンクは、第2のABIを第3のABIに適合させる第1のISA内にコードを含んでいる。一例において、動作506が実行された場合、コンパイラツールチェーン107dは、関数のエミットされたECバージョン(例えばECネイティブ関数404)に対して1個以上の出口サンクをエミットすることにより、関数が外来コードを呼び出せるようにする。別の例において、動作507が実行された場合、コンパイラツールチェーン107dは、単一のエミットされた関数に対して1個以上の出口サンクをエミットすることにより、当該関数が外来コードを呼び出せるようにする。いくつかの実施形態において、方法500は、関数による各々の異なる呼び出しに対して異なる出口サンクを生成するが、他の複数の実施形態において、方法500は、各々の呼び出され側に対して単一の出口サンクを生成する場合がある。
【0072】
[082] 上述のように、ハイブリッドバイナリは、外来コードを含むコードストリーム301c等、追加的な外来コードストリームを含んでいてよい。従って、方法500は、第2のISAに準拠して第3の命令セットを生成すること、及び関数の第3のコンパイル済みバージョンをバイナリファイルにエミットすることを含む、第3のABIを対象とする関数の第3のコンパイル済みバージョンを生成することを更に含んでいてよい。
【0073】
[083] 方法500のいくつかの変形は、エミットされたバイナリがEC ABI(107b)を対象とするが現行ABI(107a)は対象としないように、「現行」コードストリームを省略することができる。理解されるように、結果的に得られるバイナリは、外来ABI(107c)を対象とするコードとの互換性を提供するが、現行ABI(107a)を実装するがEC ABI(107b)は実装しないプログラムとの後方互換性を欠くであろう。複数の実施形態において、「現行」コードストリームを省略することは、現行ABI(107a)を使用しないアプリケーションのみでの使用を意図されたバイナリには有用であり得る。その一例が、ネイティブアプリケーションでの使用から除外されたが、エミュレートされたアプリケーションとの互換性のために保持される機能(例えば旧式のビデオフォーマットに対するコーデックサポート)を実装するバイナリである。
【0074】
[084] コードストリームの折り畳みをサポートするハイブリッドバイナリ
【0075】
[085]
図5は、コードの折り畳みを可能にするEC ABI(107b)を用いてコードを生成する方法に注目したが、ハイブリッドバイナリ108は、(例えば現行ABI(107a)だけを有する)従来型システムとの後方互換性を可能にする一方で、(例えばEC ABI(107b)を有する)最新システムが外来コードと対話する追加的特徴を使用できるようにする追加的特徴を含んでいてよい。これらのデュアルアーキテクチャハイブリッドバイナリ108の生成を更に説明すべく、
図6に、ハイブリッドバイナリイメージを生成する例示的方法600のフロー図を示し、ハイブリッドバイナリイメージはネイティブABI及び互換ABIの両方で実行可能である。次いで、これらのデュアルアーキテクチャハイブリッドバイナリ108の使用を更に説明すべく、
図7に、互換ABIで動作するプロセスによりハイブリッドバイナリイメージを使用する例示的方法700のフロー図を示し、ハイブリッドバイナリイメージはネイティブABI及び互換ABIの両方で実行可能である。
【0076】
[086] 最初にバイナリイメージ生成、及び
図6を参照するに、方法600は、フロー図に示すように、互いに任意の順序で実行できる複数の動作(すなわち動作601~604)を含んでいる。図示するように、方法600は、ネイティブABIの機械種別を識別してネイティブABIが読み取る機械種別フィールドにエミットする動作601を含んでいる。いくつかの実施形態において、動作601は、少なくともネイティブABIに対応する第1の機械種別を識別することに基づいて、当該第1の機械種別をハイブリッドバイナリイメージの機械種別フィールドにエミットすることを含み、機械種別フィールドは、ハイブリッドバイナリイメージがネイティブABIで実行するネイティブプロセスによりロードされた場合に使用されるべく構造化されている。一例として、コンパイラツールチェーン107dは、現行ABI(107a)を対象とするバイナリをロードする場合に現行ABI(107a)が期待する識別子と適合する機械識別子303をハイブリッドバイナリ108にエミットする。現行ABI(107a)が期待する識別子をエミットすることにより、現行ABI(107a)は、たとえハイブリッドバイナリ108がEC ABI(107b)とも互換性がある場合も、ハイブリッドバイナリ108をロードする際に期待されるものを確認する。
【0077】
[087] 方法600はまた、折り畳み不可能な関数を識別してエミットする動作602を含んでいる。図示するように、動作602は、(i)ネイティブABIで実行される折り畳み不可能な関数の第1のコンパイル済みバージョンをエミットする動作602a、及び(ii)互換ABIで実行される折り畳み不可能な関数の第2のコンパイル済みバージョンをエミットする動作602bの両方を含んでいる。図示するように、動作602aと602bの間に特定の順序を示しておらず、これらの動作が並列又は直列的(いずれの順序でも)実行され得ることが理解されよう。いくつかの実施形態において、動作602aは、少なくとも折り畳み不可能な第1の関数を識別することに基づいて、ネイティブABIで実行可能な第1の関数の第1のコンパイル済みバージョンをハイブリッドバイナリイメージにエミットすることを含むのに対し、動作602bは、少なくとも折り畳み不可能な第1の関数を識別することに基づいて、互換ABIで実行可能な第1の関数の第2のコンパイル済みバージョンをハイブリッドバイナリイメージにエミットすることを含んでいる。一例において、(例えば方法500の動作503及び504において)少なくともソースコード関数を異なるコンパイル済みバージョン用にコンパイルすることに基づいて、且つそれらのコンパイル済みバージョンが(例えば方法500の動作505において)折り畳み不可能ことを判定することに基づいて、コンパイラツールチェーン107dは、(例えば方法500の動作506の一部として)動作602a及び動作602bでこれらのコンパイル済みバージョンの両方をハイブリッドバイナリ108にエミットする。
【0078】
[088] 方法600はまた、ネイティブABI及び互換ABIの両方で実行される折り畳み可能な関数を識別してエミットする動作603であって、折り畳み可能でない関数の第1のコンパイル済みバージョンへの呼び出しにより折り畳み可能な関数のコンパイル済みバージョンをエミットすることを含む動作を含んでいる。いくつかの実施形態において、動作603は、少なくとも折り畳み可能な第2の関数を識別することに基づいて、ネイティブABI及び互換ABIの両方で実行可能な第2の関数のコンパイル済みバージョンをハイブリッドバイナリイメージにエミットすることを含んでいる。一例において、少なくとも(例えば方法500の動作503及び504で)ソースコード関数を異なるコンパイル済みバージョン用にコンパイルすることに基づいて、また(例えば方法500の動作505で)それらのコンパイル済みバージョンが折り畳み可能であるとの判定に基づいて、コンパイラツールチェーン107dは、動作603でこれらのコンパイル済みバージョンの一方だけを(例えば方法500の動作507の一部として)ハイブリッドバイナリ108にエミットする。
【0079】
[089] 複数の実施形態において、第2の関数のコンパイル済みバージョンは、ハイブリッドバイナリイメージがネイティブプロセスによりロードされた場合に第1の関数の第1のコンパイル済みバージョンを呼び出すべく構造化されている。一例において、コンパイラツールチェーン107dは、ハイブリッドバイナリ108が現行ABI(107a)に基づいてロードされた場合に(動作602bでエミットされたコードではなく)動作602aでエミットされたコードが実行されるように、動作603でエミットされたコードが「デフォルトで」動作602aでエミットされたコードを呼ぶようにハイブリッドバイナリ108を設定する。
【0080】
[090] 方法600はまた、互換ABIが使用する補正テーブルをエミットする動作604を含んでいる。いくつかの実施形態において、動作604は、ハイブリッドバイナリイメージが互換ABIで実行される互換プロセス(例えばエミュレートされたプロセス111)によりロードされた場合に使用される構造化された補正テーブルをハイブリッドバイナリイメージにエミットすることを含み、補正テーブルはハイブリッドバイナリイメージからロードされたメモリに対する複数の変換を定義している。一例において、コンパイラツールチェーン107dは、ハイブリッドバイナリ108がEC ABI(107b)に基づいてロードされた場合に適用されてハイブリッドバイナリ108のEC特徴を使用させる変換を含む補正テーブル108cをハイブリッドバイナリ108にエミットする。
【0081】
[091] 複数の実施形態において、補正テーブル108c内の複数の変換は、互換ABIに対応する第2の機械種別を含むように機械種別フィールドを調整する変換を含んでいる。一例において、コンパイラツールチェーン107dは、機械識別子303からシステムメモリ104にロードされた機械識別子を、外来ABI(107c)に対応する外来ISAに適合する機械識別子で(システムメモリ104内で)代替するメモリ変換を補正テーブル108cにエミットする。
【0082】
[092] 複数の実施形態において、補正テーブル108c内の複数の変換は、(折り畳み可能な)第2の関数のコンパイル済みバージョンを、(折り畳み不可能な)第1の関数の第1のコンパイル済みバージョンではなく(折り畳み不可能な)第1の関数の第2のコンパイル済みバージョンを呼び出すべく設定する変換を含んでいる。一例において、コンパイラツールチェーン107dは、(折り畳み不可能な)第1の関数の第1のコンパイル済みバージョンを参照する第1メモリアドレスを(折り畳み不可能な)第1の関数の第2のコンパイル済みバージョンを参照する第2のメモリアドレスに代替するメモリ変換を補正テーブル108cにエミットする。第1のメモリアドレスは、(折り畳み可能な)第2の関数のコンパイル済みバージョン内で直接第2のメモリアドレスに代替され得るが、複数の実施形態において、(折り畳み可能な)第2の関数のコンパイル済みバージョンは、(折り畳み不可能な)第1の関数のコンパイル済みバージョンを参照するディスパッチテーブル306を介して(折り畳み不可能な)第1の関数を呼び出すべく構造化されている。(折り畳み可能な)第2の関数のコンパイル済みバージョン自身を補正するのではない上述の実施形態において、当該変換は(折り畳み不可能な)第1の関数の第1のコンパイル済みバージョンではなく(折り畳み不可能な)第1の関数の第2のコンパイル済みバージョンを参照すべくディスパッチテーブル306を補正する。更に、これらの実施形態において、方法600はまた、ディスパッチテーブルをハイブリッドバイナリイメージにエミットすることを含んでいる。
【0083】
[093] 複数の実施形態において、方法600はまた、(折り畳み可能な)第1の関数の第1のコンパイル済みバージョンを参照するエントリポイント304をハイブリッドバイナリイメージにエミットすることを含んでいる。複数の実施形態において、このエントリポイント304は、ハイブリッドバイナリイメージがネイティブプロセスにより(例えば現行ABI(107a)を用いて)ロードされた場合に使用されるべく構造化されている。複数の実施形態において、補正テーブル108c内の複数の変換は、代わりに(折り畳み可能な)第1の関数の第2のコンパイル済みバージョンを参照するようにエントリポイントを調整する変換を含んでいる。この調整されたエントリポイントは、ハイブリッドバイナリイメージが互換プロセスにより(例えばEC ABI(107b)を用いて)ロードされた場合に使用される。
【0084】
[094]
図3A、3Bに関して記述したように、ハイブリッドバイナリ108は、1個以上のインポートテーブル又はエクスポートテーブル(インポート/エクスポートテーブル305)を含み、ハイブリッドバイナリ108が現行ABI(107a)に関連する「ネイティブ」ビュー公開関数(及びそれらの位置)を表示するように構成されている。例えば、
図3Bに示すように、インポート/エクスポートテーブル305は、ネイティブビュー307aを公開する基本参照サイズ/カウントを用いるものであってよい。従って、複数の実施形態において、方法600は、(i)(折り畳まれていない)第1の関数の第1のコンパイル済みバージョンを用いて少なくとも(折り畳まれていない)第1の関数を参照する第1領域、(ii)第2の関数のコンパイル済みバージョンを用いて少なくとも(折り畳まれた)第2の関数を参照する第2領域、及び(iii)(折り畳まれていない)第1の関数の第2のコンパイル済みバージョンを用いて少なくとも(折り畳まれた)第1の関数を参照する第3領域を含む1個以上のテーブルを、ハイブリッドバイナリイメージにエミットすることを含んでいる。
【0085】
[095] 複数の実施形態において、これらのテーブルの「ネイティブ」ビューを提供すべく、方法600は、第3の領域を除いて第1の領域及び第2の領域を含む1個以上のテーブルのネイティブビューを提供する1個以上のテーブルへの参照をハイブリッドバイナリイメージにエミットすることを含んでいる。当該参照は、ハイブリッドバイナリイメージが(例えば現行ABI(107a)に対応する)ネイティブプロセスによりロードされた場合に使用されるべく構造化されている。これらの実施形態において、補正テーブル108c内の複数の変換は従って、第1の領域を除いて第2の領域及び第3の領域を含む1個以上のテーブルの互換ビュー(EC ABI(107b)により用いる)を提供すべく1個以上のテーブルへの参照を調整する変換を含んでいる。従って、複数の実施形態において、1個以上のテーブルへの参照はオフセット及びサイズを指定することにより1個以上のテーブルのネイティブビューを提供し、補正テーブル108c内の変換は1個以上のオフセット又はサイズを補正することにより参照を調節してこれらのテーブルの互換ビューを提供する。
【0086】
[096] 複数の実施形態において、エミットされたテーブルはインポートテーブルを含み、従って、方法600の複数の実施形態において、1個以上のテーブルは1個以上のインポートテーブルを含み、第1、第2、及び第3エントリは第1、第2、及び第3の関数インポートを含んでいる。追加又は代替的な実施形態において、エミットされたテーブルは、エクスポートテーブルを含み、従って方法600の複数の実施形態では、又は1個以上のテーブルは、1個以上のエクスポートテーブルを含み、第1、第2、及び第3のエントリは、第1、第2、及び第3の関数のエクスポートを含んでいる。
【0087】
[097] ここでバイナリイメージ使用、及び
図7を参照するに、方法700は、互換ABIを用いるプロセス内でハイブリッドバイナリのロードを開始する動作701を含んでいる。一例において、ローダー106cは、EC ABI(107b)を実装するライブラリ106aの1つを利用してハイブリッドバイナリ108のローディングを開始する。
【0088】
[098] 方法700はまた、ハイブリッドバイナリに保存された機械種別が互換ABIの機械種別と不適合であると判定する動作702を含んでいる。いくつかの実施形態において、動作702は、ハイブリッドバイナリイメージのロード中に、ハイブリッドバイナリイメージの機械種別フィールドに保存された第1の機械種別が、プロセスが実行されている互換ABIに対応する第2の機械種別と不適合であるとの判定を含んでいる。一例において、ローダー106cは、ハイブリッドバイナリ108をロードすることの一部として、機械識別子303を含むメモリページをシステムメモリ104にコピーする。ローダー106cは次いで、機械識別子303の値がEC ABI(107b)(例えば外来ABI(107c)に対応する外来ISA)に対して期待される値と不適合であると判定する。
【0089】
[099] 方法700はまた、不適合に基づいて、補正テーブルを特定する動作703を含んでいる。いくつかの実施形態において、動作703は、第1の機械種別が第2の機械種別と不適合であるとの判定に基づいて、バイナリイメージ内で、ハイブリッドバイナリイメージからロードされたメモリに対する複数の変換を定義する補正テーブルを特定することを含んでいる。一例において、ローダー106cは、ハイブリッドバイナリ108内の所定のアドレス又はオフセット、或いはハイブリッドバイナリ108からロードされたメモリページにより占有されるシステムメモリ104の部分の所定のアドレス又はオフセットを参照する等により、ハイブリッドバイナリ108内で補正テーブル108cを識別する。
【0090】
[100] 補正テーブル内の1個以上の変換を方法700はまた、ハイブリッドバイナリからロードされたメモリに適用する動作704を含んでいる。いくつかの実施形態において、動作704は、複数の変換の少なくとも一部を、ハイブリッドバイナリイメージからロードされたメモリに適用することを含んでいる。一例において、ローダー106cは、補正テーブル108cから得られた1個以上の変換を、ハイブリッドバイナリ108からロードされたメモリページにより占有されたシステムメモリ104の1個以上の部分に適用する。
【0091】
[101] ローダー106cは、補正テーブル108c内の全ての変換を一度に適用し得るが、複数の実施形態において、ローダー106cは、これらのページが(例えばページフォルト処理ルーティンの一部として)ハイブリッドバイナリ108からロードされる際に1ページずつ適用する。このように、
図7において、動作704は、動作704に戻る矢印で示されており、当該動作が、メモリページがハイブリッドバイナリ108から累進的にロードされた際に繰り返し適用され得ることを示す。従って、複数の実施形態において、ハイブリッドバイナリイメージからロードされたメモリに対する変換は、メモリページ障害の処理に関連してハイブリッドバイナリイメージからロードされたメモリページに適用される。
【0092】
[102] 複数の実施形態において、補正テーブル108cから得られた複数の変換は、互換ABIに対応する第2の機械種別を含むように機械種別フィールドを調整する変換を含んでいる。一例において、ローダー106cは、システムメモリ104内の機械識別子303に対応するメモリ位置に変換を適用して、外来ABI(107c)に対応する外来ISAに適合する値を保存すべくメモリ位置を調整する。
【0093】
[103] 複数の実施形態において、補正テーブル108cから得られた複数の変換は、ネイティブABIで実行可能な折り畳まれていない関数の第1のコンパイル済みバージョンを呼び出す呼び出しサイトを補正して、代わりに互換ABIで実行可能な折り畳まれていない関数の第2のコンパイル済みバージョンを呼び出する変換を含んでいる。一例において、ローダー106cは、呼び出しサイトに対応するメモリ位置を適用して、折り畳まれていない関数の第1のコンパイル済みバージョンを参照する第1のメモリアドレスを、折り畳まれていない関数の第2のコンパイル済みバージョンを参照する第2のメモリアドレスで代替する。呼び出しサイト自身は変換され得るが、複数の実施形態において、呼び出しサイトは、折り畳まれていない関数の第1のコンパイル済みバージョンを参照するディスパッチテーブル306を介して、折り畳まれていない第1のコンパイル済みバージョン関数を呼び出すべく構造化されている。これらの実施形態において、当該変換は、呼び出しサイト自身を補正するのではなく、折り畳まれていない関数の第1のコンパイル済みバージョンではなく、折り畳まれていない関数の第2のコンパイル済みバージョンを参照するようにディスパッチテーブル306を変更する。
【0094】
[104] 複数の実施形態において、ハイブリッドバイナリイメージは、折り畳まれていない関数の第1のコンパイル済みバージョンを参照するエントリポイントを含んでいる。複数の実施形態において、補正テーブル108cから得られた(且つ動作704で適用された)複数の変換は、折り畳まれていない関数の第2のコンパイル済みバージョンを参照するようにエントリポイントを調節する変換を含んでいる。
【0095】
[105]
図6に関して上で述べたように、複数の実施形態において、方法600は、インポート及び/又はエクスポートテーブルに対応するような1個以上のテーブルを、ネイティブビューを提供するこれらのテーブルへの参照と共にエミットする。従って、方法700によれば、いくつかの実施形態において、ハイブリッドバイナリイメージは、(i)折り畳まれていない関数の第1のコンパイル済みバージョンを用いて少なくとも折り畳まれていない関数を参照する第1の領域、(ii)少なくとも折り畳まれた関数を参照する第2の領域、及び(iii)折り畳まれていない関数の第2のコンパイル済みバージョンを用いて少なくとも折り畳まれた関数を参照する第3の領域を含む1個以上のテーブルを含んでいる。これらの実施形態において、ハイブリッドバイナリイメージはまた、第3の領域を除いて第1の領域と第2の領域を含む1個以上のテーブルのネイティブビューを提供する1個以上のテーブルへの参照も含んでいる。バイナリイメージがEC ABI(107b)に基づいてロードされた場合に互換ビューを提供すべく、方法700は、第1の領域を除いて第2の領域及び第3の領域を含む1個以上のテーブルの互換ビューを提供すべく1個以上のテーブルへの参照を調整する変換を適用することを含んでいてよい。
【0096】
[106] 一貫した参照アドレスを持つデュアルアーキテクチャの関数ポインタ
0098 [107]
図8に、(i)ネイティブISAに対応し、且つ第1のCCを有するネイティブABIを対象とするネイティブコード、及び(ii)外来ISAに対応し、且つ第2のCCを有する外来ABIを対象とする外来コードの両方の実行をサポートするプロセス内で呼び出しを処理する場合に共通参照メモリアドレスを用いる例示的方法800のフロー図を示す。
【0097】
[108] 図示するように、方法800は、参照アドレスを用いて呼び出され側関数への呼び出しを識別する動作801を含んでいる。一例において、ディスパッチャ112aは、ECネイティブコード108bに含まれるネイティブ関数から参照メモリアドレスへの呼び出しを識別する。別の例において、ディスパッチャ112bは、外来バイナリ109に含まれる(且つエミュレータ106bによりエミュレートされた)外来関数から参照メモリアドレスへの呼び出しを識別する。
【0098】
[109] 方法800はまた、探索構造体及び参照アドレスを用いて、呼び出され側関数がネイティブABI又は外来ABIのどちらに対応するかを判定する動作802を含んでいる。複数の実施形態において、動作802は、少なくとも呼び出され側関数の参照メモリアドレスを対象とする呼び出しを識別することに基づいて、呼び出され側関数がネイティブABI又は外来ABIのどちらに対応するかを判定することを含んでいる。複数の実施形態において、呼び出され側関数は、参照メモリアドレスがネイティブコードを保存する第1のメモリ内に含まれていることを示す探索構造体に基づいてネイティブABIに対応すると判定され、呼び出され側関数は、少なくとも参照メモリアドレスがネイティブコードを保存していない第2のメモリ内に含まれていることを示す探索構造体に基づいて外来ABIに対応すると判定される。一例において、ディスパッチャ112(呼び出し側がネイティブの場合はディスパッチャ112a、又は呼び出し側が外来の場合はディスパッチャ112bのいずれかであってよい)は、EC探索構造体307を照会して、呼び出され側関数の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内に存在するか否か(この場合、呼び出され側はEC ABI(107b)に対応していると判定される)、或いは呼び出され側関数の参照メモリアドレスがECネイティブコード108bに対応するメモリ領域内に存在しないか否か(この場合、呼び出され側は外来ABI(107c)に対応すると判定される)を判定する。
【0099】
[110] 注記したように、複数の実施形態においてEC探索構造体307はビットマップであり、1ビット値を用いて対応するメモリの範囲(例えばメモリページ)がECネイティブコード108bを損傷させるか否かを示す。しかし、EC探索構造体307は、ハッシュテーブル又は二分木等の代替的なデータ構造種別を含んでいてよい。従って、方法800において、探索構造体は、ビットマップ、ハッシュテーブル、又は二分木のうち少なくとも1つを含んでいる。
【0100】
[111] 上述のように、呼び出され側関数がネイティブABIに対応すると判定される、すなわち呼び出され側関数が早送りシーケンスの署名を含むとディスパッチャ112bが判定する場合に代替的なシナリオが存在し得る。従って、動作802のいくつかの実施形態において、呼び出され側関数は、(i)参照メモリアドレスがネイティブコードを保存する第1のメモリ内に含まれていることを示す探索構造体、又は(ii)早送りシーケンスが参照メモリアドレスで識別されていることのうち1つに基づいて、ネイティブABIに対応すると判定される。また、動作802のいくつかの実施形態において、探索構造体が、参照メモリアドレスがネイティブコードを保存していない第2のメモリ内に含まれていることを示す場合、動作802は、早送りシーケンスが参照メモリアドレスで識別可能か否かを判定することを含んでいる。これらの実施形態において、ディスパッチャ112bは、早送りシーケンスから新たな参照メモリアドレス(すなわちネイティブ関数の真のアドレス)を取得し、この新たな参照メモリアドレスをネイティブ呼び出しに使用する。従って、複数の実施形態において、早送りシーケンスが参照メモリアドレスで識別された場合、方法800は、早送りシーケンスから得られた新たな参照メモリアドレスで参照メモリアドレスを更新することを含んでいる。
【0101】
[112] 方法800はまた、呼び出され側関数の実行を開始する動作803を含んでいる。複数の実施形態において動作803は、少なくとも当該判定に基づいて、呼び出され側関数の実行を開始することを含んでいる。図示するように、動作803は、呼び出し側が外来且つ呼び出され側が外来ならばエミュレータの参照アドレスを直接呼び出す動作803a、呼び出し側が外来且つ呼び出され側がネイティブならば入口サンクを特定して呼び出す動作803b、呼び出し側がネイティブ且つ呼び出され側が外来ならば出口サンクを呼び出す動作803c、又は呼び出し側がネイティブ且つ呼び出され側がネイティブならば参照アドレスを直接呼び出す動作803dのうち1つを行うことを含んでいる。
【0102】
[113] 複数の実施形態において、動作803aは、呼び出し側関数が外来ABIに対応し、且つ呼び出され側関数が外来ABIに対応すると判定された場合、エミュレータ内の参照メモリアドレスを用いて呼び出され側関数を直接呼び出すことを含んでいる。一例において、外来関数からの呼び出しに基づいて、ディスパッチャ112bは呼び出され側関数も外来関数であると判定する。従って、呼び出し側は呼び出され側関数の真のメモリアドレスを呼び出していてサンクを必要としないため、ディスパッチャ112bはエミュレータ106b内の参照メモリアドレスを用いて呼び出され側関数を直接起動する。
【0103】
[114] 複数の実施形態において、動作803bは、呼び出し側関数が外来ABIに対応し、且つ呼び出され側関数がネイティブABIに対応すると判定された場合、(i)第2のCCを第1のCCに適合させ、次いで(ii)参照メモリアドレスを用いて呼び出され側関数を直接呼び出す入口サンクを呼び出すことを含んでいる。一例において、外来関数からの呼び出しに基づいて、ディスパッチャ112bは呼び出され側がネイティブ関数であると判定する。従って、ディスパッチャ112bが参照(すなわち呼び出され側関数の)メモリアドレスを直接呼び出すのは入口サンクを迂回することになるため不可能である。その代わり、ディスパッチャ112bは、入口サンクへの新たな参照アドレスを特定して、新たな参照メモリアドレスを用いて入口サンクを起動する。入口サンクは次いで、外来ABI(107c)のCCをEC ABI(107b)のCCに適合させて元の参照メモリアドレスを用いて呼び出され側関数を起動する。
【0104】
[115] 上述のように、複数の実施形態において、ディスパッチャ112bは、呼び出され側関数の元の参照メモリアドレスの直前のメモリブロックに含まれるデータ(オフセット又は直接アドレス参照等)に基づいて、入口サンクへの新たな参照アドレスを特定する。従って、複数の実施形態において、方法800はまた、少なくとも(i)参照メモリアドレスの直前のメモリブロックを読み取ること、及び(ii)メモリブロックから入口サンクの位置へのオフセット又はポインタを判定することに基づいて入口サンクの位置を識別することを含んでいる。
【0105】
[116] 複数の実施形態において、動作803cは、呼び出し側関数がネイティブABIに対応し、且つ呼び出され側関数が外来ABIに対応すると判定された場合、(i)ネイティブABIの第1のCCを外来ABIの第2のCCに適合させ、次いで(ii)エミュレータを起動して参照メモリアドレスを用いて呼び出され側関数を直接呼び出す出口サンクを呼び出すことを含んでいる。一例において、ディスパッチャ112aは、ネイティブ関数からの呼び出しに基づいて、呼び出され側が外来関数であると判定する。従って、ディスパッチャ112aが参照(すなわち呼び出され側関数の)メモリアドレスを直接呼び出すのは出口サンクを迂回することになるため不可能である。その代わり、ディスパッチャ112aは、出口サンクへの新たな参照アドレスを特定し、当該新たな参照メモリアドレスを用いて出口サンクを起動する。出口サンクは次いで、EC ABI(107b)のCCを外来ABI(107c)のCCに適合させて、エミュレータ106bを起動する。エミュレータ106bは次いで、元の参照メモリアドレスを用いて呼び出され側関数を直接呼び出す。上述のように、複数の実施形態において、出口サンクへの新たな参照アドレスは呼び出され側関数自身に含まれている。従って、方法800のいくつかの実施形態において、出口サンクの位置は呼び出し側関数内に含まれている。
【0106】
[117] 複数の実施形態において、動作803dは、呼び出し側関数がネイティブABIに対応し、且つ呼び出され側関数がネイティブABIに対応すると判定された場合、参照メモリアドレスを用いて呼び出され側関数を直接呼び出すことを含んでいる。一例において、ネイティブ関数からの呼び出しに基づいて、ディスパッチャ112aは、呼び出され側もネイティブ関数であると判定する。従って、呼び出し側は呼び出され側関数の真のメモリアドレスを呼び出していてサンクを必要としないため、ディスパッチャ112aは参照メモリアドレスを用いて呼び出され側関数を直接起動する。
【0107】
[118] 本件の主題を構造的特徴及び/又は方法論的動作に特有の言語で記述してきたが、添付の請求項に定義された主題は、必ずしも上述の特徴又は動作、或いは上述の動作の順序に限定されないことが理解されよう。むしろ、記述した特徴及び動作は請求項を実施する際の例示的な形態として開示されている。
【0108】
[119] 本発明の複数の実施形態は、以下により詳細に述べるように、例えば、1個以上のプロセッサ(例えばプロセッサ102)及びシステムメモリ(例えばシステムメモリ104)等のコンピュータハードウェアを含む専用又は汎用コンピュータシステム(例えばコンピュータシステム101)を含んでいても又は用いてもよい。本発明の範囲に含まれる複数の実施形態はまた、コンピュータ実行可能命令及び/又はデータ構造を搬送又は保存するための物理的及び他のコンピュータ読取可能な媒体も含んでいる。このようなコンピュータ可読媒体は、汎用又は専用コンピュータシステムによりアクセス可能な任意の使用可能な媒体であってよい。コンピュータ実行可能命令及び/又はデータ構造を保存するコンピュータ可読媒体はコンピュータ記憶媒体(例えば持続性記憶装置103、システムメモリ104)である。計算実行可能命令及び/又はデータ構造を搬送するコンピュータ可読媒体は送信媒体である。従って、非限定な例として、本発明の複数の実施形態は、少なくとも2つの明確に異なるコンピュータが可読媒体、すなわちコンピュータの記憶媒体と送信媒体を含んでいてよい。
【0109】
[120] コンピュータ記憶媒体は、コンピュータ実行可能命令及び/又はデータ構造を記憶する物理的記憶媒体である。物理的記憶媒体は、RAM、ROM、EEPROM、ソリッドステートドライブ(「SSD」)、フラッシュメモリ、相変化メモリ(「PCM」)、光ディスク記憶装置、磁気ディスク記憶装置又は他の磁気記憶装置等のコンピュータハードウェア、或いはコンピュータ実行可能命令又はデータ構造の形式でプログラムコードを保存すべく使用可能な任意の他のハードウェア記憶装置を含み、本発明に開示する機能を実行すべく汎用又は専用コンピュータシステムによりアクセス及び実行することができる。
【0110】
[121] 送信媒体は、コンピュータ実行可能命令又はデータ構造の形式でプログラムコードを担持でき、且つ汎用又は専用コンピュータシステムによりアクセス可能なネットワーク及び/又はデータリンクを含んでいてよい。「ネットワーク」は、コンピュータシステム及び/又はモジュール及び/又は他の電子機器間で電子データの搬送を可能にする1個以上のデータリンクとして定義される。ネットワーク又は別の通信接続(有線、無線、又は有線と無線の組み合わせのいずれか)を介してコンピュータシステムに情報が転送又は提供された場合、コンピュータシステムは当該接続を送信媒体と見なすことができる。上記の組み合わせもまたコンピュータ可読媒体の範囲に含まれるものとする。
【0111】
[122] 更に、各種のコンピュータシステムコンポーネントに到達したならば、プログラムコードがコンピュータ実行可能命令又はデータ構造の形式で送信媒体からコンピュータ記憶媒体に(又は逆向きに)自動的に転送することができる。例えば、ネットワーク又はデータリンクを介して受信された計算実行可能命令又はデータ構造は、ネットワークインターフェースモジュール(例えば「NIC」)内のRAMにバッファリングされ、次いで最終的に、コンピュータシステムRAM及び/又はコンピュータシステムのより低揮発性のコンピュータ記憶媒体に転送することができる。従って、コンピュータ記憶媒体は、同様に(又は主に)送信媒体を使用するコンピュータシステムコンポーネントに含まれ得ることを理解されたい。
【0112】
[123] コンピュータ実行可能命令は、例えば、1個以上のプロセッサで実行された場合に、汎用コンピュータシステム、専用コンピュータシステム、又は専用処理装置に特定の関数又は関数群を実行させる命令及びデータを含んでいる。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語等の中間フォーマットの命令、又はソースコードであってもよい。
【0113】
[124] 当業者には本発明が、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルド機器、マルチプロセッサシステム、マイクロプロセッサベース又はプログラム可能家電、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、タブレット、ポケベル、ルータ、スイッチ等を含む多くの種類のコンピュータシステム構成を有するネットワークコンピューティング環境で実行され得ることが理解されよう。本発明はまた、ネットワークを介して(有線データリンク、無線データリンク、又は有線及び無線データリンクの組み合わせのいずれかにより)接続されたローカル及びリモートコンピュータシステムの両方がタスクを実行する分散システム環境で実施されてもよい。このように、分散システム環境において、コンピュータシステムは、複数のコンピュータシステムを要素として含んでいてよい。分散システム環境において、プログラムモジュールはローカル及びリモートメモリ記憶装置の両方に配置されていてよい。
【0114】
[125] 当業者には、本発明がクラウドコンピューティング環境で実施され得ることも理解されよう。クラウドコンピューティング環境は分散されていてよいが、これは必須ではない。分散されている場合、クラウドコンピューティング環境は、一組織内で国際的に分散されていても、及び/又は複数の組織にわたり保有されたコンポーネントを有していてもよい。本明細書及び以下の請求項において、「クラウドコンピューティング」は、設定可能なコンピューティングリソース(例えばネットワーク、サーバ、記憶装置、アプリケーション、及びサービス)の共有プールへのオンデマンドネットワークアクセスを可能にするモデルとして定義されている。「クラウドコンピューティング」の定義は、適切に展開された場合にこのようなモデルから得られる他の多くの利点のいずれにも限定されない。
【0115】
[126] クラウドコンピューティングモデルは、オンデマンドセルフサービス、広範なネットワークアクセス、リソースプーリング、素早い拡張性、測定可能サービス等、各種の特性を含んでいてよい。クラウドコンピューティングモデルは、例えば、サービスとしてのソフトウェア(「SaaS」)、サービスとしてのプラットフォーム(「PaaS」)、サービスとしてのインフラ(「IaaS」)等、各種のサービスモデルの形式で提供されてよい。クラウドコンピューティングモデルはまた、プライベートクラウド、コミュニティクラウド、パブリッククラウド、ハイブリッドクラウド等、異なる展開モデルを用いて展開されてよい。
【0116】
[127] クラウドコンピューティング環境等、いくつかの実施形態は、各々が1個以上の仮想機械を動作させることができる1個以上のホストを含むシステムを含んでいてよい。動作中、仮想機械は、OS及び恐らく1個以上の他のアプリケーションもサポートすべく動作可能なコンピューティングシステムをエミュレートする。いくつかの実施形態において、各ホストは、仮想機械のビューから抽出された物理リソースを用いて仮想機械用の仮想リソースをエミュレートするハイパーバイザを含んでいる。ハイパーバイザはまた、仮想機械同士を適当に分離する。従って、任意の所与の仮想機械の観点から、ハイパーバイザは、仮想機械が物理リソースの外観(例えば仮想リソース)と対話するだけにもかかわらず、仮想機械が物理リソースと対話するような錯覚を与える。物理リソースの例としては、処理能力、メモリ、ディスクスペース、ネットワーク帯域幅、媒体ドライブ等がある。
【0117】
[128] 本発明は、その概念又は本質的特性から逸脱することなく他の特定の形式で実装することができる。上述の複数の実施形態はあらゆる点で例示的に過ぎず、限定的なものではないものと考えられたい。本発明の範囲は従って、上述の説明ではなく添付の請求項により示す。請求項の意味及び同等な範囲に含まれる全ての変更はそれらの範囲に包含されるものとする。添付の請求項の要素を紹介する場合、冠詞「1つの(a)」、「1つの(an)」、「その(the)」、及び「前記(said)」は、当該要素が1個以上あることを意味するものとする。用語「包含する」、「含む」、及び「有する」は、包括的であることを意図しており、列挙された要素以外の追加的要素が存在し得ることを意味する。用語「集合」及び「部分集合」は空集合を除外することを意図されており、従って「集合」は空でない集合として定義され、「部分集合」は空でない部分集合として定義される。
【国際調査報告】