Arm64X PE ファイル

Arm64X は、従来の Arm64 コードと Arm64EC コードの両方を一緒に含めることができる新しい種類のバイナリです。 これにより、Arm64x は、Arm デバイス上の Windows 上の従来の Arm64 プロセスと Arm64EC プロセスの両方に対応し、両方の AVI で使用できるミドルウェアまたはプラグインに特に適しています。

Windows 11 SDK で導入された Arm64X バイナリは、Arm 上のWindows 11と Arm 上のWindows 10の両方で動作するポータブル実行可能ファイル (PE) の一種です。 Arm64X バイナリをビルドするには、「 Arm64X バイナリのビルド」を参照してください。

Arm64X バイナリのしくみ

基本的に、Arm64X バイナリには、個別の x64/Arm64EC バイナリと Arm64 バイナリに含まれるすべてのコンテンツが含まれますが、ディスク上の 1 つのより効率的なファイルにマージされます。 ビルドされた Arm64X バイナリには、ディスク上の領域を節約するための冗長な部分を排除しながら、2 つのコード セット、エントリ ポイントなどがあります。

Arm64X バイナリがアプリケーションによって読み込まれると、オペレーティング システムは変換を適用して、読み込まれるプロセスのアーキテクチャに応じて正しいセクションを公開します。 古い 3D 画像のような Arm64X バイナリを考えることができます。赤と青の両方の画像は、3D グラスのペアで赤または青のレンズを通して見ることができます。 x64 アプリでは DLL が x64 DLL であるかのように表示され、Arm64 アプリには Arm64 DLL と同じ DLL が表示されます。

赤と青のレンズを備えた 3D メガネを示す Arm64X 変換グラフィック

透過的なオペレーティング システム変換により、x64 アプリケーションと Arm64 アプリケーションの両方が、他のアーキテクチャに対応するコードも含まれていることを知らずに、同じ Arm64X バイナリを読み込むことができます。 そのため、Arm64X バイナリは周囲の "色" を受け取る際に "カメレオン" と呼ばれます。

既定では、Arm64X バイナリは Arm64 バイナリのように見えます。 これにより、Arm64X 形式や変換の適用方法がわからない Arm でWindows 10を実行しているシステムは、Arm64X バイナリを Arm64 プロセスに正常に読み込むことができます。

オペレーティング システムで Arm64X バイナリを使用する方法

Windows 11 on Arm では、Arm64 で x64 アプリケーションを実行する機能が導入されました。 ただし、フォルダーを含む SysWoW64x86 エミュレーションとは異なり、純粋な x64 オペレーティング システム バイナリの別のフォルダーはありません。 Arm でWindows 11すると、x64 アプリケーションと Arm64 アプリケーションの両方で、 のバイナリを使用してSystem32バイナリを読み込み、API を呼び出すことができるようになります。 この柔軟性は、アプリが System32 読み込む必要があるバイナリが Arm64X バイナリとして再コンパイルされているために可能です。

x64 アプリケーションと Arm64 アプリケーションの両方で、 の System32バイナリを読み込んで操作できます。x86 のような SysWoW64 すべてのシステム バイナリを個別にコピーする必要はありません。

System32 フォルダー内の x64 および Arm64 互換バイナリ

ミドルウェアまたはプラグインで使用する Arm64X

Arm64X バイナリのコア機能は、ディスク上の 1 つのファイルが x64/Arm64EC プロセスと Arm64 プロセスの両方をサポートできるようにすることです。 ほとんどのアプリ開発者は、両方ではなく Arm64EC または Arm64 としてアプリケーションを構築することに重点を置きます。この場合、Arm64X は必要ない可能性があります。

ただし、このようなコードは x64 または Arm64 プロセスに読み込まれる可能性があるため、Arm64X は ミドルウェア または プラグインの開発者が考慮する必要があります。

Arm64X を使用せずに x64 プロセスと Arm64 プロセスの両方をサポートできますが、オペレーティング システムで特定の 64 ビット プロセスへのバイナリの正しいアーキテクチャの読み込みを処理する方が簡単な場合があります。

アプリを個別のバイナリでサポートするための 3 つのアプローチ、Arm64x バイナリ、x64/Arm64EC と Arm64 バイナリを組み合わせた Arm64X 純粋フォワーダー

arm のWindows 11で両方のアーキテクチャをサポートする 3 つの概念的な方法は次のとおりです。

  • 個別のバイナリ: 現在の標準プラクティスでは、複数のアーキテクチャをサポートするときに個別のバイナリが使用されるため、個別の x64 バイナリと Arm64 バイナリをビルドして出荷する方がソリューションに適している場合があります。 既存のメカニズムを使用して、関連付けられているアーキテクチャ プロセスに正しいバイナリが確実に読み込まれるようにすることができます。

  • Arm64X バイナリ: すべての x64/Arm64EC コードと Arm64 コードを 1 つのバイナリで含む Arm64X バイナリをビルドできます。

  • Arm64X 純粋フォワーダー: Arm64X の柔軟性が必要だが、すべてのアプリ コードを Arm64X バイナリに入れないようにしたい場合は、コードのない小さな Arm64X バイナリを使用してローダーを DLL の正しいアーキテクチャにリダイレクトする純粋フォワーダー アプローチを使用できます。

Arm64X を必要とする状況の例

x64 アプリと Arm64 アプリの両方をサポートするために、Arm64X バイナリの使用が必要になる状況がいくつかあります。 これには次のものが含まれます。

  • x64 または Arm64 アプリの両方によって呼び出される可能性がある 64 ビット COM サーバー
  • x64 または Arm64 アプリに読み込まれるプラグイン
  • x64 または Arm64 プロセスに挿入される 1 つのバイナリ

いずれの場合も、Arm64X バイナリまたは Arm64X 純粋フォワーダーを使用して、1 つのバイナリで両方のアーキテクチャをサポートできます。

Arm64X バイナリのビルドの詳細については、「 Arm64X バイナリのビルド」を参照してください。