苹果内核架构

官方文档地址

OS X简介

OS X为Macintosh用户和开发人员社区提供了许多好处。这些优点包括改进的可靠性和性能、增强的网络特性、基于对象的系统编程接口以及对行业标准的更多支持。

在创建OS X的过程中,苹果彻底改造了Mac OS核心操作系统。形成OS X的基础是内核。下图说明了OS X体系结构。

osxlayers

内核为OS x提供了许多增强功能,包括抢占、内存保护、增强的性能、改进的网络设施、对Macintosh(扩展版和标准版)和非Macintosh (UFS、ISO 9660等等)文件系统的支持、面向对象的api等等。其中两个特性,抢占和内存保护,导致了更健壮的环境。

在Mac OS 9中,应用程序协作共享处理器时间。类似地,所有应用程序之间共享计算机的内存。Mac OS 9是一个协作的多任务环境。如果一个应用程序不合作,那么所有进程的响应性都会受到影响。另一方面,实时应用程序(如多媒体)需要保证具有可预测的、时间关键的行为。

相比之下,OS X是一个先发制人的多任务环境。在OS X中,内核提供了强制合作,调度进程来共享时间(抢占)。这支持需要实时行为的应用程序。

在OS X中,进程通常不共享内存。相反,内核为每个进程分配自己的地址空间,控制对这些地址空间的访问。此控件确保任何应用程序都不能无意中访问或修改另一个应用程序的内存(保护)。规模不是问题;由于OS X包含了虚拟内存系统,每个应用程序都可以访问自己的4 GB地址空间。

从整体上看,所有应用程序都在用户空间中运行,但这并不意味着它们共享内存。用户空间只是所有用户级应用程序的组合地址空间的术语。内核本身有它自己的地址空间,称为内核空间。在OS X中,没有应用程序可以直接修改系统软件(内核)的内存。

虽然默认情况下用户进程不像Mac OS 9那样共享内存,但应用程序之间的通信(甚至内存共享)仍然是可能的。例如,内核提供了一组丰富的原语,允许进程之间共享一些信息。这些基本类型包括共享库、框架和POSIX共享内存。Mach消息传递提供了另一种方法,将内存从一个进程传递到另一个进程。然而,与Mac OS 9不同的是,如果没有程序员的显式操作,内存共享就无法实现。

达尔文操作系统

OS X内核是一个开源项目。内核以及OS X的其他核心部分统称为Darwin。Darwin是一个完整的操作系统,基于与OS x相同的许多技术。但是,Darwin不包括Apple专有的图形或应用程序层,比如Quartz、QuickTime、Cocoa、Carbon或OpenGL。

下图显示了Darwin和OS X之间的关系,它们都构建在相同的内核之上,但是OS X添加了核心服务、应用程序服务和QuickTime,以及经典的Carbon、Cocoa和Java (JDK)应用程序环境。Darwin和OS X都包含BSD命令行应用程序环境;然而,在OS X中,不需要使用环境,因此它对用户是隐藏的,除非用户选择访问它。

darwinlayers

Darwin技术基于BSD、Mach 3.0和苹果技术。最重要的是,Darwin技术是开源技术,这意味着开发人员可以完全访问源代码。实际上,OS X第三方开发人员可以成为Darwin核心系统软件开发团队的一部分。开发人员还可以看到苹果在核心操作系统中是如何工作的,并在自己的产品中采用(或调整)代码。有关详细信息,请参阅Apple公共源许可证(APSL)。

因为相同的软件构成了OS X和Darwin的核心,所以开发人员可以创建在OS X和Darwin上运行的底层软件,而几乎不需要进行任何更改。唯一的区别可能是软件与应用程序环境的交互方式。

达尔文是基于许多来源的成熟技术。这项技术的很大一部分来自FreeBSD,这是4.4BSD的一个版本,提供了先进的网络、性能、安全和兼容性特性。该系统软件的其他部分,如Mach,基于苹果MkLinux项目、OS X服务器以及NeXT收购的技术。大部分代码与平台无关。所有核心操作系统代码都以源代码的形式提供。

选择核心技术有几个原因。Mach提供了一组干净的抽象,用于处理内存管理、进程间(和处理器间)通信(IPC)和其他低级操作系统功能。在当今快速变化的硬件环境中,这在操作系统和底层硬件之间提供了一个有用的隔离层。

BSD是一个精心设计的成熟操作系统,具有许多功能。事实上,当今大多数商业UNIX和类UNIX操作系统都包含大量BSD代码。BSD还提供了一组行业标准api。

新技术,如I/O工具包和网络内核扩展(NKEs),都是由苹果公司设计和设计的,以利用先进的功能,如面向对象编程模型提供的功能。OS X将这些新技术与经过时间检验的行业标准结合起来,创建了一个稳定、可靠、灵活和可扩展的操作系统。

系统架构

Darwin和OS X的基础层由几个体系结构组件组成,如下图所示。这些组件合在一起构成内核环境。

