macOS 最为 iOS 开发的钦定操作体系,且 iOS 自身便是通过它衍生出来的,所以咱们跟它之间会经常打交道。为了验证你对它的熟悉程度,看下能否答复这几个问题:

  • 咱们在说 MacOS 时一般会带上「X」,将其叫做 MacOS X 或许 OS X,这是为什么呢?「X」 有什么意义?
  • Darwin、XNU、Mach、BSD 分别代表什么,之间又有什么联系?
  • Mac OS 与 Unix 是什么联系?
  • Apple 开源了 Darwin,对应的开源社区为什么开展不起来?

本篇文章致力于协助解答这些问题,也会顺路讲些 Apple 相关的布景小故事。

文章内容首要参考《Mac OS X And iOS Internals》(中译本叫《深化解析Mac OS & iOS》)和 《*OS Internal Volume I — User Mode》,作者都是 Jonathan Levin。前者完书于 2012年,后者第二版别完书于 2019 年,后者不仅是前者的完善版别,仍是一个全新版别,很多图文都进行了重写。跟着时刻的推动,后者对最新的技能有了更多讨论。

macOS 进化史

MacOS 开展布景

布景

MacOS 的前期版别叫做 Mac OS Classic,它诞生于苹果,具有伟大的 GUI 却是一个相对粗糙且很不老练的操作体系。

在这期间苹果创始人乔布斯脱离苹果创办了 NeXT,NeXT 公司生产 NeXT 计算机和NeXTstation,它们运转在叫做 NeXTSTEP 的操作体系之上。NeXTSTEP 有这些比较前卫的特性:

  • 选用 Mach 微内核
  • 运用 Objective-C 作为开发言语
  • 面向对象思维贯穿整个操作体系
  • 设备驱动开发是一个面向对象的框架,叫做 DriverKit

MacOS X 诞生

后来乔布斯回归苹果,也将 NeXTSTEP 带回了苹果。于是自可是然的,Mac OS Classic 和 NeXTSTEP 两个十分小众的操作体系进行了交融。他们一个具有伟大的 GUI 但规划糟糕,一个规划很棒但 GUI 平平,交融之后起到了 1+1 大于 2 的作用,诞生了一个流行的多的操作体系,这便是 MacOS X。「X」的意义是罗马数字 「10」,对应了此刻 MacOS 的版别号 10.x,这个版别之后又开展了很长时刻。

MacOS X 此刻的几个中心组件:Cocoa、Mach、IOKit、Xcode 的 Interface Builder 都来自于 NeXTSTEP。这个操作体系的内核便是 Darwin(中译为达尔文)。

Darwin 是开源的,以它为中心诞生了 iOS、tvOS、watchOS、BridgeOS(用于 Macbook Touch Bar 的 OS) 等一系列变体操作体系。有一个命令能够查看体系所运用的 Darwin 版别信息:uname。

$ uname -v
Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:54 PST 2021; root:xnu-8019.61.5~1/RELEASE_X86_64

Darwin 和 Darwin 变体的一系列 OS 版别是同步更新的。它们之间的版别遵循这个联系:

Darwinver = 10.(MacOSVer + 4) = (iOSVer + 6) = (TvOSVer + 6) = (WatchOSVer + 13)

后来 MacOS 的主版别号从 10 升级为 11,上面 MacOS 的版别对应联系发生了一些变化。到了这儿有必要再理一遍 MacOS 的称号变化状况,的确很少有人能准确的称号它,由于它的命名发生过不少变化。

时刻段 MacOS 称号 说明
创立 ~ 2001 年 MachOS Classic 古典 MacOS
2001年 ~ 2011 年 Mach OS X NeXTSTEP 与 MacOS Classic 兼并之后的版别
2012 年 ~ 2015 年 OS X 这是最终一个以猫科动物命名的 OS 版别,此后开端以加州地标命名
2016 年至今 macOS 便于与iOS、tvOS、watchOS 命名一致

为了便于混乱,从这开端的下文在讲到 MacOS 统称时均以 macOS 代替。

Darwin 操作体系的演化前史。

macOS 进化史

图片来自(*OS Volume 1)

