文章目录

  • 苹果Arm芯片适配开发 (Apple Silicon)
  • Apple Silicon
    • 1. 将macOS应用程序移植到苹果芯片上
      • 1.1 创建一个移植计划
      • 1.2 获取链接库的通用版本
      • 1.3 将插件更新为通用二进制文件
      • 1.4 寻址架构差异
      • 1.5 更新GPU-Specific代码
      • 1.6 更新驱动,系统扩展,内核扩展
      • 1.7 远离特定的技术
      • 1.8 调试和测试代码
      • 1.9 调整你的应用程序的性能
    • 构建一个通用macOS二进制文件
    • 解决macOS代码中的体系结构差异
    • 将您的音频代码移植到苹果芯片
    • 将即时编译器移植到Apple Silicon
    • 将您的Metal代码移植到Apple Silicon
    • 为苹果芯片调优您的代码性能
    • 关于Rosetta翻译环境
    • 在macOS上运行iOS应用程序
    • 实现驱动程序、系统扩展和kext
    • 安装自定义内核扩展
    • 调试自定义内核扩展

苹果Arm芯片适配开发 (Apple Silicon)

Apple Silicon

构建原生运行在Apple silicon上的应用程序、库、框架、插件和其他可执行代码。当您在Apple框架和技术之上构建可执行文件时,您可能需要采取的唯一重要步骤是为arm64架构重新编译代码。如果您依赖于特定硬件的细节,或者假设底层特性,那么根据需要修改您的代码以支持Apple silicon。


要想在Apple silicon上获得最佳性能,有时需要调整使用硬件资源的方式。尽可能使用高级技术来减少对硬件的依赖。例如,使用Grand Central Dispatch而不是自己创建和管理线程。在Apple silicon上测试您的更改,以验证您的代码的行为是否最佳。

1. 将macOS应用程序移植到苹果芯片上

创建一个macOS应用程序的版本,可以在基于苹果硅和英特尔的Mac电脑上运行。

通过创建通用二进制文件并修改代码以处理架构差异,将现有macOS应用移植到Apple silicon。一个通用的二进制文件看起来和一个普通的应用程序没有什么不同,但是它的可执行文件包含编译代码的两个版本。一个版本在苹果芯片上运行,另一个版本在基于英特尔芯片的Mac电脑上运行。在运行时,系统会自动选择在当前平台上运行的版本。
要构建通用二进制文件,您需要Xcode 12或更高版本,该版本将arm64添加到macOS二进制文件的标准构建体系结构列表中。当你打开你的项目并做一个干净的构建时,如果你的项目使用标准架构,Xcode会自动创建一个通用的二进制文件。如果您使用定制的makefile或构建脚本,请将arm64体系结构添加到构建系统中。

创建通用二进制文件后,在两个体系结构上测试它,并确定是否需要进行其他更改。macOS框架保护应用程序不受平台之间架构差异的影响,但有些差异可能仍然需要您更改代码。此外,架构上的差异可能会影响应用程序的性能,需要进行进一步的更改。

Apple silicon上,为x86_64架构构建的应用程序在Rosetta翻译环境下运行。更多信息请参考:About the Rosetta Translation Environment.
要了解如何构建通用二进制文件,请参见构建通用macOS二进制文件。

1.1 创建一个移植计划

在移植过程的早期,确定您将用于构建和测试代码的工作流。Xcode可以在所有的Mac电脑上运行,因此可以在基于苹果硅芯片或英特尔芯片的Mac电脑上构建代码,并在那里进行初始测试。但是,始终在这两种计算机类型上测试、调优和验证您的代码,以发现特定于该体系结构的问题。

除了工作流程计划之外,还要确定在移植过程中需要研究的潜在领域。对于arm64的移植工作取决于您对特定硬件特性的依赖程度。如果您主要依赖Apple框架和技术,那么您的移植工作可能会很小。如果您专门针对x86_64体系结构和硬件功能调整了代码,那么移植到arm64可能需要额外的工作。

