大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 Apple 芯片 Mac 新系统架构
了解装载 Apple Silicon 的 Mac 如何使用 Apple 的片上系统架构(SoC)取得现代优势。 利用统一的内存架构执行 CPU 和 GPU 任务,Mac app 得益于 Apple Silicon 调整的框架(例如 Metal 和 Accelerate),将带来无比的性能优势。 了解有关启动和安全性方面的新功能和更改,以及这些新功能和更改对你的 app 有何影响。
资源
相关视频
WWDC23
WWDC20
-
下载
(你好 WWDC 2020)
大家好 欢迎来到 WWDC (探索 Apple 芯片 MAC 新系统架构) 大家好 我叫 Gavin 来自核心 OS 团队 我的团队一直致力于 将 macOS 转为 Apple 芯片 所以我很高兴能向大家介绍 这些系统中的一些变化 我们将讨论新性能 以及如何在 macOS app 中利用这些性能 我们还将讨论一些安全增强 以及 app 兼容性 然后 我将交给我的同事 Anand 他将带你了解启动功能和恢复 基于英特尔的 Mac 包含多核 CPU 许多 Mac 都有分立 GPU 最近的 Mac 也有 T2 芯片 支持 Apple Pay、TouchID 和 Hey Siri 等功能 具有分立 GPU 的电脑 拥有用于 CPU 和 GPU 的独立内存
现在 新的 Apple 芯片 Mac 将所有这些组件组合成单一芯片系统 简称 SoC 把所有的东西都建在一个芯片上 给予系统一个统一的内存架构 也就意味着 GPU 和 CPU 在同一内存上工作 图形资源 如纹理、图像和几何数据 可以有效地在 CPU 和 GPU 之间共享 不会逾越各自界限 因为不需要跨 PCIe 总线复制数据
在 Mac 中使用 Apple 芯片还可以让我们 把为 iPhone 和 iPad 开发的独特技术 带到 Apple Mac上 Apple 芯片包含协处理器 包括强大高效的视频编码器和解码器 神经网络引擎 和矩阵乘法机器学习加速器
Mac 已经使用多核 CPU 多年了 但对于基于 Intel 的 Mac 来说 所有核心的性能都差不多 Apple 芯片 Mac 有多种性能核心 可在 app 需要最大性能时发挥作用 对于 CPU 工作量不大的任务 则有更节能的核心
我们称之为非对称多重处理 简称 AMP 这些核心支持相同的体系结构特性 并命令所有相同的软件 macOS 将同时使用所有这些核心 app 将根据其当前的性能要求 调度到适当的核心上
那么 你的 app 应该如何 利用 macOS 的这些新功能呢?
你可能在期望我们发布新的 API 供你在 app 中采用 但我们多年来一直致力于 在我们所有的平台上构建一组统一的 API 并为 Apple 芯片优化这些框架
要在 GPU 上运行工作 则要在基于 Intel 和 Apple 芯片的 Mac 上使用 Metal API 在 Apple Silicon 上 当运行受益于统一内存架构的任务时 你只会看到显著的速度提升
要利用硬件视频编码器和解码器 你可以使用今天 macOS 中相同的 AVFoundation 和 VideoToolbox 框架 为了获得最佳性能 你需要使用硬件优化的像素格式 Apple Silicon 在处理双平面 格式方面特别有效 例如这种格式
我不打算读出来 但只要注意那些名字里有双平面的
你的同样的核心 ML 代码 可以在任何 Mac 上运行 该功能也在基于 Intel 的 Mac 上可用 但在 Apple 芯片上 Core ML 速度更快 效率更高 它利用了神经网络引擎 和机器学习加速器
你的 Core ML 代码 应该在神经网络引擎上运行 无需进行任何更改 你可能需要检查自己没有 特意地配置你的模型 在 cpuOnly 或 CPU-and-GPU 上运行 若想要在神经网络引擎上运行 则要将 computeUnits 设置为 all 这也是默认值
在 Apple Silicon 上 你还可以使用加速框架 更直接地利用机器学习加速器 当然了 加速、压缩和 SIMD 框架中的所有内容 都为基于 Intel 和 Apple 芯片的 Mac 提供了高度优化的实现
当谈到 AMP 时 我们有两个关键的建议 首先 确保在所有工作项上设置了 服务质量 简称 QoS 这些 QoS 属性指示 macOS 应如何确定 工作的优先次序 是否需要以最高的性能完成某个操作 或者 OS 是否应该优先考虑电源效率
正确设置 QoS 在所有平台上都很重要 但在有 AMP 的平台上尤其重要 因为 QoS 是决定任务 将在哪个核心上运行的一个因素
我的第二个建议是使用 Grand Central Dispatch 而且 这对所有平台来说都是很好的建议 但同样 这对 AMP 系统尤为重要
为什么?
当多个核心具有非常不同的性能特征时 在这些核心之间划分工作是特别棘手的 为获得最佳性能 你需要将正确比例的任务分配给每个线程
Grand Central Dispatch 中的 API 如 concurrentPerform 可以帮助完成在所有核心上以最优分配 并行运行任务的繁琐工作
当使用这样的 API 时 请确保你将任务分成足够多的迭代次数 这将有助于系统有效地实现负载平衡 (WWDC 视频) 这些框架已经在 macOS 中使用多年了 如果你想了解更多信息 有更多文档可供查阅 这些 WWDC 视频将是一个很好的起点
Metal 团队今年有几个新的视频 都是关于 Apple 芯片 Mac 上的 Metal
没错 这就是 Apple 芯片上的 macOS 现在让我们继续讨论安全问题
我们自主研发的芯片使我们能够 为 iPhone 开发出杰出的安全功能 我们很高兴能为 Mac 带来这些保护功能 同时确保 Mac 不会丢失任何 本身自有的功能 这些功能包括编写 XOR 执行 内核完整性保护 指针验证和设备隔离
Apple 芯片强制执行一项名为 “编写 XOR 执行”的限制 这意味着内存页面可以是可写的 或者是可执行的 但绝不能同时两者兼而有之 既可写又可执行的页面 可能是一个危险的安全漏洞 然而 许多现代 app 都嵌入了实时编译器 以支持 Java 或JavaScript 等语言 这些 JIT 编译器通常依赖于 既可写又可执行的内存
因此 我们正在添加新的 API 允许内存在可写和可执行权限之间 快速切换 真正酷的是 这对每个线程都有效 因此两个线程可以看到相同页面的 不同权限 就能在多线程 JIT 中被轻松采用 并且还将启用既快速又安全的 JIT 编译器 Apple 芯片在内存控制器中有硬件支持 以使 OS 内核代码不可变 一旦内核被加载到内存中 内核完整性保护就会防止修改 包含内核代码的页面 或使附加页成为可执行页 这样可以阻止 在内核运行时向内核注入新代码的攻击
指针验证可以防止指针的误用 并且可以增强对诸如返回导向编程等 攻击的抵抗能力 64 位指针中未使用的 位用于存储指针验证码 然后在使用指针时检查该验证码
现在 我们正在内核 系统 app 和系统服务中启用这一功能 我们尚未为你准备好开始发布 带有指针验证的 app 但是如果你有兴趣进行实验 那么你可以设置这个 boot-arg 这样就可以自己进行尝试了
PCIe 设备通过 IOMMU 访问系统存储器 在基于 Intel 的 Mac 上 macOS 为所有设备提供了系统内存的 共享视图
在 Apple 芯片上 所有设备 都被赋予单独的内存映射 这限制了设备只能访问 它们想要访问的内存 并防止设备之间相互窥探
要在 PCIe 设备驱动程序中 设置 DMA 传输 应使用 IOMapper 和 IODMACommand API
确保你从设备中获取 IOMapper 然后在配置 IODMACommand 时写入它
一些旧式驱动程序没有使用这个 API 只是直接在 ioMemoryDescriptor 上 使用 getPhysicalSegment 这是行不通的 在移植到新平台之前 这些驱动程序需要 更新到新版 API 现在 这个旧式 API 只能用于 使用内核扩展编写的 IOKit 驱动程序中
内核扩展仍然受到支持 但是对于作为开发人员的你 和你的用户来说 只会感到越来越不方便 我刚刚介绍的前三个安全特性 都影响内核扩展开发 为了能够支持内核完整性保护 我们必须改变 macOS 加载 内核扩展的方式
也就是说现在需要重新启动 (内核扩展) 和指针验证 如果你开发一个内核扩展 你将需要启用指针验证 随着我们继续改进平台 你应该会看到围绕内核扩展的更多不顺畅
我们去年在 Catalina 推出了 DriverKit 使你能够构建在用户空间运行的驱动程序 从而提高系统的稳定性和安全性 如果你尚未为你开发的驱动程序 使用 DriverKit 那么现在是时候这么做了 这里的资源可以帮助你了解更多信息 并能够开始使用 DriverKit
这些就是关于安全的内容 现在 我们来看看这个平台上的 app 支持 Rosetta 是我们运行 现有 x86_64 app 的翻译器 它可以运行各种各样的 apps 比如 macOS apps、Catalyst apps 游戏类以及复杂 apps 比如带有嵌入式 JIT 编译器的 web 浏览器
使用 Metal 的 app 将直接为 Apple GPU 生成正确命令 而使用 Core ML 的翻译后的 app 则可以在神经网络引擎上运行 Rosetta 的性能和兼容性 只有通过 Apple 芯片 和软件团队的密切合作才有可能实现
可以看到 Rosetta 从安装 app 的那一刻起就开始工作 由 App Store 或软件包安装器触发 Rosetta 将开始翻译 你 app 中的所有可执行代码 如果你的 app 没有使用我们的安装器 那么在第一次启动时 你可能会在程序坞 看到一两个额外的反弹 因为我们将在那时开始翻译它
而安全性也深深地融入了这个翻译过程中 app 的翻译都是经过代码签名的 绑定在一台机器上 安全存储 并通过 OS 更新得到刷新 当你的 app 启动时 我们加载存储的翻译 然后 Rosetta 完全模拟 x86_64 进程 一直到系统调用接口 这过程中的一切都被翻译 包括所有的系统框架 如果 Rosetta 遇到在安装时 尚未翻译的代码 那么我们将立即编译它 并且 Rosetta 会通过强化 运行期间的保护功能 来维护你所期望的安全性 所有这些都在 Rosetta 运行中 全部强制执行 现在 希望一切都能正常运转 但如果你确实需要调试或分析你的 app 没问题 这些都是完全支持的 你可以直接从 Xcode 构建和运行翻译后的 app 还可以从 Instruments 中分析 app 你还可以使用 command-line 工具 比如 LLDB 在基于 Intel 的 Mac 和 Apple 芯片 Mac 上运行的进程之间 存在一些差异 页面大小、内存排序规则 mach_absolute_time 的频率 以及浮点数行为的一些细节 都是不一样的
对于运行在 Rosetta 中的 app 我们已经确保所有的操作 都与基于 Intel 的 Mac 上的操作相匹配 Rosetta 不支持将 AVX 向量扩展到 x86 在尝试使用 AVX 之前 app 应该已经在检查电脑 是否支持 AVX 如有需要 可以使用 sysctl 此外 你将看到在 Developer Transition Kit 上运行的一些限制 因为在该硬件上存在一些兼容性限制 DTK 版本说明中有更多信息 最后 如果你的 app 确实需要知道 在 Rosetta 中的运行时间 那么我们添加了 sysctl.proc_translated 来检查这一点
好了 这就是 Rosetta 当然 你的客户真正想要的是 app 的本机 arm64 端口 我们在开发人员文档网站上 提供了大量关于移植和优化 app 的信息 有一个视频全是关于移植 app 的建议 请去查看一下 并请从本机端口开始
同时 兼容的 iPad 和 iPhone app 也将在 Mac 上首次提供 同样 我们有一个完整视频 可让你了解更多信息 我希望我已经为你提供了 一些关于 Apple 芯片上的 macOS 新的安全增强和 app 支持的有用见解 现在我将时间交给 Anand 他将深入讲解这些系统的引导体系结构 谢谢 谢谢 Gavin 向 Apple 芯片的转移是一个伟大的冒险 启动过程是其中必不可少的一部分 我很高兴能向你介绍 视频的这一部分将为你概述新的启动过程 我们将谈论对启动和登录体验的改变 对 macOS 恢复模式的改变 以及对系统的启动安全 和数据保护层的增强
在 Apple 芯片 Mac 上 启动过程基于 iOS 和 iPadOS 的安全引导架构 安全启动确保每个启动组成部分 都由 Apple 加密签名 并且只有在验证信任链之后才会启动 这在 macOS 上启动时提供了 更强的安全性
此外 我们还增加了 从安装在内部或外部卷上的 多个 macOS 启动支持 以及启用了启动 Apple 签署的 任何版本的 macOS 这将允许未来的 macOS 继续启动旧版本 最后 我们引入了新的 macOS 恢复流 那么 Apple 芯片 Mac 上的启动 是如何运作的呢?
启动体验比以前简单多了 所有的启动键现在都统一了
只需按住 Mac 便携电脑上的 TouchID 按钮 或按下桌面电脑上的电源按钮 即可启动 Startup 选项 Startup 选项是新 macOS 恢复用户界面的一部分 一旦进入“Startup 选项” 就可以使用用户界面或快捷键 访问功能和工具
这就是它的样子 这是 Apple 芯片 Mac 上的 macOS 恢复启动选项用户界面 与集成的启动管理器 macOS 恢复是你的一站式商店 包含所有与启动和恢复有关的事情 它随着新的用户体验而改变 值得重点介绍的两个特性是 启动磁盘和 Mac 共享模式 我们先从 Mac 共享模式说起 Mac 共享模式取代了目标磁盘模式 它使用 SMB 文件共享 来提供对用户数据的文件级访问 需要用户身份验证才能启用此服务 接下来 启动磁盘 macOS 恢复启动磁盘侧重于 为安装了 macOS 的 每个卷选择安全策略 你可以从这里显示的 完整或降低安全性中进行选择 那么 安全模式有哪些呢?
在完整安全模式下 新款 Apple 芯片 Mac 享受到了与 iPhone 相同的 一流安全技术 默认情况下 此模式启用 此外 你现在可以从外部磁盘启动 而不会降低系统的安全性 我们觉得这很棒 相比之下 降低安全性 为 Mac 提供了灵活性和可配置性 并使 Mac 保持原样
降低安全性允许你运行任何版本的 macOS 包括不再由 Apple 签署的版本 此外 想要安装公证内核扩展的用户 必须启用此模式才能这样做 要启用降低安全性 用户必须 首先在 macOS 恢复中进行身份验证
使用现有的安全配置工具 CSRUtil 你还可以配置 Mac 的安全性 以支持特定的工作流 例如 如果你想要开发内核扩展 或者你是研究人员 或者是探索 Apple 平台的爱好者 你可能会想要这样做
CSRUtil 提供了许多规范 这里只强调了其中很少的内容 现在 在基于 Intel 的 Mac 上 主动安全策略适用于整个系统 因此 如果你在多个卷上安装了 macOS 那么降低其中一个卷的安全性 会影响所有的安装 然而 Apple 芯片 Mac 为每个 macOS 安装维护单独的安全策略 你可以降低用于开发或测试的 操作系统的安全性 但仍然可以安装完整安全的 macOS 供日常使用 接下来让我们谈谈新的登录
这很漂亮 在 Apple 芯片 Mac上 macOS 拥有统一的登录体验 它支持具有加速图形的更丰富的用户界面 这也符合 macOS 的外观和感觉 这种体验是通过 完全启动 macOS 而实现的 无需用户解锁系统 即使在文件保险箱打开的情况下 统一登录体验也允许引入新功能 例如 它现在内置了 对 CCID 和 PIV 兼容智能卡 身份验证的支持 以及对辅助功能改进的 VoiceOver 支持 让我们来谈谈数据保护 与 T2 Mac 类似 Apple 芯片 Mac 上的 macOS 默认支持全数据量加密 当文件保险箱打开时 此加密将绑定到用户的凭证
Apple 芯片 Mac 还支持安全休眠
除了在低电量情况下 保存桌面和 app 之外 安全休眠通过提供完整性和防重放保护 为内存内容提供完全的静止保护 向 Apple 芯片转移 使得这一功能成为可能 下面我们就来谈谈 Apple 芯片 Mac 的恢复将如何运作 在高层 软件由两个组件组成 macOS 和 macOS 恢复 如果 macOS 不可访问 你可以使用 macOS 恢复 来重新安装和恢复你的系统 但是当 macOS 恢复本身不可访问时 会发生什么呢? 在基于 Intel 的 Mac 上 你可以使用互联网恢复
在 Apple 芯片 Mac 上 我们正在引入系统恢复 它是最小的 macOS 环境 安装在一个单独的隐藏容器中 可让你通过重新安装 macOS 和 macOS 恢复来恢复 Mac
Apple Configurator 2 将继续得到支持 当系统恢复本身不起作用时 它将允许你恢复 Mac 你可以擦除和重新安装 macOS 包括系统恢复 总结一下 在这个视频中 我们讨论了 Apple 芯片的功能 包括安全增强 以及 macOS app 如何利用这些功能 我们还讨论了 app 兼容性 并介绍了 Rosetta 最后描述了新的启动特性和恢复过程 向 Apple 芯片转移 为 macOS 带来重大改进 我们希望这个视频 能让你更加深入了解这些内容 我们期待看到 你能在自己的 app 中 利用这些改进 非常感谢你的观看
-
-
9:42 - Set up DMA transfer in a PCIe driver
// 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
-
14:31 - Check if running in 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; }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。