百科问答小站 logo
百科问答小站 font logo



苹果的 Rosetta 2 的实现原理大概是怎样的? 第1页

  

user avatar   song-ziming 网友的相关建议: 
      

没有内幕消息,也没用过苹果设备,以下都是从网上搜索来的,结合了一些自己的分析。

Rosetta 2 可以将 x86 指令翻译成 ARM 指令,支持 JIT(Just-In-Time)和 AOT(Ahead-Of-Time)两种模式。JIT 在程序运行的时候动态翻译指令,类似于 JVM。AOT 在软件安装的时候直接翻译成 ARM 指令,Android 也有类似的技术。

x86 指令集虽然复杂,但 Rosetta 2 只需要支持其中的子集,也就是用户态指令。特权指令、虚拟化扩展则不支持,我猜测 SSE、AVX 这类指令也不支持。M1 是一个 64 位的处理器,翻译的也是 64 位的 x86_64 指令,相似度很高。

Rosetta 2 的目的是运行 MacOS 软件,操作系统已经有了 ARM 版,还需要转换系统调用。毕竟转换前后都是跑在 MacOS 上的,系统调用都一样,只要把传参方式从 x86 换成 ARM 就行。

其实,x86 切换 ARM 有一个重大优势,那就是两套指令集都是小端法(little-endian),翻译指令的时候不需要做字节序反转(byteswap)。苹果上一次从 PowerPC 切换到 x86 就没有这种运气,因为 PowerPC 是大端法(big-endian),转换起来要麻烦许多。

不过,这回遇到了一个新问题,x86 与 ARM 的内存一致性模型(memory consistency model)不一样,会导致多线程软件运行结果出现差异,这也是 ARM 模拟 x86 的最大困难。苹果用了最暴力的办法,直接在芯片里做了 Intel 版本的内存模型,运行 Rosetta 2 的时候,通过一个后门开关切换到 Intel 内存模型,运行原生 ARM 程序的时候使用正常的 ARM 内存模型(见附图的第4条)。估计这一点才是 Rosetta 2 性能好的最大贡献。




  

相关话题

  为什么有人可以看技术书很快? 
  比尔·盖茨的编程水平怎么样?算得上是大师级别吗? 
  这个代码int函数无返回值且开-O2,for循环会无限循环,是什么原因? 
  汇编语言转换成机器语言,具体在机器这个层面是如何实现的? 
  汉语编程是不是动了谁的奶酪,为什么招黑? 
  将编程语言中的英文替换成中文并将其完善为一门国人普遍接受的编程语言,需要哪些条件? 
  在函数的入口处对参数的合法性进行检查是一个值得提倡的好习惯吗? 
  高级语言如何转汇编语言的问题? 
  RISC-V RV32I中零寄存器有什么用? 
  Prolog 这类逻辑式编程语言为什么没有得到广泛应用? 

前一个讨论
如何评价 2020 年 11 月 30 日联想拯救者 X 系列新品发布会?有哪些亮点和槽点?
下一个讨论
华为台式机正式上线,搭载 AMD 芯片,支持指纹识别和 NFC 互传,如何看待华为进入台式机市场?





© 2025-01-03 - tinynew.org. All Rights Reserved.
© 2025-01-03 - tinynew.org. 保留所有权利