要开始调查,请记下任何执行以下操作的代码:

  • 与您不拥有的第三方库交互。

  • 与内核或硬件交互。

  • 依赖于特定的GPU行为。

  • 包含汇编指令。

  • 管理线程或优化你的应用程序的多线程行为。

  • 包含硬件特定的假设或性能优化。

上面的列表并不详尽,但它为您的调查提供了一个起点。硬件和架构上的差异可能会给您的代码带来bug或性能问题。尽早发现潜在的问题领域将为您以后节省时间。

始终拥有一个定义良好的测试计划,理想情况下拥有一组可以在构建时运行的自动化测试套件。除了测试代码的正确性,还可以收集应用程序的性能指标。检查你的应用程序的内存使用情况,并测量它在苹果硅和基于英特尔的Mac电脑上执行特定任务所需的时间。利用这些信息来确定需要调查的其他领域。

1.2 获取链接库的通用版本

如果您的项目依赖于任何第三方库,请联系原始供应商,要求他们为您提供这些库的通用版本。在同一进程中运行的所有代码必须支持相同的体系结构。如果没有所有链接库的通用版本,就无法生成二进制文件的通用版本。如果一个或多个库不是通用的,链接器会报告错误。

要了解如何创建自己的通用二进制文件,请参见构建通用macOS二进制文件。

1.3 将插件更新为通用二进制文件

一个通用插件可以在任何Mac电脑上运行。如果您的应用程序支持插件模型,请创建您管理的插件的通用版本。如果您的公司允许外部开发人员贡献插件,请鼓励这些开发人员创建他们的插件的通用版本。

如果应用程序直接将这些插件加载到进程空间,通用插件是必不可少的。在相同进程中运行的代码必须支持相同的体系结构。如果您的应用程序试图加载一个具有不兼容架构的插件,系统在加载时报告一个错误。

使用XPC服务运行进程外的插件可能使用与应用程序本身不同的架构运行。为了给开发人员更新插件的时间,提供两个非通用的XPC服务—一个运行arm64插件,另一个运行x86_64插件。单个XPC服务可以管理本机插件或转换插件,但不能同时管理两者。在创建服务时,为每个服务提供唯一的bundle标识符,以便它们可以同时运行。

有关如何使用XPC与进程外插件通信的信息,请参见XPC。

1.4 寻址架构差异

除了处理器和图形硬件的大规模变化,苹果硅芯片和基于英特尔的Mac电脑之间存在着微妙的架构差异。在移植过程中,审计您的代码以确定任何潜在架构问题的修复。例如,查找代码依赖于特定硬件特性或配置的位置。

下面的列表列出了苹果硅芯片和基于英特尔芯片的Mac电脑之间几个已知的架构差异。更新代码,依赖于任何以下:

  • 虚拟内存页面大小

  • 高速缓存线路尺寸

  • 可变的函数

  • 同时可写和可执行的内存

  • 即时编译器

  • 实时线程

  • 显式线程优先级

  • 特定于硬件的细节

  • 汇编语言指令或内建函数

  • 单位向量指令

  • c++ ABI的细节

Apple silicon和基于intel的Mac计算机都使用小端格式的数据,所以您不需要在代码中进行end转换。但是,继续尽量减少在创建的自定义数据格式中进行末端转换的需要。

有关架构差异的其他信息,请参见在macOS代码中处理架构差异。

1.5 更新GPU-Specific代码

苹果芯上的Metal支持基于英特尔的Mac电脑和iOS设备的功能。如果您的应用程序采用了只有在基于intel的Mac电脑上才能找到的Metal特性,那么请考虑在您的arm64代码中也采用ios特有的特性。采用这些特性可以提高许多应用程序的性能。

如果您的应用程序使用Metal, OpenGL,或OpenCL,请注意以下差异:

  • 苹果芯片上的GPUCPU共享内存。

  • OpenGL是不推荐的,但在苹果芯上是可用的。

  • OpenCL是不推荐的,但在针对GPU时,它是可用的。OpenCL CPU设备对arm64应用程序不可用。

有关如何更新图形代码的信息,请参见将Metal代码移植到Apple Silicon。

1.6 更新驱动,系统扩展,内核扩展

