Apple's Darwin OS and XNU Kernel Deep Dive
深入探索苹果的 Darwin OS 和 XNU Kernel
Apple’s Darwin OS and XNU Kernel Deep Dive
深入研究苹果的 Darwin OS 和 XNU kernel 架构,追溯其从 Mach 和 BSD 起源到驱动 macOS、iOS 和 Apple Silicon 的演变。本文探讨了混合内核的设计、其对新硬件和安全模式的适应,以及为什么 XNU 仍然是苹果平台独一无二的、具有弹性和可扩展性的基础。
发布于 2025 年 4 月 4 日 • 阅读时长 42 分钟
#research #operating-systems #macos #kernel
目录
- Introduction
- Darwin and XNU Development History
- XNU Kernel Architecture and Design
- Conclusion
- Footnotes
这篇文章源于我在阅读了 Thomas Claburn 关于 Exclaves 的文章 后,对 XNU 进行了长达数周的深入研究,稍后会详细介绍。我已尽力将所有信息浓缩到一篇博文中。我还尝试保持每个部分独立,以便您可以使用目录跳过,但这会导致在某些地方重复自己,因此提前感谢您的耐心。虽然我对这个主题的理解充满信心,但在处理如此密集的内容时,一些错误是不可避免的,如果您发现任何错误,请认为是我的错误,并请与我联系,以便我进行更正,也请通过电子邮件或 mastodon 告诉我您的想法。提前感谢,让我们开始吧!
Introduction
苹果的 Darwin 操作系统是支撑 macOS、iOS 和苹果所有现代 OS 平台的核心,类似 Unix。其核心是 XNU kernel – 这是一个幽默的缩写,代表“X is Not Unix”。 XNU 是一个独特的混合内核,它将 Mach 微内核核心与 BSD Unix 的组件结合在一起。 这种设计继承了 Mach(起源于 1980 年代的微内核研究)的丰富遗产以及 BSD 的强大稳定性和 POSIX 兼容性。 通过将微内核消息传递技术与单片 Unix 内核结构相结合,最终获得了一种平衡模块化和性能的内核架构。我们将按时间顺序探索 Darwin 和 XNU 的演变 – 从 Mach 和 BSD 的起源到 Apple Silicon 上的 macOS 和 iPhone 上的 iOS 中的现代内核功能。接下来,我们将深入研究架构里程碑,分析 XNU 的内部设计(Mach-BSD 交互、IPC、调度、内存管理、虚拟化),并检查内核和关键用户空间组件如何随着时间的推移适应新的设备和需求。
Darwin and XNU Development History
Mach Microkernel Origins (1985–1996)
Darwin 的故事始于 Mach,这是卡内基梅隆大学(1985 年)的一个项目,由 Richard Rashid 和 Avie Tevanian 领导。 Mach 被设想为下一代微内核,以解决 UNIX 内核日益增长的复杂性。 Mach 没有采用单个大型内核二进制文件,而是仅提供了基本的底层功能 – 内存管理(虚拟内存、地址空间)、CPU 调度(线程和任务)以及进程间通信(通过消息传递的 IPC)。 更高级别的服务(文件系统、网络、设备驱动程序等)旨在作为用户空间 服务器 在 Mach 之上运行。 这种分离有望提高可靠性(崩溃的驱动程序不会导致整个系统崩溃)和灵活性(多个 OS 特性可以同时运行)。 实际上,Mach 的设计允许在一个微内核上运行多个“特性” – 例如,UNIX 和另一个 OS – 这一概念类似于现代虚拟化。
到 1990 年,Mach 已发展到 Mach 2.5,它是一个微内核,但仍然将一些 BSD 内核代码与内核空间共置以提高性能。 真正的微内核版本 Mach 3.0 于 1991 年至 1994 年问世。 Mach 的 虚拟内存 (VM) 系统 在项目之外也具有影响力 – 它被 4.4BSD 和后来的 FreeBSD 采用作为其内存管理子系统。 重要的是,Mach 引入了 任务(封装地址空间和资源,大致相当于一个进程)和 线程(CPU 执行单元)作为一流的内核对象的概念。 它还实现了一个高效的 VM,具有写时复制和内存对象抽象,以及一个使用 Mach ports 的基于消息的 IPC 机制。
与 Mach 的开发并行,NeXT Computer(由 Steve Jobs 于 1985 年创立)需要一个现代 OS 来支持其工作站。 NeXT 很早就采用了 Mach:于 1989 年发布的 NeXTSTEP 构建在 Mach 2.5 内核之上,并在其上分层了一个 4.3BSD Unix 子系统。 至关重要的是,NeXTSTEP 的内核(后来命名为 XNU)不是一个具有用户空间服务器的纯微内核系统; 相反,它采用了 Mach 并将 BSD 代码集成到内核地址空间中 以提高速度。 换句话说,NeXT 使用 Mach 的抽象(任务、线程、IPC、VM)并在 Mach 原语之上 以内核模式 运行 BSD 内核。 这种混合方法牺牲了 Mach 的一些极端模块化,以换取性能:它避免了困扰那个时代的完全微内核系统的繁重的上下文切换和消息传递开销。 NeXTSTEP 的内核还包括一个名为 DriverKit 的面向对象的驱动程序框架(用 Objective-C 编写),用于将设备驱动程序开发为对象,反映了 NeXT 对更高级别语言的偏好。
到 1990 年代中期,Apple 的原始 Mac OS(经典 Mac OS)已老化,并且缺乏现代 OS 功能,例如适当的多任务处理和内存保护。 1996 年,Apple 寻求一个现有的 OS 作为其未来发展的基础。 该公司于 1996 年 12 月收购了 NeXT,选择 NeXTSTEP 作为新的 Mac OS X 的核心。 通过此次收购,NeXT 的 Mach/BSD 混合内核进入了 Apple,同时带来了 Avie Tevanian(Mach 共同作者)作为 Apple 软件副总裁的工程领导力。 Apple 将新的 OS 项目命名为 Rhapsody,该项目后来成为 Mac OS X。
Rhapsody to Mac OS X: Integrating Mach 3.0 and BSD (1997–2005)
收购 NeXT 后,Apple 开始将 NeXTSTEP 内核与 Mac 所需的附加功能和硬件支持合并。 该内核使用更新的 Mach 和 BSD 技术进一步更新。 值得注意的是,Apple 将 OSFMK 7.3(开放软件基金会的 Mach 3.0 内核)的代码合并到了 XNU 中。 这意味着 XNU 的 Mach 部分现在借鉴了 Mach 3.0 真正微内核的血统(包括犹他大学 Mach 4 研究的贡献)。 在 BSD 方面,NeXTSTEP 内核的 4.3BSD 子系统已使用 4.4BSD 和 FreeBSD 代码进行了升级。 这带来了一个更现代的 BSD 实现,具有诸如改进的网络和强大的文件系统基础结构之类的功能。 通过组合 Mach 3.0 和 FreeBSD 元素,Apple 将 XNU 塑造为一个强大的混合内核:Mach 提供了低级内核架构和抽象,而 BSD 则提供了其上的 Unix API 和服务。
Apple 还用一个名为 I/O Kit 的新驱动程序框架取代了 NeXT 的旧 DriverKit,该框架用 C++ 的一个子集编写。 I/O Kit 在内核中引入了面向对象的设备驱动程序模型,以强大的方式支持诸如动态设备匹配和热插拔之类的功能。 选择 C++(减去异常和多重继承,使用嵌入式 C++ 子集)用于 I/O Kit 可能是为了提高性能并避免 Objective-C 在内核中的运行时开销。 因此,到 1990 年代后期,XNU 由三个核心部分组成:Mach 微内核层(现在基于 OSFMK 7.3)、BSD 层(主要来自 FreeBSD)以及用于驱动程序的 I/O Kit。
Apple 在 1999 年交付了 Mac OS X 的第一个开发人员预览版,并在 2000 年发布了开源 Darwin 1.0,该版本向开发人员公开了 XNU 内核和基本的 Unix 用户区。 商业首秀 Mac OS X 10.0 (Cheetah) 于 2001 年初问世(Darwin 1.3.1)。 尽管最初的版本在性能上很粗糙,但它们巩固了架构范例。 早期的关键里程碑包括:
- Mac OS X 10.1 (Puma, 2001) – 提高了线程处理性能并添加了缺少的 Unix 功能。 10.1 中的 Darwin 1.4.1 引入了更快的线程管理和实时线程支持。
- Mac OS X 10.2 (Jaguar, 2002) – Darwin 6.0 带来了 BSD 层与 FreeBSD 4.4/5 的同步,以及大型新功能:IPv6 和 IPSec 网络、用于发现的新
mDNSResponder
服务 (Bonjour/Rendezvous) 以及 HFS+ 文件系统中的日志记录。 它还升级了工具链 (GCC3) 并添加了现代 Unix 实用程序。 - Mac OS X 10.3 (Panther, 2003) – Darwin 7.0/7.1 集成了 FreeBSD 5 内核改进。 这带来了 细粒度的内核锁定(脱离了早期的巨型锁模型)以更好地利用多处理器。 Panther 的内核还引入了 集成的 BFS(基本防火墙)和其他性能调整,例如改进的 VM 和 I/O。
在所有这些版本中,XNU 仍然是一个 32 位内核(在 10.4 中为特定任务引入了有限的 64 位用户进程支持)。 Apple 维护了对 PowerPC 的支持,PowerPC 是早期 Mac 选择的 CPU 架构,同时也在源代码中悄悄地保留了 Intel x86 兼容性(从 NeXTSTEP 的 x86 支持继承),为未来的过渡做准备。
一个主要的架构变化出现在 Mac OS X 10.4 (Tiger, 2005) 中。 这是 Apple 宣布 OS X 获得 UNIX 03 认证 的第一个版本,这意味着该系统符合 Single UNIX Specification 并且可以合法地使用 UNIX 名称。 Darwin 8(Tiger 的核心)通过集成在 XNU 中的强大的 BSD 层实现了此 UNIX 认证。 Tiger 还引入了诸如 kqueue/kevent(来自 FreeBSD,用于可扩展的事件处理)之类的新内核功能,并通过保持 XNU 跨平台为 Intel Mac 奠定了基础。 Apple 随后在 2005 年宣布 Mac 切换到 Intel x86 处理器。 XNU 的 Mach 基础使这种平台适应性变得更容易,因为 Mach 将许多低级硬件细节抽象在可移植性层后面。 2006 年初,Apple 发布了 Mac OS X 10.4.4 for Intel,展示了在 x86_32 上运行的 XNU,其中大部分代码与 PowerPC 版本共享。
Transition to 64-bit, Multi-Core and iPhone OS (2005–2010)
到 2000 年代中期,计算已转向多核 64 位架构,Apple 的 OS 必须相应地发展。 基于 Darwin 9 的 Mac OS X 10.5 Leopard (2007) 是 XNU 的一个里程碑版本。 它引入了广泛的 64 位支持:虽然早期版本可以以有限的形式运行 64 位用户应用程序,但 Leopard 的内核本身可以在适当的硬件 (x86-64) 上以 64 位模式运行,并支持 64 位驱动程序。 Leopard 还放弃了对旧架构(例如 PowerPC G3)的官方支持,并带来了更强大的安全性和性能功能:地址空间布局随机化 (ASLR) 以阻止利用,一个用于限制进程的高级 sandbox 设施,以及来自 Solaris 的 DTrace 仪器框架,用于低级跟踪。 值得注意的是,Leopard 是最后一个完全支持 PowerPC 的 Mac OS X 版本 – 此时 Apple 正在将其整个产品线过渡到 Intel。
2007 年,Apple 还推出了带有“iPhone OS”(后来命名为 iOS)的 iPhone,该“iPhone OS”也构建在 Darwin 之上。 第一个 iPhone OS 基于 Darwin 9(与 Leopard 相同的核心)。 这证明了 XNU 的多功能性:在相同的内核版本中,Apple 可以针对高端 PowerPC 和 x86 服务器、消费类 Intel 笔记本电脑和资源受限的 ARM 移动设备。 内核获得了对 ARM 架构的支持,并针对移动设备进行了量身定制的修改。 例如,由于早期的 iPhone 的 RAM 非常有限且没有交换空间,因此内核的内存管理必须包含积极的 内存压力处理。 Apple 在 iPhone OS 中引入了一种 Jetsam 机制,该机制监视低内存情况并杀死后台应用程序以释放内存(因为传统的交换到磁盘在闪存存储上不可行)。 iPhone OS 还从设计上将所有第三方应用程序都运行在一个 sandbox 中,并且需要对二进制文件进行严格的代码签名 – 由 XNU 的 Mach 和 BSD 层促进的安全措施(Mach 的任务端口和内核中的代码签名强制执行,并借助用户空间守护程序(如 amfid
)进行签名验证)。
Mac OS X 10.6 Snow Leopard (2009) 标志着 XNU 在 64 位 Intel 上的成熟。 Snow Leopard (Darwin 10) 完全停止了对 PowerPC 的支持,使 XNU 成为一个双架构内核(适用于 Intel Mac 的 x86_64 和 i386)。 它也是第一个在有能力的 Mac 上搭载 可选的 完全 64 位内核的版本(大多数默认使用带有 64 位用户区的 32 位内核,Xserve 除外)。 Snow Leopard 带来了重大的并发性改进:引入了 Grand Central Dispatch (libdispatch),用于用户空间任务并行化,以及内核对 dispatch queues 的支持。 虽然 libdispatch
是一个用户空间库,但它与内核紧密合作,内核为调度队列提供底层的线程池和调度。 另一个新增功能是用于 GPU 计算的 OpenCL,同样需要用户框架和内核驱动程序之间的紧密集成。 Snow Leopard 精简的对 Intel 和多核优化的关注使 XNU 更加高效。
在移动方面,iPhone OS 3 (2009) 和 iOS 4 (2010)(在 2010 年重命名为“iOS”)并行发展,增加了对 Apple A4/A5 ARM 芯片以及诸如多任务处理之类的功能的支持。 在 iOS 4 中调整了 XNU 的调度程序,以处理具有不同优先级带的后台应用程序的概念(前台、后台等),并支持随之出现的 多核 ARM SoC(例如,2011 年的 Apple A5 是双核)。 iOS 和 macOS 内核在很大程度上保持统一,并针对平台差异使用条件代码。 到 OS X 10.7 Lion (2011) 时,XNU 完全放弃了对 32 位 Intel 内核的支持 – 它要求 Mac 上使用 64 位 CPU,反映了该行业超越 32 位的趋势。 Lion (Darwin 11) 还改进了沙盒并增加了对 Obj-C 中诸如 自动引用计数 (ARC) 之类的新功能的完全支持(编译器和运行时更改反映在系统中)。
Modern macOS and iOS Evolution (2011–2020)
从 2011 年起,Apple 的 OS 发布以年度为节奏进行,并且 Darwin 不断获得递增但显着的增强功能,以支持新的硬件和功能:
- OS X 10.8 Mountain Lion (2012) 和 10.9 Mavericks (2013)(Darwin 12 和 13)在内核中引入了电源和内存优化。 Mavericks 添加了 Compressed Memory,这是一项内核功能,其中非活动页面在 RAM 中压缩以避免交换到磁盘。 这与 iOS 用于应对低 RAM 的技术一致,并且通过提高内存压力下的响应速度使 Mac 受益。 Mavericks 还实现了 Timer Coalescing,内核在其中对齐来自空闲状态的唤醒以降低 CPU 功耗。 这些更改表明内核如何适应能源效率需求,并受到移动设计理念的影响。 此外,大约在这个时候,Apple 引入了 App Nap 并增加了对线程的服务质量 (QoS) 类的使用,这需要内核调度意识才能根据 QoS 提示(例如,后台任务与用户启动的任务)来限制线程或确定线程的优先级。 XNU 的调度程序已发展为支持这些多个优先级带和节能调度。
- OS X 10.10 Yosemite (2014) 和 10.11 El Capitan (2015)(Darwin 14 和 15)延续了这一趋势。 El Capitan 中的一个主要安全新增功能是 System Integrity Protection (SIP)。 SIP(也称为“rootless”)由内核的安全框架强制执行,从而阻止即使是 root 用户进程也篡改关键的系统文件和进程。 通过 BSD 层的强制访问控制 (MAC) 框架实现的 SIP 通过将更多的信任转移到内核中并远离用户空间来加强 OS。 对于 iOS(2015 年的 iOS 9),应用了类似的“rootless”概念。 Darwin 15 还看到了 Apple 进一步统一 OS X 和 iOS 的代码库,因为它们引入了 watchOS 和 tvOS(两者也都基于 Darwin) – XNU 必须适应在微小的 Apple Watch 硬件(S1 芯片)上运行到功能强大的 Mac Pro,并具有可扩展的调度、内存和 I/O 功能。 到现在为止,XNU 支持 ARM64(64 位 ARMv8,于 2013 年在 iPhone 5s 中首次使用),并且将继续到 iOS 11 (2017) 时放弃对 iOS 的 32 位 ARM 支持。
- macOS 10.12 Sierra (2016)、10.13 High Sierra (2017)、10.14 Mojave (2018)(Darwin 16–18)带来了文件系统发展和进一步的安全性。 High Sierra 引入了 APFS (Apple File System) 作为新的默认文件系统,取代了 HFS+。 APFS 需要内核支持容器级别的快照、克隆和加密。 XNU 的 VFS 层(在 BSD 组件中)已扩展为适应 APFS 的高级功能和性能特性。 在此期间,kext(内核扩展)的安全性得到了加强 – macOS High Sierra 要求用户批准加载第三方 kext,并且 macOS Mojave 引入了更严格的代码签名检查并加强了用户空间进程的运行时,这也影响了内核验证和允许某些操作的方式。 另一个适应是图形和外部设备支持,High Sierra 的通过 Thunderbolt 提供的 eGPU 支持需要在 I/O Kit 中进行热插拔处理改进以及外部 PCIe 设备的调度。
- macOS 10.15 Catalina (2019) (Darwin 19) 是 XNU 的一个重要的现代化步骤。 Catalina 是第一个 弃用大多数 32 位代码 的版本(只有 64 位应用程序,并且内核已经仅支持 64 位多年)。 更值得注意的是,Apple 引入了一种新的设备驱动程序方法:DriverKit,恢复了 NeXT 旧驱动程序框架的名称,但采用了新的设计。 现代 macOS 中的 DriverKit 允许许多驱动程序作为 Driver Extensions (dexts) 在用户空间中运行,位于内核之外。 这是针对第三方代码的朝着微内核理念的转变 – 通过将驱动程序(USB、网络等)移动到用户空间进程,Apple 提高了系统稳定性和安全性(如果有问题的驱动程序位于内核之外,则无法导致内核崩溃)。 XNU 已进行调整以促进这一点:内核为用户空间驱动程序提供对硬件的受控访问(通过 IPC 和共享内存),而不是将其代码作为 kext 加载。 同时,Catalina 将 OS 文件系统拆分为只读系统卷,从而加强了内核的 SIP 保护(内核现在将系统文件视为运行时不可变的)。 这些更改表明,即使在其诞生数十年后,XNU 的架构也可以在有益时进行调整以包含更多用户空间职责,从而利用 Mach IPC 机制安全地执行此操作。
Apple Silicon Era (2020–Present)
2020 年,Apple 进行了另一项具有里程碑意义的转型:将 Mac 产品线从 Intel CPU 转移到 Apple 的定制 ARM64 SoC(Apple Silicon 芯片,从 M1 开始)。 由于 iOS 的缘故,Darwin 长期以来一直支持 ARM,但是在 ARM64 上运行 macOS 带来了新的挑战和机遇。 macOS 11 Big Sur (2020) 对应于 Darwin 20,是 Apple Silicon Mac 的第一个版本。 XNU 已经是跨平台的,但是它现在必须支持异构 big.LITTLE CPU architecture:Apple Silicon 芯片将高性能核心和节能核心结合在一起。 调度程序已增强为 异构感知,从而确保高优先级和繁重的线程在性能核心上运行,而后台和低 QoS 线程可以在效率核心上进行调度以节省电量。 Apple 可能会利用线程 QoS 类(已在早期的 macOS/iOS 中引入)将线程映射到适当的核心类型 – 这是 Mach 调度概念到非对称多处理新领域的扩展。
Apple Silicon 的另一个方面是统一内存架构(CPU/GPU 之间的共享内存)。 虽然在很大程度上由框架抽象,但是内核的内存管理器与 GPU 驱动程序(现在是 Apple 自己的,通过 I/O Kit 集成)一起工作,以管理缓冲区共享,而无需昂贵的副本。 Mach VM 抽象非常适合此处 – 内存对象可以在用户空间和 GPU 之间共享,并进行 VM 重新映射,而不是复制。 此外,Apple Silicon 带来了诸如 指针身份验证 (PAC) 和 内存标记扩展 (MTE) 之类的硬件功能以提高安全性。 XNU 的 ARM64 后端必须支持 PAC(它通过在异常帧和系统指针中使用 PAC 密钥来缓解 ROP1 攻击)以及潜在的 MTE 以检测内存错误 – 这些都是内核中与架构相关的深度增强,旨在提高新硬件的安全性。
在虚拟化方面,Apple Silicon 促使重新评估了虚拟化策略。 在 Intel Mac 上,XNU 长期以来一直通过 Hypervisor framework(在 macOS 10.10 Yosemite 中引入)支持虚拟化,该框架允许用户空间程序使用硬件 VT-x 支持运行 VM。 对于 Apple Silicon,macOS 11 引入了一个新的 Virtualization framework,该框架构建在内核中的 ARM64 管理程序之上(利用 ARM VMM 功能)。 值得注意的是,虽然 开源 XNU 代码不包含 Apple Silicon 管理程序,但是已交付的内核确实会在适当的 Apple 芯片上运行时初始化管理程序支持。 这使 M1/M2 上的 macOS 可以完全从用户空间控制器运行轻量级虚拟机(适用于 Linux、macOS 访客等),类似于 Linux KVM。 在 iOS 设备上,Apple 已禁用或限制了管理程序(没有公共 API),但是硬件功能出现在 A14 芯片上。 爱好者们很快发现,在越狱的 A14 设备上,可以启用管理程序来运行 Linux VM2。
除了 CPU 和虚拟化之外,Apple Silicon Mac 运行的许多守护程序和服务与 iOS 相同,这表明系统架构趋于融合。 XNU kernel 现在为从服务器 (macOS)、个人计算机、手机、手表、电视,甚至 bridgeOS(在 Apple T2/M1 辅助处理器上运行的 Darwin 变体,用于设备管理)的所有设备供电。 Darwin 的 灵活性和可伸缩性 源于 Mach 基础:它在一个平台层中抽象了硬件细节,因此,添加新的 CPU 架构 (PowerPC → x86 → ARM64) 或缩小到有限的硬件,在很大程度上需要实现 Mach 低级接口(如 pmap(用于 MMU)、线程上下文切换等),并保持更高级别的内核逻辑不变。 这种设计在 Apple 的转型中获得了回报。
总之,在过去的二十年中,XNU 经历了重大的转变,同时保留了其核心身份。 表 1 突出显示了 Darwin/XNU 里程碑和架构变更的时间表:
年份|版本(Darwin 版本)|关键内核开发 ---|---|--- 1989|NeXTSTEP 1.0 (Mach 2.5 + 4.3BSD)|NeXT 的 XNU kernel 混合内核已推出:Mach 微内核,BSD 位于内核空间中以提高性能。通过 Obj-C DriverKit 驱动程序。 1996|Apple 收购 NeXT|基于 OpenStep 的 Rhapsody OS 开发开始。 Mach 2.5 + 4.3BSD XNU 将使用 Mach 3 和 FreeBSD 进行升级。 1999|Mac OS X Server 1.0 (Darwin 0.x)|随着 Apple 将 OSFMK Mach 3.0 (OSF/1) 和 FreeBSD 集成到 XNU 中,第一个 Darwin 版本 (0.1–0.3) 已发布。 2001|Mac OS X 10.0 (Darwin 1.3)|Darwin 1.x:核心 OS X 使用混合内核、BSD 用户区、Cocoa API 启动。 Mach/BSD 集成的早期性能调整。 2003|Mac OS X 10.3 (Darwin 7)|XNU 与 FreeBSD 5 同步,从而提高了 SMP 可扩展性(细粒度锁定)。 2005|Mac OS X 10.4 (Darwin 8)|UNIX 03 认证的内核。已准备好 Intel x86 支持(利用了 Mach 可移植性层)。 2006|Intel 上的 Mac OS X (Darwin 8.x)|Apple 将 Mac 转换为 x86。 XNU 支持 Universal Binary 驱动程序和 Rosetta 转换(在 x86 上用户空间模拟 PowerPC)。 2007|Mac OS X 10.5 (Darwin 9)|内核中的 64 位支持(在 x86_64 上);最后一次 PowerPC 支持。 安全性:已引入 NX 支持、ASLR、代码签名、sandbox。在 ARM 上发布的 iPhone OS 1 (Darwin 9),其中 XNU 已缩放到移动设备(没有交换空间,sandbox 始终处于启用状态)。 2009|Mac OS X 10.6 (Darwin 10)|仅限 Intel(删除了 PowerPC)。在功能强大的 Mac 上完全支持 64 位内核;Grand Central Dispatch(内核任务队列);OpenCL 支持。 iPhone OS -> iOS 3 (Darwin 10) 增加了改进的电源管理。 2011|Mac OS X 10.7 (Darwin 11)|删除了 Mac 上的 32 位内核支持;需要 x86_64。扩展了沙盒、FileVault 2 加密(内核加密)。 iOS 5 带来了双核调度。 2013|OS X 10.9 (Darwin 13)|电源优化:压缩内存,内核中的计时器合并。 改进了具有 QoS 引入的多核调度。 2015|OS X 10.11 (Darwin 15)|System Integrity Protection(内核强制执行的安全性)。增强的 AMFI(Apple 移动文件完整性),用于内核和用户 Helper (amfid) 中的代码签名。在新的设备类别中,iOS 9 / watchOS 首次亮相 (Darwin 15),内核在 Apple Watch (ARM Cortex-A7) 上运行。 2017|macOS 10.13 (Darwin 17)|Mac 上新的 APFS 文件系统默认值(已在 iOS 10 中)。用于克隆、快照的内核更改。 Kext 加载需要用户批准。 iOS 11 删除了 32 位 ARM,完全支持 64 位内核。 2019|macOS 10.15 (Darwin 19)|旧版 I/O Kit 模型已转变:已为用户空间驱动程序引入了 DriverKit。 系统扩展模块化了内核中的网络和端点安全功能。 macOS 已拆分了系统卷(只读),以加强内核对 OS 文件的保护。 2020|macOS 11.0 (Darwin 20)|Apple Silicon 支持 – ARM64 Mac (M1) 上的 XNU。 内核适应了异构核心、统一的内存。 Rosetta 2 转换层(用户空间 JIT,其中内核强制执行对已转换代码的内存保护)。 iOS 14 – 为开发人员公开了新的虚拟化功能(例如,在 iPadOS 上运行轻量级 VM)。 2022|macOS 13 (Darwin 22)|继续改进 Apple Silicon(例如,M1 Max 上的高功率模式、内核调度调整)。 iOS 16 – XNU 增加了对虚拟化 iOS/macOS 访客的支持(在 Xcode Simulator 和开发人员模式功能中使用)。 2024|macOS 14 (Darwin 23)|正在进行的改进(内存标记支持以及针对 M2/M3 芯片的微调)。 Darwin 仍然是 visionOS(Apple Vision Pro AR 耳机)的通用核心。
表 1: 具有选定内核里程碑和架构更改的 Darwin/XNU 演变时间表。
此时间表显示了 XNU 的 Mach/BSD 核心如何被证明是一个稳定的基础,Apple 可以在其上逐步增强:添加 64 位支持、采用多核、加强安全性以及移植到新的体系结构,同时保留向后兼容性。 接下来,我们深入研究 XNU 的内部架构 – 使这一切成为可能的混合内核设计。
XNU Kernel Architecture and Design
文件:Mac OS X architecture.svg 的图表。 (2024, 12 月 29 日)。 维基共享资源。 从 https://commons.wikimedia.org 获取于 2025 年 4 月 3 日 22:59。