InfoQ 研究中心诚意出品,一份报告带你走进中国 2000 万开发者 了解详情
写点什么

Rosetta 2:从 x86 到 ARM64

  • 2021-01-15
  • 本文字数:1210 字

    阅读完需:约 4 分钟

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-01-15 16:581813

评论

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

开发者时薪高达1200美元?一文带你走近Move语言的编程魅力!

TinTinLand

区块链 开发者 开发语言 Move

史上最全的Java并发系列之Java中的13个原子操作类

自然

多线程 并发 Java core 8月月更

真会玩!用手机吹气球你见过不?

岛上码农

flutter ios 前端 安卓开发 8月月更

估价器测试工具的实现

转转技术团队

测试工具

每日一R「04」常用的智能指针

Samson

8月月更 ​Rust

浅谈营销型企业站文案应该如何写

石头IT视角

编译调试插件功能总结

乌龟哥哥

8月月更

云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析

阿里巴巴云原生

阿里云 RocketMQ 云原生

史上最全的Java并发系列之Java中的并发工具类

自然

多线程 并发 8月月更

slb与nat及eip的相关联

肖飞码字

负载均衡 NAT 弹性公网IP

Android进阶(十一)Android系统架构讲解

No Silver Bullet

android 系统架构 8月月更

SRv6在5G移动网络中的部署方式

穿过生命散发芬芳

8月月更 SRv6

RocketMQ顺序消息

周杰伦本人

8月月更

第一个spark应用开发详解(java版)

程序员欣宸

Java spark 8月月更

vue高频面试题合集(四)附答案

helloworld1024fd

Vue

版本管理工具git的使用总结

TimeFriends

8月月更

STM32入门开发 NEC红外线协议解码(超低成本无线传输方案)

DS小龙哥

8月月更

L2必读 | 走进 AnyTrust 技术底层,数据可用性和最小信任假设如何实现

TinTinLand

区块链 以太坊 扩容 技术文章

开源一夏 | 拥抱新技术?你需要考虑的方面

微枫Micromaple

开源 经验总结 技术栈 技术分享 8月月更

转转用例平台系列 - 脑图组件2.0

转转技术团队

测试开发 测试用例平台开发

数据结构——栈

秋名山码民

8月月更

Spring Cloud Sleuth简述

阿泽🧸

8月月更 Spring Cloud Sleuth

vue高频面试题合集(三)附答案

helloworld1024fd

软件架构治理 之 如何度量软件架构

码猿外

架构设计 软件架构治理

基于AQS实现自己的同步工具

自然

多线程 并发 8月月更

复盘:如何更好的进行技术面试

老张

面试

Spring 全家桶之 Spring Data JPA(二)

小白

8月月更

shell脚本之格式化输出

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

极狐GitLab冷知识:使用 Gitlab Webhook 触发 Pipeline

郭旭东

极狐GitLab JIHULAB 101

开源一夏 | 你不能错过的 Go 强大图形化测试工具

宇宙之一粟

开源 测试框架 testing Go 语言 8月月更

架构实战营模块四作业

zhihai.tu

Rosetta 2:从x86到ARM64_架构_Sergio De Simone_InfoQ精选文章