在将代码移植到macOS 11时,请注意与内核交互的代码的以下要求:

  • 使用DriverKit实现硬件驱动程序。macOS 11要求你使用一个驱动套件扩展,当支持是可用的。大多数驱动程序类型现在都支持DriverKit,只有少数仍然需要创建内核扩展。

  • 内核扩展必须支持本机体系结构。内核扩展在内核中运行,并且内核始终作为本机进程运行。不能使用Rosetta翻译运行内核扩展。

  • 内核扩展的安装和卸载需要重新启动。当您安装内核扩展时,系统直到重新启动后才加载扩展。

有关内核扩展和驱动程序更改的更多信息,请参见实现驱动程序、系统扩展和kext。

1.7 远离特定的技术

macOS包括一些目前不推荐或不鼓励积极开发的技术。如果您的应用程序使用下列技术之一,迁移到适当的替代尽快:

  • OpenGL-用Metal来代替。

  • OpenCL-用Metal来代替。

  • addressbook—使用联系人框架代替。

  • Carbon api——迁移到AppKit、Foundation和其他现代api。

  • IOKit内核扩展-迁移到驱动套件在适当的地方用DriverKit框架。

Apple silicon 仍然提供对上述技术的支持,你可以继续在macOS 11中使用它们。但是,这种支持可能会在macOS的未来版本中删除,所以建议迁移到较新的技术。

1.8 调试和测试代码

Apple silicon支持所有在基于intel的Mac电脑上发现的调试和测试工具。使用Xcode IDE来设置和监控断点,以及监控应用程序其他方面的行为。在命令行中使用lldb在Xcode接口之外执行类似的任务。

有关如何调试和测试代码的更多信息,请参见Xcode。

1.9 调整你的应用程序的性能

苹果硅可以运行基于英特尔的Mac电脑上的所有性能工具。使用工具和其他性能工具为你的应用收集不同类型的指标,包括内存使用,速度,能源使用等信息。您还可以使用命令行工具(如leaks、heap、top、fs_usage、sc_usage、vm_stat、otool、sample、malloc_historyvmmap)来识别潜在的性能问题。

arm64和x86_64之间的架构差异意味着,在一个系统上运行良好的技术可能在另一个系统上运行不好。例如:

  • 不要假设独立GPU意味着更好的性能。苹果处理器的集成GPU为高性能图形任务进行了优化。请参阅将您的Metal代码移植到苹果芯。

  • 不要假设所有的处理器核心都是相同的。Apple silicon上的处理器混合了性能核心(p -core)和效率核心(e -core),它们执行具有不同性能特征的任务。使用**服务质量(QoS)**类来帮助系统在正确的核心类型上调度任务。

在移植过程中,测量你的应用程序在苹果芯和基于英特尔的Mac电脑上的性能,并调查任何差异。在一个平台上运行时间较长的任务可能需要额外的调优。

有关调优通用二进制文件的具体技巧,请参见为Apple Silicon调优您的代码性能。

构建一个通用macOS二进制文件

解决macOS代码中的体系结构差异

将您的音频代码移植到苹果芯片

将即时编译器移植到Apple Silicon

将您的Metal代码移植到Apple Silicon

为苹果芯片调优您的代码性能

关于Rosetta翻译环境

在macOS上运行iOS应用程序

实现驱动程序、系统扩展和kext

安装自定义内核扩展

调试自定义内核扩展