osxarchitecture

重要提示:注意OS X使用术语内核的方式与您可能期望的有所不同。

在传统的操作系统术语中,内核是一个很小的软件核心,它只提供实现附加操作系统服务所需的最小设施。——摘自《4.4 BSD操作系统的设计与实现》,McKusick, Bostic, Karels和Quarterman, 1996。

类似地,在传统的基于Mach的操作系统中,内核指的是Mach微内核,忽略了额外的底层代码,没有这些底层代码,Mach几乎做不了什么。

然而,在OS X中,内核环境包含的内容比Mach内核本身多得多。OS X内核环境包括Mach内核、BSD、I/O工具包、文件系统和网络组件。这些通常统称为内核。下面几节将简要描述这些组件。有关进一步的详细信息,请参阅具体的组成部分章节或参考书目中列出的参考资料。

因为OS X包含三个基本组件(Mach、BSD和I/O工具包),所以对于某些关键操作,常常有多达三个api。一般来说,所选择的API应该与正在使用它的内核部分匹配,而内核部分又由您的代码试图执行的操作决定。本章的其余部分将介绍Mach、BSD和I/O工具包,并概述这些组件提供的功能。

Mach

Mach管理CPU使用情况和内存等处理器资源,处理调度,提供内存保护,并为其他操作系统层提供以消息为中心的基础设施。

参看我的另外一篇Mach概览一章

Mach组件提供

  • 无类型进程间通信(IPC)
  • 远程过程调用(RPC)
  • 对称多处理(SMP)的调度程序支持
  • 对实时服务的支持
  • 虚拟内存支持
  • 支持寻呼机
  • 模块化的体系结构

有关Mach的一般信息可以在Mach概览一章中找到。有关调度的信息可以在Mach调度和线程接口一章中找到。有关VM系统的信息可以在内存和虚拟内存中找到。

BSD

在Mach层之上,BSD层提供“OS personality”api和服务。BSD层基于BSD内核,主要是FreeBSD。BSD组件提供

  • 文件系统
  • 联网(硬件设备级除外)
  • UNIX的安全模型
  • 系统调用的支持
  • BSD过程模型,包括过程id和信号
  • FreeBSD内核api
  • 许多POSIX api
  • 对pthreads (POSIX线程)的内核支持

BSD组件在BSD概述一章中有更详细的描述。

网络

OS X网络利用BSD的高级网络功能来提供对现代特性的支持,比如网络地址转换(NAT)和防火墙。网络组件提供

  • 4.4BSD TCP/IP栈和套接字api
  • 同时支持IP和DDP (AppleTalk传输)
  • multihoming
  • 路由
  • 多播支持
  • 服务器调优
  • 信息包过滤
  • Mac OS经典支持(通过过滤器)

有关网络的更多信息可以在网络体系结构一章中找到。

文件系统

OS X支持多种类型的文件系统,包括HFS、HFS+、UFS、NFS、ISO 9660等。默认的文件系统类型是HFS+;OS X引导(和“根”)来自HFS+、UFS、ISO、NFS和UDF。OS X文件系统的高级功能包括一个增强的虚拟文件系统(VFS)设计。VFS提供了分层的体系结构(文件系统是可堆叠的)。文件系统组件提供

  • utf - 8 (Unicode)支持
  • 与以前版本的Mac OS相比,性能有所提高。

更多信息可以在章节文件系统概述中找到。

I / O设备

I/O工具包为简化驱动程序开发提供了一个框架,支持多种类型的设备。I/O工具包提供了一个面向对象的I/O体系结构,该体系结构在c++的一个受限子集中实现。I/O工具包框架是模块化和可扩展的。I/O工具包组件提供

  • 真正的即插即用
  • 动态设备管理
  • 动态(按需)加载驱动程序
  • 桌面系统和便携式设备的电源管理
  • 多处理器能力

I/O工具包在I/O工具包概述一章中有更详细的描述。

内核扩展

OS X提供了一种内核扩展机制,作为一种允许将代码片段动态加载到内核空间的方法,而不需要重新编译。这些代码通常称为插件plug-ins,或者在OS X内核环境中称为kernel extensionsKEXTs

因为KEXTs同时提供模块化和动态可加载性,所以对于需要访问不导出到用户空间的接口的任何相对自包含的服务,KEXTs都是一个自然的选择。内核环境的许多组件都支持这种扩展机制,尽管它们以不同的方式支持。

例如,一些新的网络特性涉及到使用网络内核扩展(NKEs)。这些将在网络体系结构一章讨论。

动态添加新文件系统实现的能力基于VFS KEXTs, I/O工具包中的设备驱动程序和设备族使用KEXTs实现。对于编写驱动程序或编写代码以支持新的卷格式或网络协议的开发人员来说,KEXTs使开发变得更加容易。在内核扩展概述一章中将更详细地讨论KEXTs。

希望对您有所帮助,您的支持将是我莫大的动力!