结合上面图片能够再讲一个 iOS 的小故事,iOS1.x 版别开端的代号是 Alpine,这是 i 系列设备的默许 root 暗码。但最终发布的版别代号是 Heavenly,由于这个版别的操作体系具有完好的调试符号、未加密还简单反汇编,许多越狱者都依靠从这个版别中提取的符号和函数调用联系寻找破解创意,从越狱者角度来看的确如天堂般夸姣。

Darwin 的内部组成

Darwin 是一个类 UNIX 的操作体系中心,它的组成能够近似看做:Darwin = kernel + XNU + 运转时。macOS 从Leopard(10.5) 开端现已是一个通过认证的 UNIX 完成。

XNU 是一个占据关键作用的 Darwin 中心,XNU = Mach + BSD + libkern + I/OKit。

初版的 XNU 是 NeXTSTEP 的中心,它包含 Mach 2.5 版别和 4.3 版别的 BSD。NeXTSTEP 合入苹果后,Mach被升级为 3.0,BSD 升级为 FreeBSD。

Mach 和 BSD 一个是微内核(Microkernel)一个是宏内核(Monolithic Kernel),所以 XNU 是一个混合架构(Hybrid kernel)。了解这几种内核的关键是需求留意内核形式和用户形式占据的范围。

macOS 进化史

Mach

Mach(微内核)由卡耐基梅隆大学开发,它的方针是替代 BSD 的 UNIX 中心。这个微内核仅能处理最基本的操作体系责任:

  • 进程和线程抽象
  • 虚拟内存办理
  • 任务调度
  • 进程间通信和音讯传递机制

由上图能够看出微内核的功用原本就少,其他 OS 功用是作为基础服务建设在用户形式下的。由于这个特性其内部任务的调用会有更频频的内核态/用户态上下文切换,这会额定消耗时刻。一起内核与服务进程之间的音讯传递也会下降运转功率,所以这种规划一般会下降功用。

但它也有长处,便是服务进程简单扩展,服务进程出问题不会危及到 kernel 。得益于这种扩展性 MachO 能支撑多架构文件,以此为基础 macOS 能顺利的从 PowerPC 过渡到 Intel 再到 M1。

BSD

BSD(宏内核),它是 Berkeley Software Distribution (伯克利软件包)的缩写,这是一个派生自 Unix 的操作体系。BSD 是作为完善 Mach 的一个存在,它建立在 Mach 之上,并提供了一层更可靠更现代的 API。它首要包含这些:

  • UNIX 进程模型
  • POSIX 线程模型
  • UNIX 用户和组
  • 网络协议栈(BSD Socket API)

宏内核的特点是用户服务和内核服务都运转在同一内存空间,这还有效下降了内核态/用户态之间的频频切换,履行功率会更高。可是宏内核也并非没有缺点,便是扩展性较差,另外如果内核有一个服务溃散,整个操作体系就会溃散。

Darwin 架构

已然没有完美的内核形式,于是苹果就将两者混合,它一起兼顾微内核和宏内核各自的长处,这便是 Darwin了。

macOS 进化史

图片来自(Mac OS X And iOS Internals)

这儿没有表示出 XNU,它的鸿沟能够看做是 Kernel/User Transition 这儿,其下包含 BSD 和 Mach 的层级便是 XNU。在 macOS 的体系里,Darwin 之上的层次基本都是不开源的,他们是 Apple 的私有财产。

XNU 中还有另外两种重要组件:

  • libkern:这是一个内建的 C++ 库,用于支撑 C++ 运转时。有了它内核的许多高级功用都能够运用 C++ 编写。
  • I/OKit:这是一个设备驱动框架,凭仗 libkern 提供的底层支撑,驱动程序能够运用 C++ 完成。借助于 C++ 的面向对象特性,外部在创立驱动程序时会节约许多成本。

Darwin 的开源之路

已然 Darwin 开源了,那为什么没有呈现非 Apple 系的 Darwin 发行版操作体系呢?虽说开源,但 XNU 首要依靠的 Mach 和 BSD 原本便是开源的;Apple 还把对 ARMv7/8 的支撑独自闭源;原原本源的 launchd,在 Mac OS 10.10 的版别之后也变成闭源项目合入到 libxpc 项目里了。这还不算,Darwin 的开源版别并没有剥离洁净,里面还包含了一些 Apple 的私有 API,导致其并不能完好编译,还需求做一些额定改造。

