我目前正试图理解ARM上的Windows是如何工作的。我很难理解ARM64EC ABI是如何在ARM芯片上工作的。微软说ARM64EC是基于AArch64的,做了一些修改,使其兼容x64,包括调用约定。堆栈使用和数据对齐[1]。在我看来,这将意味着它可以在x64芯片上执行,我找不到原因,这将使它运行在ARM芯片上,如果它遵循x64公约。
他们还说x64代码正在被模拟(我猜是使用x86到ARM模拟器的扩展版本),但ARM64EC是本地运行的。但是为什么我们必须区分它们是否都是可互操作的呢?操作系统是否在内部改变了一切以符合AArch64?
有什么我错过了吗?我偶然发现了伊萨,但我找不到任何关于什么ABI将与A64 ISA兼容。但我也有一些麻烦理解ISA和ABI的关系?
我很抱歉,如果这是一个愚蠢的问题,但我认为我只是错过或误解萨莫和微软是相当稀疏的细节。
[1][https://blogs.windows.com/windowsdeveloper/2021/06/28/announcing-arm64ec-building-native-and-interoperable-apps-for-windows-11-on-arm/](https://blogs.windows.com/windowsdeveloper/2021/06/28/announcing-arm64ec-building-native-and-interoperable-apps-for-windows-11-on-arm/)
2条答案
按热度按时间t2a7ltrp1#
在我看来,这将意味着它可以在X64芯片上执行[...]。
您将ABI与指令集混淆了。ARM64EC仍然使用A64指令集(x64 CPU无法执行),但它使用寄存器和堆栈的方式在概念上易于Map到x64寄存器。
我无法找到ARM64EC的实际规格,但我想有一件事可能是返回地址。
在正常的ARM64代码中,函数用
bl func_name
调用,将返回地址放入x30
中,然后被调用方使用ret
,将跳转到x30
中的地址,与x64相比,call
将返回地址压入堆栈,ret
从堆栈中弹出。同样,我不知道ARM64EC是否真的做到了这一点,但如果是我在设计它,那么我会做的一件事就是让函数调用看起来像这样:
如果您不这样做,那么翻译后的x64代码将期望在与本机代码不同的位置放置内容,反之亦然。
hxzsmxv22#
MSFT最近发布了有关ARM64EC及其工作原理的一些详细信息:https://learn.microsoft.com/en-us/windows/uwp/porting/arm64ec-abi
总而言之,ARM64EC二进制大部分是ARM64代码,但使用寄存器的方式允许在x64上1:1Map状态,所有导出或相应标记的函数将获得一个称为FFS的短x64 Package 器,这允许您使用x64挂钩挂钩此函数,尽管大多数代码是ARM64。并确保当您导入库时,无论是x64还是arm64ec,您的应用程序是x64还是arm64ec都能够无缝使用它。