Arm64X PE 文件

Arm64X 是一种新型的二进制文件,可以同时包含经典 Arm64 代码和 Arm64EC 代码 。 这使得 Arm64x 与 Arm 设备上的 Windows 上的经典 Arm64 和 Arm64EC 进程兼容,非常适合两个 API 可能使用的中间件或插件。

在 Windows 11 SDK 中引入,Arm64X 二进制文件是一种可移植可执行文件(PE)文件,适用于 Arm 上的 Windows 11 和 Arm 上的 Windows 10。 若要生成 Arm64X 二进制文件,请参阅 生成 Arm64X 二进制文件

Arm64X 二进制文件的工作原理是什么?

从根本上讲,Arm64X 二进制文件包含将位于单独的 x64/Arm64EC 和 Arm64 二进制文件中的所有内容,但合并到磁盘上的一个更高效的文件中。 生成的 Arm64X 二进制文件有两组代码、入口点等,同时消除冗余部分以节省磁盘空间。

当应用程序加载 Arm64X 二进制文件时,操作系统会应用转换来公开正确的部分,具体取决于加载到的进程体系结构。 可以将 Arm64X 二进制图像视为旧的 3D 图像,其中红色和蓝色图像都可以通过一对 3D 眼镜上的红色或蓝色镜头进行查看。 x64 应用将看到 DLL,就像它是 x64 DLL 一样,而 Arm64 应用将看到与 Arm64 DLL 相同的 DLL。

Arm64X 转换图形,显示带有红色和蓝色镜头的 3D 眼镜

透明操作系统转换允许 x64 和 Arm64 应用程序加载相同的 Arm64X 二进制文件,而无需知道它还包含对应于其他体系结构的代码。 因此,Arm64X 二进制文件被绰号为“变色龙”,因为它们采用周围的环境“颜色”。

默认情况下,Arm64X 二进制文件显示为 Arm64 二进制文件。 这允许在 Arm 上运行 Windows 10 的系统(不知道 Arm64X 格式或如何应用转换)成功将 Arm64X 二进制文件加载到 Arm64 进程中。

操作系统如何使用 Arm64X 二进制文件?

Arm 上的 Windows 11 引入了在 Arm64 上运行 x64 应用程序的功能。 但是,与包含文件夹的 x86 仿真SysWoW64不同,没有单独的 x64 操作系统二进制文件文件夹。 在 Arm 上使用 Windows 11 时,x64 应用程序和 Arm64 应用程序都可以使用二进制文件 System32加载二进制文件并调用 API。 这种灵活性是可能的,因为该应用中可能需要加载的任何二进制文件 System32 都已重新编译为 Arm64X 二进制文件。

x64 和 Arm64 应用程序都可以加载二进制文件并与二进制文件 System32进行交互,而无需单独复制所有系统二进制文件,例如 SysWoW64 x86。

System32 文件夹中的 x64 和 Arm64 兼容二进制文件

用于中间件或插件的 Arm64X

Arm64X 二进制文件的核心功能是在磁盘上启用一个文件,以支持 x64/Arm64EC 和 Arm64 进程。 大多数应用开发人员将专注于将其应用程序构建为 Arm64EC 或 Arm64,而不是两者,在这种情况下,可能不需要 Arm64X。

但是,中间件插件的开发人员应考虑 Arm64X,因为此类代码有可能加载到 x64 或 Arm64 进程中。

可以在不使用 Arm64X 的情况下同时支持 x64 和 Arm64 进程,但你可能会发现,允许操作系统处理将二进制文件的正确体系结构加载到给定的 64 位进程中更容易。

支持应用单独二进制文件、Arm64x 二进制文件、Arm64X 纯转发器(将 x64/Arm64EC 与 Arm64 二进制文件相结合)的三种方法

在 Arm 上的 Windows 11 上支持这两种体系结构的三种概念方法包括:

  • 单独的二进制文件:由于标准做法目前在支持多个体系结构时使用单独的二进制文件,你可能会发现生成和传送单独的 x64 和 Arm64 二进制文件更适用于解决方案。 可以使用现有机制来确保将正确的二进制文件加载到关联的体系结构进程中。

  • Arm64X 二进制文件:可以在一个二进制文件中生成一个 Arm64X 二进制文件,其中包含所有 x64/Arm64EC 和 Arm64 代码。

  • Arm64X 纯转发器:如果需要 Arm64X 的灵活性,但希望避免将所有应用代码放入 Arm64X 二进制文件中,可以选择使用纯转发器方法,其中没有代码的小 Arm64X 二进制文件用于将加载程序重定向到 DLL 的正确体系结构。

需要 Arm64X 的示例情况

在某些情况下,需要使用 Arm64X 二进制文件来支持 x64 和 Arm64 应用。 其中包括:

  • x64 或 Arm64 应用可能调用的 64 位 COM 服务器
  • 可能加载到 x64 或 Arm64 应用的插件
  • 注入 x64 或 Arm64 进程的单个二进制文件

在上述每种情况下,可以使用 Arm64X 二进制或 Arm64X 纯转发器来启用一个二进制文件来支持这两种体系结构。

有关生成 Arm64X 二进制文件的详细信息,请参阅 生成 Arm64X 二进制文件