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


PE-файлы Arm64X

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

В пакете 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 называются «chameleon», так как они принимают на себя «цвет» их окружения.

По умолчанию двоичные файлы 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 pure forwarder, объединенных 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".