PE-файлы Arm64X

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

Представленный в пакете 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 появилась возможность запуска 64-разрядных приложений на 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. Если вам нужна гибкость Arm64X, но вы хотите избежать размещения всего кода приложения в двоичный файл Arm64X, вы можете использовать чистый подход сервера пересылки, где небольшой двоичный файл Arm64X без кода используется для перенаправления загрузчика в правильную архитектуру DLL.

Примеры ситуаций, в которых требуется Arm64X

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

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

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

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