所有 ARM 处理器上的 ARM 指令都一样吗?还是只有其中的一个子集是强制性和通用的?
例如,当 Apple 设计 Mac 芯片时,他们是否可以修改指令集来添加或删除指令?例如,如果代码在 ARM Cortex-A76 上运行,那么它也可以在 Mac 芯片上运行吗?
答案1
不,并非所有 ARM 处理器都一样。当 AArch64 出现时,开发了新的基本指令集,称为 A64。它指定版本“ARMv8”(现在是 ARMv9),并且完全不同。该 ISA 用于性能最高的现代处理器,包括 Apple 的 M1。
其他版本的指令集有所演变,但总体上是相同的。例如,第一个版本没有硬件乘法指令。
不要迷失在这些版本中,因为在 ARM 中开发的处理器有时会使用令人困惑的符号;ARM7TDMI 使用 ARMv4 ISA。
值得注意的进化步骤是一些标准扩展,例如 Jazelle 集用于运行 Java 字节码,以及 Neon 集 SIMD 操作。协处理器可以添加自己的附加指令。
除此之外,额外的编码从 ARMv4 版本开始,出现了命令集,称为 Thumb 和 Thumb-2。它们删除了一些功能和指令,但实现了更紧密的代码封装,将每条指令的大小从 32 位减少到 16 位(尽管有些事情可能需要多条 Thumb 指令)。删除的功能之一是除分支之外的所有命令的 4 位预测字段。一些小核心(Cortex-M)现在仅有的支持这种Thumb编码,例如著名的Blue Pill(基于Cortex-M3内核的STM32F103C8T6 MCU,实现了基于ARMv7的ISA)。
话虽如此,您可以确信所有处理器上都存在相同的基本命令,例如 Cortex-M 系列中的 ADD 与 Cortex-R 和 Cortex-A 中的 ADD 相同(并且在同一版本的指令集中具有相同的二进制编码,目前为 ARMv7,但须遵守所选的编码方案)。
因此,您可以针对特定 ISA 版本编译一次软件包,然后在该架构的所有处理器上使用它;这种用法的示例如下OpenWRT 软件包是分布式的。关于你的问题:虽然 M1 应该能够处理 Cortex-A76 指令,但这并不意味着该软件将运行,因为它可能需要与 MacOS 不同的环境,包括内存配置、系统调用约定等。但是如果你有一个在 A76 上运行的本机 Linux 二进制文件,并且在 M1 上本地运行 Linux,相同的二进制文件将在其上运行。