Highlight
Apple 解释了 Apple silicon Mac 的 SoC、统一内存、AMP 调度、安全启动、Rosetta 和恢复流程,并给出 macOS app 在 Metal、Core ML、GCD、DriverKit 与 Rosetta 检测上的迁移入口。
核心内容
Intel Mac 上,CPU、GPU、T2、独立显存和外设访问路径分散在不同组件里。带独立 GPU 的机器还要在 CPU 内存和 GPU 内存之间搬运纹理、图片和几何数据。Apple silicon Mac 把这些能力放进同一个 SoC,CPU 和 GPU 访问同一套统一内存,图形资源可以直接共享。
开发者最先要问的问题很实际:现有 app 要重写多少?这场 session 的答案很克制。Apple 没有要求开发者切到一组全新的平台 API,而是强调继续使用 Metal、AVFoundation、VideoToolbox、Core ML、Accelerate、Compression、SIMD 和 Grand Central Dispatch。差异在于这些框架已经针对 Apple silicon 做了优化。
第二个现实问题是兼容性。Rosetta 会运行现有 x86_64 app,翻译结果会被签名、绑定到单台机器并安全存储;Xcode、Instruments 和 LLDB 也支持调试、分析被翻译的 app。原生迁移仍然是目标,但 Rosetta 给用户和团队留出了过渡窗口。
底层系统也有新约束。write XOR execute、kernel integrity protection、pointer authentication 和 device isolation 会影响 JIT、内核扩展和 PCIe 驱动。对驱动开发者来说,老的物理地址访问路径需要迁移到 IOMapper 与 IODMACommand;长期方向是尽早评估 DriverKit。
启动和恢复流程同样变了。Apple silicon Mac 使用基于 iOS 和 iPadOS Secure Boot 的架构,启动链每一步都要通过 Apple 签名验证;Startup Options 统一了启动按键,macOS Recovery 负责启动盘、安全策略、Mac Sharing Mode 和恢复工具。
详细内容
1. 统一内存和平台框架
(01:00)Apple silicon Mac 把 CPU、GPU、视频编解码器、Neural Engine 和机器学习加速器放进一个 SoC。统一内存让 CPU 和 GPU 共享图形资源,省掉通过 PCIe 总线复制数据的开销。
(02:40)开发者仍然用已有框架进入这些硬件能力。图形工作使用 Metal;视频编码和解码使用 AVFoundation 与 VideoToolbox;机器学习使用 Core ML 或 Accelerate。Core ML 要避免把模型显式设成 cpuOnly 或 cpuAndGPU,让 computeUnits 保持默认的 all,才有机会跑到 Neural Engine 上。
关键点:
- Apple 的迁移建议从框架入口开始,不从芯片细节开始。
- Metal、AVFoundation、VideoToolbox、Core ML 和 Accelerate 是 transcript 明确点名的入口。
- 对 Core ML app,先检查配置有没有把计算单元限制在 CPU 或 CPU+GPU。
2. AMP 调度和并行工作
(04:42)Apple silicon Mac 使用 asymmetric multiprocessing(AMP),同一台机器里同时有 performance cores 和 efficiency cores。macOS 会根据任务的性能需求把工作调度到合适的核心上。
(04:46)开发者要给所有 work item 设置 quality of service(QoS)。QoS 会告诉 macOS 这段工作追求最高性能,还是更适合优先考虑能效。这个信号在 AMP 系统上会影响任务落到哪类核心。
(05:26)并行工作建议交给 Grand Central Dispatch。concurrentPerform 这类 API 会帮助系统把任务分配到不同性能特征的核心上。任务拆分要有足够多的 iteration,系统才有空间做负载均衡。
关键点:
- 把 QoS 当作性能和能效意图的一部分,不要只在后台队列上随手设置。
- 多核拆分交给 GCD,可以减少手写线程分配时对核心性能差异的误判。
- 大任务要拆成足够多的片段,AMP 系统才能有效平衡 workload。
3. 安全模型和 PCIe 驱动
(07:11)Apple silicon 强制 write XOR execute,内存页可以写入或执行,但不能同时处于两种状态。为了支持 Java、JavaScript 这类 JIT 编译器,Apple 增加了可以在线程级别快速切换可写和可执行权限的新 API。
(08:13)kernel integrity protection 会让内核代码在加载后不可变,pointer authentication 会把认证码放进 64 位指针的空闲 bit 来防御指针误用。Apple 当时已经在内核、系统 app 和系统服务中启用 pointer authentication,但还没有让第三方 app 以这种方式发布。
(09:14)device isolation 改变了 PCIe 设备访问内存的方式。Intel Mac 上,设备共享一份系统内存视图;Apple silicon Mac 会给每个设备单独的 memory mapping,限制设备只能访问原本应该访问的内存。
官方给出的 PCIe DMA 设置片段是:
// Get the IOMapper for the device
IOMapper *mapper = IOMapper::copyMapperForDevice(device);
// Use an IODMACommand; pass the mapper when initializing
IODMACommand *dmaCommand = IODMACommand::withSpecification(
outSegFunc, numAddressBits, maxSegmentSize, mappingOptions,
maxTransferSize, alignment, mapper, refCon);
// Keep the IODMACommand prepared for the duration of the i/o
关键点:
IOMapper::copyMapperForDevice(device)从当前设备取得 mapper,匹配 Apple silicon 的隔离内存视图。IODMACommand::withSpecification(...)初始化时传入 mapper,让 DMA 命令走新的映射路径。- 旧驱动直接对
ioMemoryDescriptor调getPhysicalSegment的路径不能用于这个平台。 - kernel extension 仍然可用,但加载方式、更高的用户摩擦和 pointer authentication 要求都会推动驱动迁移到 DriverKit。
4. Rosetta 的翻译和诊断
(11:31)Rosetta 用来运行现有 x86_64 app。它覆盖 macOS app、Catalyst app、游戏,以及带嵌入式 JIT 编译器的复杂 app。使用 Metal 的被翻译 app 会生成面向 Apple GPU 的命令,使用 Core ML 的被翻译 app 也能跑到 Neural Engine 上。
(12:08)Rosetta 会在 App Store 或 package installer 触发安装时开始翻译可执行代码。翻译产物会被 code signed,绑定到单台机器,安全存储,并在系统更新后刷新。启动时系统加载已保存的翻译;如果运行中遇到尚未翻译的代码,Rosetta 会即时编译。
(13:37)原生 Apple silicon 进程和 Intel Mac 进程之间存在差异,包括 page size、memory ordering rules、mach_absolute_time 频率和部分 floating point 行为。Rosetta 会让被翻译进程匹配 Intel Mac 行为,但它不支持 x86 的 AVX vector extensions。
官方给出的 Rosetta 检测片段是:
// Use "sysctl.proc_translated" to check if running in Rosetta
// Returns 1 if running in Rosetta
int processIsTranslated() {
int ret = 0;
size_t size = sizeof(ret);
// Call the sysctl and if successful return the result
if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) != -1)
return ret;
// If "sysctl.proc_translated" is not present then must be native
if (errno == ENOENT)
return 0;
return -1;
}
关键点:
- 返回
1表示当前进程运行在 Rosetta 中。 sysctl.proc_translated不存在时,代码把结果视为 native。- 这个检测适合放进诊断、日志和兼容性测试路径,不适合用来逃避原生迁移。
- 需要 AVX 的代码路径要继续用系统能力检查,不要假设 Rosetta 会覆盖 AVX。
5. 启动、安全策略和恢复
(16:00)Apple silicon Mac 的启动流程基于 iOS 和 iPadOS 的 Secure Boot 架构。每个启动组件都要由 Apple 加密签名,整条 chain of trust 验证后才会启动。
(16:46)启动入口被统一到 Startup Options。Mac 笔记本按住 Touch ID 按钮,台式机按住电源按钮,就能进入这个界面。macOS Recovery 把 Startup Manager、Startup Disk、安全策略和恢复工具集中到一个 UI。
(17:38)Mac Sharing Mode 替代 Target Disk Mode,使用 SMB file sharing 提供文件级访问,并要求用户认证。Startup Disk 现在能为每个安装了 macOS 的 volume 选择 full security 或 reduced security。
(19:34)Intel Mac 的 active security policy 作用于整台机器。Apple silicon Mac 会给每个 macOS installation 维护独立安全策略。开发或测试系统可以降低安全级别,日常系统仍然保持 full security。
(21:53)Apple silicon Mac 引入 System Recovery。它是安装在独立隐藏容器里的最小 macOS 环境,用来在 macOS Recovery 本身不可用时重新安装 macOS 和 macOS Recovery。Apple Configurator 2 仍然用于 System Recovery 也不可用的场景。
关键点:
- 外置磁盘启动不再需要降低整台机器的安全级别。
- reduced security 是给内核扩展开发、研究和特定工作流准备的可配置模式。
- 支持文档要区分 macOS Recovery、System Recovery 和 Apple Configurator 2 三层恢复路径。
核心启发
-
做一个 Apple silicon 迁移体检页:做什么:在 macOS app 的 debug build 里列出 Metal、AVFoundation、VideoToolbox、Core ML、Accelerate 和 GCD 使用情况。为什么值得做:session 明确把这些框架作为 Apple silicon 能力入口。怎么开始:先检查 Core ML 的
computeUnits,再审查队列 QoS 和可并行任务是否适合交给concurrentPerform。 -
给内置脚本引擎增加 JIT 安全模式:做什么:把 Java、JavaScript 或自研脚本引擎的 JIT 内存管理封装成独立模块。为什么值得做:write XOR execute 要求内存页不能同时可写又可执行,Apple 提供了线程级快速切换权限的新 API。怎么开始:先把生成代码、切换权限、执行代码三步拆开,准备在多线程 JIT 中按线程切换权限。
-
做一个驱动迁移报告工具:做什么:扫描 PCIe 或 SCSI 驱动中直接调用
getPhysicalSegment的 DMA 路径。为什么值得做:Apple silicon 的 device isolation 需要设备级 memory mapping,旧路径不会工作。怎么开始:把目标路径改成从 device 取得IOMapper,再用带 mapper 的IODMACommand管理 DMA,并同时评估 DriverKit 迁移。 -
给兼容性测试加 Rosetta 标记:做什么:在 app 的诊断日志里记录进程是否运行在 Rosetta 下。为什么值得做:page size、memory ordering、
mach_absolute_time频率和 floating point 细节在原生平台上会变化,Rosetta 会模拟 Intel Mac 行为。怎么开始:使用sysctl.proc_translated检测翻译状态,并把 AVX 能力检查放进启动自检。 -
写一套支持团队用的恢复路径向导:做什么:把 Startup Options、Mac Sharing Mode、full security、reduced security、System Recovery 和 Apple Configurator 2 做成排障流程。为什么值得做:Apple silicon Mac 的恢复和安全策略按 volume 管理,用户不一定知道该在哪一层操作。怎么开始:把常见问题分成启动盘选择、文件取回、内核扩展安装、系统恢复四类。
关联 Session
- Port your Mac app to Apple silicon — 继续讲如何重新编译现有 macOS app、构建 Universal app,并处理低层代码和插件迁移。
- iPad and iPhone apps on Apple silicon Macs — 解释 iOS 和 iPadOS app 如何在 Apple silicon Mac 上测试、适配与分发。
- Bring your Metal app to Apple silicon Macs — 介绍 Apple silicon Mac 的 TBDR GPU 架构,是理解 Metal 迁移的前置内容。
- Optimize Metal Performance for Apple silicon Macs — 深入讲 Apple GPU 上的 workload 调度、渲染管线和 shader 优化。
- Modernize PCI and SCSI drivers with DriverKit — 讲 PCI 和 SCSI 驱动如何用 DriverKit 迁出内核空间。
评论
GitHub Issues · utterances