环绕 Darwin 有两个重要的开源版别,OpenDarwin 和 PureDarwin ,能够看下他们当前的开展状况。

OpenDarwin

它由 Apple 牵头于 2002 年 4 月建立,其方针是加强苹果开发人员与自由软件社区之间的协作且将 Darwin 开展出另一独立版别。理想状况是苹果能够将 OpenDarwin 中的改善应用到 Darwin 中,而开源规划又能够彻底控制该体系,将其用于 GNU-Darwin 等自由软件的发行版中。可是仅仅过了 4 年,OpenDarwin 就宣布关闭。以下是 OpenDarwin 项目组的陈说:

Over the past few years, OpenDarwin has become a mere hosting facility for Mac OS X related projects. The original notions of developing the Mac OS X and Darwin sources has not panned out. Availability of sources, interaction with Apple representatives, difficulty building and tracking sources, and a lack of interest from the community have all contributed to this. Administering a system to host other people’s projects is not what the remaining OpenDarwin contributors had signed up for and have been doing this thankless task far longer than they expected. It is time for OpenDarwin to go dark.

首要因素有两个:

  • 苹果的 macOS X 对 OpenDarwin 掌控过强,未推动 OpenDarwin 的独立开展
  • 开源社区的爱好减淡。也能够说是前者导致了后者

现在 OpenDarwin 的官网 opendarwin.org/ 仅剩一行字:Opendarwin memorial page。

PureDarwin

PureDarwin 一般被认为是 OpenDarwin 的继承者。它的代码保管在 Github上,且仍在保护。Pure 的意义是更纯净,PureDarwin 仅运用苹果为 Darwin 发布的组件而不必 macOS 的其他组件。它的方针是通过提供文档,使开放源码爱好者和开发人员能够检索、了解、修正、构建和分发 Darwin,从而使Darwin 更易于运用。

由于缺少官方的支撑,它当前在 Github 上的 star 数仅有 1.7k,由此可见它的重视度和开展都不算太好。可是当有人问为什么要花费时刻保护 PureDarwin 时,他们的答案是:

For learning and for fun.

简略却让人振作,与此一起还有那么一丝丝凄凉。

所以回归上面的问题为什么开源的 Darwin 没有开展起来,由于它是为 macOS 创立的操作体系,它依靠于 macOS 的特性,也依靠于 Apple 的支撑,脱离这两者尝试走「 Pure」Darwin 开源路线是十分困难的。

Hackintosh

OpenDarwin 和 PureDarwin 的开展仍带来了一些有利的事情,其根据开源的 Darwin 制作成一个能够完好引导并且安装的 ISO 镜像。之后 OSX86(一个致力于把苹果电脑出品的 macOS 操作体系移植到非苹果电脑上的计划)项目在此基础上持续发扬光大,尽力将 macOS 完好移植到 PC、笔记本等设备,该行为被称为 Hackintosh,也叫黑苹果。

一般的黑苹果计划是借助于引导程序完成的,由于它不会修正 macOS 源文件,被称为最佳的合法途径。苹果从前开源过 Boot-132,一个用于加载 XNU 内核的引导程序。Voodoo 团队根据该程序开发出 Chameleon(变色龙)引导程序,再后来 Clover 呈现,能够让不支撑 EFI 的电脑进入模拟的 EFI 环境。现在又有了 OpenCore,它在配置文件时比较复杂,但因其遭到较多 kexts 作者的兼容和自身的易用性而得到适当数目运用者的追捧。

关于合规的问题,虽然引导的方式没有修正 macOS 的源码,但苹果的最终用户许可证协议(EULA)里并不允许将 macOS 安装在一台没有苹果商标的硬体上。苹果曾申述并多起黑苹果相关的商业行为并获得胜诉,关于非盈利的个人 Hackintosh 行为,苹果并没有过多答理。

吉祥物的故事

人们热衷于为受欢迎的操作体系或许框架设置吉祥物,Linux 的吉祥物是一只企鹅(名叫 Tux,Torvalds UniX的缩写)、安卓的吉祥物是一只绿色小机器人(无正式称号,被开发人员称为 Bugdroid)。再看下跟 macOS 相关的两个操作体系的吉祥物。

BSD

