微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 145|回复: 0

浅谈 Windows on Arm 对 x86_64 的兼容

[复制链接]

2

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-2-10 16:30:00 | 显示全部楼层 |阅读模式
在 WoA 中,我们能看到如下几个文件夹:


其中比较重要的是 SysArm32 System32 SysWOW64。这三个文件夹基本对应了 ARM32 ARM64 x86。你会发现这里并没有 x64,那么 Windows 是通过什么方式保证 x64 兼容性的呢?是靠 ARM64X。但在开始之前,我们先回顾 Arm 兼容 x86 的方法。
Arm 与 x86

在 Arm 上,我们能找到 SysWOW64 文件夹,里面的文件全部是标准的 x86 架构的二进制文件,而 x86 应用在调用的时候就会直接调用该文件夹下的文件,就像在 x64 系统上一样。但是由于 Arm64 无法“理解”(执行)x86 的指令,所以要通过翻译,将其翻译为 Arm 架构的指令才能运行。所以在 Arm 上,系统通过 xtajit.dll 将 x86 指令即时翻译为 Arm64 指令。但是这样一来连系统提供的二进制文件也要翻译,效率太低,所以微软后面引入了 SyCHpe32。SyCHpe32 包含了 x86 与 Arm64 ,能够提升运行效率,可近似理解为后文所说的 Arm64EC 的工作模式。
Arm 与 x64

在 Arm 上,x64 一样需要通过转译才能运行,而 xtajit64.dll 是完成即时翻译的组件。但是不同于 x86,在 Arm64 上,为了节约空间并提高运行效率,微软通过 Arm64X 提供支持,而不是搞一套新的 SysWOW 机制。
什么是 Arm64X?(以下内容改写自官方文档)

Arm64X 是一种新型的二进制文件,可以同时包含经典 Arm64 代码和 Arm64EC 代码。这使得 Arm64X 可同时与经典 Arm64 和 Arm64EC 进程兼容。
从根本上说,Arm64X 二进制文件将单独的 x64/Arm64EC 和 Arm64 二进制文件中的所有内容,合并到磁盘上的一个更高效的文件中。内置的 Arm64X 二进制文件有两组代码、入口点等,同时消除冗余部件以节省磁盘上的空间。
当应用程序加载 Arm64X 二进制文件时,操作系统会依据要加载到的进程体系结构来公开正确的部分。 你可以这样想象:Arm64X 二进制就像旧的 3D 图像,其中包含一个红色和蓝色图像,可以通过一对三维眼镜上的红色或蓝色镜头查看。 x64 应用将看到的 DLL,就像是 x64 DLL ,而 Arm64 应用将看到与 Arm64 DLL 相同的 DLL。


这里又有了一个新的概念,Arm64EC?这是什么?
x64/Arm64EC?(可以参考官方文档)

Arm64EC (“仿真兼容”)简单地说就是在 Arm64 上模仿了 x64 的 ABI 规范,使它对于 x64 二进制文件而言,看起来和 x64 一样,通过这种方法可以在一定程度上提高性能(Arm64EC 的指令集是 Arm64 的,可以原生运行与 Arm64 架构上,不需要翻译),而且因为 ABI 规范一样,x64 可以与它互相调用。但是 Arm64EC 并不是毫无缺点的,由于 ABI 是 x64 的,所以按 Arm64 ABI 规范运行的二进制文件反而无法调用它,这也是为什么会有前文的 Arm64X。
小结一下,Arm64EC 就是将 ABI 替换为 x64 的,使 x64 二进制文件在调用时看上去就和调用普通的 x64 文件一样。而 Arm64X 则是融合了 Arm64 与 x64/Arm64EC,能同时兼容 Arm64 与 x64/Arm64EC。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-22 00:50 , Processed in 0.152397 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表