随着计划将 Macintosh 产品线从英特尔 CPU 转向自家 CPU,苹果公司还发布了一款名为 Rosetta 2 的二进制转换软件,旨在让这个 CPU 转换过程更加顺畅。有了 Rosetta 2,大多数 x86 应用程序都可以在经过初始转换之后在新平台上执行。
2006 年,苹果公司开始使用二进制转换技术,当时他们从 PowerPC CPU 切换到 x86。Rosetta 基于最初由 Transitive Corporation 开发、后来被 IBM 收购的QuickTransit技术,对用户来说基本上是透明的。用户唯一能感觉到的是他们的应用程序有时会启动或运行得更慢一些。
应用程序在第一次启动时通常会很慢。事实上,这正是 Rosetta 的作用所在,特别是当操作系统检测到二进制文件只包含 x86_64 指令时。根据 Joe Rossignol 在 Mac Rumors 上发表的文章,微软表示他们开发的 Mac 应用程序通常在第一次启动时大约需要20秒,而随后的启动速度很快。为了降低这个初始转换步骤的影响,Rosetta 2 可以在安装应用程序时对其进行转换。不过,目前还不清楚 Rosetta AOT 翻译将支持哪些应用程序。
虽然 macOS 更倾向于运行 arm64 指令(在可用时),但用户可以重写这种行为。例如,运行一个已经移植到苹果芯片的应用程序就必须这样,除了一些遗留的插件或用户依赖的其他类型的二进制扩展。事实上,Rosetta 的一个限制是它不能在同一个进程中混合使用 X86_64 和 arm64 指令。
基于过去使用 Rosetta 的经验,对于终端用户和开发人员来说,Rosetta 2 有助于他们顺利过渡到苹果芯片。不过,这并不排除在很多情况下用户需要等待,直到他们期待的软件原生支持 arm64。Rosetta 2 不支持转换内核扩展,也不支持 x86_64 平台虚拟化。后者意味着 Rosetta 2 不会转换 VMWare、VirtualBox 等虚拟机,也不会转换 Docker。
Rosetta 的一个主要问题是性能。在 PowerPC 转换到 x86 过程中,导致 Rosetta 变慢的一个因素是这两个平台使用了不同的内存顺序,PowerPC 采用了大端(big-endian)模式,而 x86 采用的是小端(little-endian)模式。这个问题也会影响基于 ARM 的微软 Surface 笔记本上的 x86 模拟。为了防止这种情况发生,苹果在M1 CPU上增加了对x86内存顺序的支持,正如 Robert Graham 在 Twitter 上指出的那样:
苹果取巧了,他们将英特尔的内存顺序添加到他们的 CPU 中。在运行转换后的 x86 代码时,它们会切换 CPU 的模式,遵循英特尔的内存顺序。
除此之外,Graham 还介绍了苹果公司为提高芯片性能而采用的其他一些“技巧”,包括加快 JavaScript 执行速度、更快地保留和释放内存,等等。
Rosetta 2 的一个特别之处在 Hacker News 网站上引起了一些开发者的注意,那就是它还可以转换包含即时编译器的应用程序。有关这个问题的具体机制还没有公开的文档,不过,苹果公司可能会使用页面错误来检测代码是否试图跳转到最近创建的代码页——也就是说,一个页面被设置为可写模式,然后切换到只读和可执行模式。在页面错误得到处理之后,Rosetta 开始转换页面内容。
最后需要说明的是,应用程序可以检测到它们是否运行在 Rosetta 模式之下。
原文链接:
评论