苹果Arm芯片适配开发 (Apple Silicon)相关推荐

  1. 苹果M1芯片:如何开启一个时代

    来源 | 老石谈芯 头图 | CSDN下载自视觉中国 11月11日,苹果今年的发布会三部曲终于落下了帷幕.这场压轴大戏上,发布了苹果自研芯片Apple Silicon的第一代产品:M1芯片.首批搭载M ...

  2. 简单粗爆在MacOS下运行EAS 8.2客户端【Intel/Apple Silicon通用】

    之前发布了两个贴子,分别讲述了如何在Intel和M1芯片下安装金蝶EAS8.2客户端.因为是小众人群使用,官方呢,也没投入相关的资源,这个安装脚本也是官方的测试版本,经过我两年多的使用,基本上可以满足 ...

  3. 英特尔“狠捶”苹果M1芯片:地表最强这次被吊打了?

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 作者 | Andrew E. Freedman 译者 | 核子可乐 英特尔希望与苹果正面较量,证明自家处 ...

  4. 消息称苹果正开发基于自研ARM芯片的游戏主机

    7月12日消息,据外媒报道,苹果在此前召开的 WWDC 全球开发者大会上宣布 Mac 产品线将从英特尔芯片转至自研芯片 Apple Silicon .近日有消息称,苹果正在开发基于 ARM 的游戏主机 ...

  5. 苹果在 WWDC 上宣布放弃英特尔转向 ARM 芯片,会有哪些优势?你的 Mac 将何去何从?

    今天凌晨的 WWDC,Mac 无疑成为了本次发布会的重点.104 分钟的发布会,Mac 相关的内容就占据了 40 分钟.之所以这么重视,是因为 Apple 决定在 Mac 上放弃英特尔 Intel C ...

  6. 仅用2年过渡到自研ARM芯片,苹果的底气从何而来?

    作者 | Steven Sinofsky 译者 | 弯月,责编 | 屠敏 题图 |  东方 IC 出品 | CSDN(ID:CSDNnews) 今年 WWDC 2020 上,苹果宣布自研 ARM 芯片 ...

  7. 苹果开发者_苹果优秀开发者实锤 微软VS Code将支持Apple Silicon

    原标题:苹果优秀开发者实锤 微软VS Code将支持Apple Silicon [CNMO新闻]前不久,苹果正式推出搭载Apple M1芯片的Mac产品,至此Mac产品线也将采用ARM架构.产品发布会 ...

  8. 仅用 2 年过渡到自研 ARM 芯片,苹果的底气从何而来?

    作者 | Steven Sinofsky 译者 | 弯月,责编 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 今年 WWDC 2020 上,苹果宣布自研 ...

  9. 苹果或在 WWDC 宣布放弃英特尔转向自研 5nm ARM 芯片,这次时机成熟了?

    整理 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 近日,据彭博社报道,苹果公司将在 WWDC 2020 上宣布自研 Mac ARM 芯片,产品将从英特 ...

最新文章

  1. 这次终于不再为 iptables 犯迷糊了!
  2. Matlab Robotic Toolbox V9.10工具箱(五):动力学简介
  3. 数据库工具一段时间后打开报错:远程过程调用失败0x800706be
  4. 58 - 算法 - 百练 2503:Babelfish 二分查找与存储
  5. 生意人没有“攀比”的目标,会过的很迷茫
  6. 项目里面遇到的问题和解决方案的记录
  7. python 图像模糊处理实现
  8. 初踩阿里云效代码管理
  9. VTracer - 将图片转化为矢量 SVG 图形的免费开源工具
  10. css实现径向和线性渐变,CSS3的渐变属性 线性渐变 径向渐变 重复线性渐变和径向渐变...
  11. Sklearn-scaler对比
  12. 图片资源类型转换为bitmap
  13. tesseract的使用
  14. phabricator代码提交自动触发Jenkins token发版(一)
  15. 文档型非关系数据库MongoDB经验总结
  16. 微信支付 Verify the signature and get the Wechatpay certificate corresponding to serialnumber[X] is empt
  17. MVT MVC模型框架
  18. 机器学习教程 之 半监督学习 Tri-training方法 (论文、数据集、代码)
  19. 大数据走进奥运会:科技感爆棚
  20. 【计算机图形学】中点画圆算法和Bresenham画圆算法

热门文章

  1. php图床_PHP利用百度当图床
  2. 路由器web向导页面
  3. request Headers字段详解
  4. Red Hat Enterprise Linux 官方正式版镜像下载
  5. 【博文汇总】Java程序设计语言
  6. Centos清理内存 内存回收释放及内存使用查看的相关命令
  7. R语言快速读写与矩阵运算
  8. Linux:两种非交互修改用户密码的两种方式
  9. mysql数据库j电子课件_mysql数据库(学习课件).ppt
  10. java和dba哪个好_你的性格适合做DBA吗?面试者必看