写点什么

Rosetta 2:从 x86 到 ARM64

2021 年 1 月 15 日

Rosetta 2:从x86到ARM64

随着计划将 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 模式之下。


原文链接


How x86 to arm64 Translation Works in Rosetta 2

2021 年 1 月 15 日 16:581203

评论

发布
暂无评论
发现更多内容

区块链脱虚向实 市场教育基本完成

CECBC区块链专委会

区块链

滴普技术荟-云原生基座OpenKube开放容器实践(一):如何理解Linux network namespace ?

滴普科技2048实验室

Linux

城市智慧社区智能化建设,平安小区管理系统

135深圳3055源中瑞8032

亿级流量峰值没在怕,“缓存”技术来减压!

博文视点Broadview

入职阿里!全靠刷明白了这份Java面试合集(分布式+Dubbo+线程+Redis+数据库+JVM+并发)

Java架构之路

Java 程序员 架构 面试 编程语言

PlayStation@4功能介绍及测试应用

行者AI

测试

花了19998买的学习教程!2021年Android技术下半场在哪?震撼来袭免费下载!

欢喜学安卓

android 程序员 面试 移动开发

滴普技术荟-云原生基座OpenKube开放容器实践(二):理解linux虚拟网络设备veth

滴普科技2048实验室

Linux

小品阅读所带来乐趣

叶小鍵

2020 — iOS 面试败北感悟

iOSer

ios iOS Document 大厂面试 iOS面试 底层知识

这些常用ETL任务调度框架组件,你都知道几个?

会飞的鱼

大数据处理 kettle 海豚调度 调度引擎 调度式分布

请用思维导图画出架构师训练营所有技术知识点

Jacky.Chen

从根上理解高性能、高并发(三):深入操作系统,彻底理解I/O多路复用

JackJiang

网络编程 高并发 高性能 即时通讯

全网最全原理讲解!如何试出一个Android开发者真正的水平?已开源

欢喜学安卓

android 程序员 面试 移动开发

区块链食品溯源系统搭建---赋能智慧农业

135深圳3055源中瑞8032

架构师训练营11W作业

Geek_f06ede

深圳区块链交易所开发、数字货币交易平台开发

W13902449729

深圳区块链交易所开发 数字货币交易平台开发

Appium的安装及简单的使用介绍

行者AI

人工智能

AI面临产业大考:落地虽难,但产业化路径已日渐清晰

脑极体

2021年区块链十大发展趋势:那些偶然中的必然

CECBC区块链专委会

货币

区块链数据存储与IPFS技术的融合应用

CECBC区块链专委会

区块链 数据存储

2020年度国产数据库:openGauss

墨天轮

数据库

架构训练营 - 第12周课后作业 - 学习总结

Pudding

Vue 3 组件开发:搭建基于SpreadJS的表格编辑系统(环境搭建)

Geek_Willie

Vue SpreadJS vite

计算机专业必看!难道Android真的凉了?大厂内部资料

欢喜学安卓

android 程序员 面试 移动开发

同事临走时,给了我这份多线程and高并发(面试题+思维导图),借此我含泪拿下了阿里offer

Java架构之路

Java 程序员 架构 面试 编程语言

anyRTC 2020年12月SDK更新

anyRTC开发者

uni-app android 音视频 WebRTC sdk

Java并发编程:AQS的公平性

码农架构

Java Java 分布式 java 并发

三年JAVA开发经验,字节四面成功拿下2-2Offer,入职就是30K16薪

Java架构之路

Java 程序员 架构 面试 编程语言

细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力

程序员小毕

数据库 nosql redis 分布式 性能

万字长文聊缓存(下)- 应用级缓存

Silently9527

缓存 缓存击穿 Caffeine 缓存架构

Rosetta 2:从x86到ARM64-InfoQ