Поделиться через


Файлы PE Arm64X

Arm64X — это новый тип двоичного файла, который может содержать классический код Arm64 и код Arm64EC вместе. Эта двойная совместимость делает Arm64X подходящим для классических процессов Arm64 и Arm64EC на устройстве Windows на Arm. Это особенно хорошо подходит для промежуточного программного обеспечения или подключаемых модулей, которые используют оба ABI.

В пакете SDK для Windows 11 двоичный файл Arm64X — это тип переносимого исполняемого файла (PE), который работает с Windows 11 в Arm и Windows 10 на Arm. Сведения о сборке двоичных файлов Arm64X см. в разделе "Сборка двоичных файлов Arm64X".

Как работают двоичные файлы Arm64X?

По сути, двоичный файл Arm64X содержит все содержимое, которое будет находиться в отдельных двоичных файлах x64/Arm64EC и Arm64, но объединяет их в один более эффективный файл на диске. В созданном двоичном файле Arm64X есть два набора кода, точек входа и других элементов, что позволяет исключить избыточные части для экономии места на диске.

Когда приложение загружает двоичный файл Arm64X, операционная система применяет преобразования для предоставления правильных разделов в зависимости от архитектуры процесса. Вы можете думать о двоичном файле Arm64X, как старые трехмерные изображения, с красным и синим изображением, которое можно просмотреть через красные или голубые линзы на пару трехмерных очков. Приложение x64 видит библиотеку DLL, как будто это библиотека DLL x64, а приложение Arm64 видит ту же библиотеку DLL, что и библиотека DLL Arm64.

Изображение преобразования Arm64X с трехмерными очками с красными и голубыми линзами

Преобразования прозрачной операционной системы позволяют приложениям x64 и Arm64 загружать один двоичный файл Arm64X, не зная, что он также содержит код для другой архитектуры. По этой причине люди называют бинарные файлы Arm64X "хамелеоны", так как они адаптируются под „цвет“ своего окружения.

По умолчанию двоичные файлы Arm64X представляются двоичными файлами Arm64. Этот параметр по умолчанию позволяет системе, работающей на Windows 10 на платформе Arm, которая не распознает формат Arm64X и не знает, как применять преобразования, успешно загрузить двоичный файл Arm64X в процесс Arm64.

Как операционная система использует двоичные файлы Arm64X?

Windows 11 в Arm представила возможность запускать приложения x64 в Arm64. Однако в отличие от эмуляции x86, которая включает SysWoW64 папку, нет отдельной папки чистых двоичных файлов операционной системы x64. На платформе Windows 11 с Arm приложения как x64, так и Arm64 могут загружать двоичные файлы и вызывать API, используя двоичные файлы в System32. Эта гибкость возможна, так как разработчики перекомпилируют любые двоичные файлы в System32 в качестве двоичных файлов Arm64X, которые приложению может потребоваться загрузить.

Приложения x64 и Arm64 могут загружать и взаимодействовать с двоичными файлами System32без необходимости отдельной копии всех системных двоичных файлов, таких как SysWoW64 x86.

x64 и Arm64 совместимые двоичные файлы в папках System32

Arm64X для использования с ПО промежуточного слоя или подключаемыми модулями

Основной функцией двоичного файла Arm64X является включение одного файла на диске для поддержки процессов x64/Arm64EC и Arm64. Большинство разработчиков приложений сосредоточены на создании своих приложений как Arm64EC или Arm64, но не как оба одновременно, поэтому вам, скорее всего, не понадобится Arm64X.

Однако разработчики промежуточного ПО или плагинов должны учитывать Arm64X, так как такой код может загружаться в процессы x64 или Arm64.

Вы можете поддерживать процессы x64 и Arm64 без использования Arm64X, но вам может быть проще позволить операционной системе самостоятельно загружать правильную архитектуру двоичного файла в данный 64-разрядный процесс.

Три подхода к поддержке приложений: отдельные двоичные файлы для Arm64x, чистый пересылатель для Arm64X, объединение x64/Arm64EC с двоичными файлами Arm64

К ним относятся три концептуальных способа поддержки обеих архитектур в Windows 11 в Arm:

  • Отдельные двоичные файлы. Так как стандартные методики используют отдельные двоичные файлы при поддержке нескольких архитектур, вы можете найти, что сборка и доставка отдельных двоичных файлов x64 и Arm64 лучше подходит для вашего решения. Вы можете использовать существующие механизмы, чтобы гарантировать, что правильный двоичный файл загружается в соответствующий процесс архитектуры.

  • Двоичный файл Arm64X: вы можете создать двоичный файл Arm64X, содержащий весь код x64/Arm64EC и Arm64 в одном двоичном файле.

  • Arm64X pure forwarder: если вам нужна гибкость Arm64X, но вы хотите избежать добавления всего кода приложения в двоичный файл Arm64X, вы можете использовать чистый подход к пересылке. Небольшой двоичный файл Arm64X без кода перенаправляет загрузчик в правильную архитектуру DLL.

Примеры ситуаций, требующих Arm64X

В некоторых ситуациях требуется использовать двоичный файл Arm64X для поддержки приложений x64 и Arm64. К этим ситуациям относятся:

  • 64-разрядный COM-сервер, вызывающий приложения x64 и Arm64
  • Подключаемый модуль, который загружается в приложение x64 или Arm64
  • Один двоичный файл, который внедряется в процесс x64 или Arm64

В каждом из этих случаев можно использовать двоичный файл Arm64X или чистый сервер пересылки Arm64X, чтобы включить один двоичный файл для поддержки обеих архитектур.

Дополнительные сведения о сборке бинарных файлов Arm64X см. в разделе Сборка бинарных файлов Arm64X.