苹果的罗塞塔石碑 —— Rosetta 2
ARM架构与x86架构
指令集架构(ISA)是计算机硬件与软件之间的接口规范,定义了处理器可以执行的基本指令(如算术运算、数据传输、控制转移等)、指令格式、寻址模式以及相关的寄存器和数据类型。简单来说,它就像是处理器的“语言”(CPU预定义的操作和计算),让程序员能够编写可以在特定架构上运行的软件,同时也帮助设计处理器的工程师理解如何实现这些指令(简化程序员的工作)。
那如果要简化程序员的工作,这意味着微处理器的工作十分复杂。甲方只需要提要求就好了,而乙方需要考虑的就多了。那到底是应该简化程序员的工作,还是简化微处理器的工作?
由此产生了两种想法:CISC 和 RISC
x86:基于CISC的处理器架构,拥有非常丰富的指令集。一条指令可以完成整个计算(如乘法)或将一块数据直接从内存中的一个位置移动到另一个位置,并且这一系列复杂的操作可以在一个周期内完成。但这也意味着它需要更多的晶体管,从而会占用控件并消耗能量。
ARM:基于RISC的处理器架构,每条指令仅代表一个能耗较低的简单操作。这使得汇编语言程序员的工作变得更加复杂,但却简化了处理器的工作。利用RISC处理器和先进的RISC计算机,可以通过运行多条指令或通过将复杂工作推给编译器(而不是CPU内核)来执行复杂工作。
两种CPU设计都具有高性能,但ARM设计往往侧重于更小巧的外形、电池使用时间、尺寸、免除散热要求和成本。
具体可见 指令系统 | Pocon’s Blog
Mac向Apple芯片迁移
在2020年6月22日的苹果全球开发者大会上,苹果公司CEO蒂姆·库克宣布将Mac电脑从英特尔的x86-64的处理器平台迁移至ARM64架构的Apple芯片(由苹果自行设计的处理器)。(在此之前也有过迁移经历)
既然是两种不同的指令集架构,苹果是如何实现让Intel平台上开发的软件在ARM架构平台的Mac上顺利运行的呢?
Rosetta 2
在此之前,先让我讲讲另一种实现机制:通用二进制
通用二进制是一种将多个架构的代码打包在同一个可执行文件中的技术。(由于这些多平台可执行程序文件容量比原来要大,所以也称为胖二进制。)该文件包含针对不同架构的机器代码,操作系统在运行时根据硬件架构选择合适的代码段执行。
换而言之,也就是提供多个翻译版本,选你看得懂的那个。
[!WARNING]
以下为个人见解
制作和优化其应用的ARM版本需要时间。创建通用二进制文件需要对源代码进行修改和测试,因此开发的复杂性会大幅提升。为了提供更灵活使用的解决方案,在当时Rosetta成为主流,而通用二进制版本需要更长的时间来推广和普及。
换而言之,两个国家的人(Intel和Silicon)说的是不同的语言,彼此听不懂对方的话,还好的是都是用嘴说,声音通过空气传播,别人也都是用耳朵听的。那么,中间有个翻译(Rosetta),可以把一种语言翻译成另外一种。
Rosetta:一种动态翻译工具。允许已经存在的Intel x86应用在Apple Silicon(ARM架构)上运行,而无需开发者重新编译或发布新的版本。这使得用户能够立即继续使用他们的旧软件,无缝过渡到新硬件上。
苹果公司声称:那些重视用户互动而较少计算量的应用程序(比如word等文字处理器)是比较适合同归哦Rosetta编译的;而需要大计算量的程序,比如Photoshop需要另外的通用二进制版本。
Rosetta 2:Rosetta 2预装在使用Apple Silicon芯片的Mac电脑的操作系统上。它可以将AMD64指令进行翻译。与Rosetta不同的是,Rosetta 2在安装软件时会把Intel版本程序转化为ARM程序,加上Apple的处理器性能很高,因此即使需要大计算量的程序,通过 Rosetta 2编译也能流畅地执行。(Intel版本Mac操作系统上地应用程序)
让我们(浅显的)深入探讨一下底层原因:
- 尽管指令集不同,ARM和Intel底层架构有较高相似度(具体我不知道为啥)。x86指令集虽然复杂,但Rosetta 2只需要支持其中的子集,也就是用户态指令。并且两套指令都是小端存储。
- 最大障碍是内存排序(内存一致性模型不一样),即两个CPU在内存中看到彼此修改的顺序不一样。所以苹果将Intel的内存排序添加到他们的CPU中
(这也太暴力了)。在运行转换后的x86代码时,它们会通过一个后门开关切换CPU的模式以符合Intel的内存排序。
参考链接:
https://www.redhat.com/zh/topics/linux/ARM-vs-x86
哪位老哥能解释一下 Rosetta 的实现原理? - V2EX
【转】苹果的 Rosetta 2 的实现原理大概是怎样的? - 哔哩哔哩