BSD 的吉祥物是一只小恶魔,叫做 Beastie,它的发音跟 BSD 很像。它一般带支三叉戟,代表行程的分岔。

macOS 进化史

Darwin

Darwin 的吉祥物是 Hexley,它是一个卡通的鸭嘴兽,戴着 BSD 小恶魔的帽子,也拿着三叉戟。Hexley 是由 Jon Hooper 所规划的,版权也为他一切。但 Hexley 并不附归于 苹果电脑。原本这个吉祥物的称号应该是 Huxley,源由是捍卫达尔文(Darwin)进化理论的英国生物学家 Thomas Henry Huxley,而原先提议的人误以为是达尔文的助理,并错用了 Hexley。而发现错误时,要改名现已太晚,因而沿用了 Hexley 这个称号。

这个形象并不归于 Apple,而归于开源社区,所以开源版别的 Darwin 均有该图案的展现。

macOS 进化史

「*OS Internal 三部曲」的书本封面便是用的 Hexley 形象。

未来展望

关于 macOS 未来的展望这部分内容摘自《Mac OS X And iOS Internals》(留意其完成时刻是 2012 年),站在 10 年后的今日咱们能够再去看下这几个预测的完成状况。

铲除 Mach

内核中的 Mach API 是 NeXTSTEP 时代的产品,运转速度慢,履行功率上很难赶得上 BSD。而且 XNU 自身更趋向于宏内核架构,如果移除 Mach 将内核建设为完好的 BSD,将会有很大收益,但这的确需求巨大的工作量。

该主意并没有达成,且 Apple 根本没有这么做的计划,混合内核并没有看上去那么遭,Mach 将在很长一段时刻持续存在着。

兼容 ELF 格局

macOS 无法融入 UN*X 的国际最大的一个困难便是坚持运用 Mach-O 二进制格局。当然这个主意也需求依靠上一步的铲除 Mach,这样 Linux、BSD 中的程序就能够不经修正直接迁移到 macOS 上了。

这是很夸姣的想象,考虑 Apple 对 Hackintosh 的镇压,其商业战略是独占、彻底掌控而非扩展市场占有率。

运用 ZFS

macOS 前期运用的文件体系是 HFS+,但该文件体系遭受过很多批判 Linus 曾这样评价 HFS+:

Quite frankly, HFS+ is probably the worst filesystem ever. Christ what shit it is.

HFS+ 的确有许多不完善的当地,它大小写不灵敏、不支撑对数据内容进行 checksum 校验、timestamp 只支撑到秒级。彼时 Sun 公司开发出 ZFS,号称是「世界无敌最强」文件体系,有风闻 Apple 将运用这一文件体系,但后来 Sun 被 Oracle 收买,这一主意最终无法完成。

2017 年, 伴跟着 Mac OS High Sierra 版别,Apple 正式发布了 Apple File System(APFS)。该文件体系是 Apple 从零开发的,耗时三年,关于完好的文件体系来说,这个功率现已十分高了。其支撑更多的功用,且宣称针对 SSD 做了许多优化。但让人遗憾的是 APFS 在多个方面的功用还没有超越 HFS+。

和 iOS 兼并

在 macOS 和 iOS 的开展过程中,有不少功用都是在一个渠道老练之后移植到另一个渠道上的。即使在 M1 芯片呈现之前,这一主意也是有或许的,Apple 在很早之前就完成过硬件架构翻译机制 — Rosetta。

当 M1 芯片发布之后,macOS 和 iOS 都现已能够运转在 arm64 架构的芯片上了,这个主意似乎顺从其美要完成了。但现实并非如此,相关于一致,Apple 更想要的是各司其职,每个产品线 macOS、iPadOS、iOS 都有其各自适用的场景,Apple 也极力往这方面宣扬,这有助于产品的销售。

总结

再次列出开头提到的几个问题便于大家回顾这篇文章的内容:

1、咱们在说 MacOS 时一般会带上「X」,将其叫做 MacOS X 或许 OS X,这是为什么呢?「X」 有什么意义?

2、Darwin、XNU、Mach、BSD 分别代表什么,之间又有什么联系?

3、Mac OS 与 Unix 是什么联系?

4、Apple 开源了 Darwin,对应的开源社区为什么开展不起来?