XNU
XNU是一个由苹果电脑开发用于macOS操作系统的操作系统内核。它是Darwin操作系统的一部分,跟随着Darwin一同作为自由及开放源代码软件被发布。它还是iOS、tvOS和watchOS操作系统的内核。XNU是X is Not Unix的缩写[3]。
开发者 | 蘋果公司 |
---|---|
编程语言 | C, C++ |
作業系統家族 | 类Unix |
運作狀態 | 开发中 |
源码模式 | 開放原始碼 |
首次发布 | 1996年12月 |
当前版本 | |
支持的语言 | 英文, 其他 |
支援平台 | IA-32, x86-64, ARM |
内核类别 | 混合 |
许可证 | 苹果公共源代码许可证 2.0 |
官方網站 | opensource |
仓库 |
XNU最早是NeXT公司为了NeXTSTEP操作系统而发展的。它是一种混合式核心(Hybrid kernel),结合了由卡内基美隆大学发展的Mach 2.5版,4.3BSD,与称为Driver Kit的面向对象程序设计应用程序界面。
在苹果电脑收购NeXT公司之后,XNU的Mach微内核被升级到Mach 3.0,BSD的部分升级至FreeBSD,Driver Kit则改成I/O Kit,一套以C++撰写的应用程序界面。
内核设计
XNU是一个混合内核,将宏内核与微内核两者的特性兼收并蓄,以期同时拥有两种内核的优点————比如在微内核中提高操作系统模块化程度以及让操作系统更多的部分接受内存保护的消息传递机制,和宏内核在高负荷下表现的高性能。
到2007年为止,XNU支持单核和具有对称多处理的ARM[4],IA-32和x86-64处理器。在第10版(即Mac OS X 10.6)之后,不再支持PowerPC。
Mach
XNU内核以一个被深度定制的Mach3.0内核作为基础。如此这般,它便可以把操作系统的核心部分作为独立的进程运行,由此带来极大的灵活性(Mach核心之上可平行运行多个操作系统)。但是因为内核态/用户态的上下文切换会额外消耗时间,同时内核与服务进程之间的消息传递也会降低运行效率,所以这种设计通常会降低性能。为了提高效率,在 Mac OS X 中BSD部分与Mach一起内建于核心部分。深度定制的「混合」Mach3.0内核与传统BSD内核融合一体的产物就是一个「混合」内核,同时具有两者的优点与缺点。
BSD
内核的伯克利软件套件(BSD)部分提供了POSIX应用程序接口(BSD系统称为API):基于Mach的任务之上的Unix进程模型,基本安全策略,用户和用户组,权限,网络协议栈,虚拟文件系统(包括一个文件系统无关的日志层),几个本地文件系统(例如HFS/HFS+),网络文件系统(NFS)客户端与服务器,加密框架,UNIX System V进程间通信(IPC),审计机制,强制访问控制,和一些锁原语[5]。XNU中的BSD代码来自FreeBSD内核。尽管其中相当一部分代码都被深度修改过,苹果和FreeBSD项目之间依然会交换代码[6]。
K32/K64
XNU在Mac OS X 10.6 Snow Leopard(Darwin版本号10)及之后演化为两个分支,称为K32的32位版和称为K64的64位版[7]。K32可以在用户态运行64位应用。Mac OS X 10.6 的新特性是在64位用户空间运行XNU。在除2008年及之后的Mac Pro和Xserve外的所有设备上,K32是10.6 Server系统的默认内核,并且可以运行64位应用[8]。K64相比K32有如下几点优势[9]:
- 可以管理超过32GB的内存,内存地址空间相比32位内核有巨大增长。
- 缓存容量可以超过32位内核空间的限制,潜在提升I/O性能。
- 当使用高性能网络设备或多个GPU时性能会提升,因为即使在直接存储器访问DMA缓存很大的情况下内核也可以把所有设备映射在64位地址空间中。
在支持64位内核的机器启动时按下6和4按键会使机器使用K64启动。K64可以运行32位应用,但不会运行32位的内核模块,所以这些内核模块需要移植到K64才能被加载。
I/O Kit
I/O Kit 是一个设备驱动框架,用基于Embedded C++的C++子集编写[10]。借助它的面向对象设计,框架提供每种设备驱动需要的常见特性,以使驱动程序可以用更少的时间和代码完成。I/O Kit 具有多线程设计,对称多处理安全,支持热拔插设备和自动动态配置设备等特性。 很多设备驱动可以编写运行于用户态,进一步提升了系统的稳定性。如果用户态的驱动崩溃,内核不会因此崩溃。但是,内核态的驱动崩溃会导致内核崩溃。磁盘适配器和网络适配器驱动、显卡驱动、USB驱动和火线控制器驱动以及虚拟机软件如VirtualBox,Parallels Desktop for Mac和VMware Fusion等的驱动都是典型的内核态驱动。
共享资源保护
为了在多核设备上安全运行,对共享资源(文件、数据结构等) 的访问必须被序列化,这样线程和进程就无法在同一时间修改同一资源。原子操作、自旋锁、临界区块、互斥锁("mutexes")和序列化标记(serializing tokens)都可以实现防止访问冲突发生。从Mac OS X 10.4与Darwin8.0开始,XNU如较新版本的Linux与FreeBSD一样使用一种折中的互斥模型来获得在多处理器系统上的高性能表现。
参考资料
- . 2007年10月30日 [2023年6月22日].
- . 2023年6月14日 [2023年7月30日].
- . Apple Computer. 2005 [March 27, 2009]. (原始内容存档于2012年8月13日).
- iPhone processor found: 620MHz ARM CPU (页面存档备份,存于) (July 1, 2007) Retrieved January 6, 2008
- Watson, Robert. . freebsd-advocacy (邮件列表). August 2, 2008 [October 24, 2013]. (原始内容存档于2021-02-25).
- . April 2009 [October 24, 2013]. (原始内容存档于2009-10-14).
- . [2017-04-08]. (原始内容存档于2012-08-13).
- . [2017-04-08]. (原始内容存档于2010-12-05).
- . [2017-04-08]. (原始内容存档于2009-12-08).
- . [2017-04-08]. (原始内容存档于2019-04-19).
外部链接
- http://opensource.apple.com/source/xnu/ (页面存档备份,存于)
- Unofficial mirror of XNU at GitHub (页面存档备份,存于)
- XNU: The Kernel (页面存档备份,存于) – Amit Singh 于 2003年12月写的对XNU结构组成的概述
- Inside the Mac OS X Kernel (页面存档备份,存于) – "This talk intends to clear up the confusion by presenting details of the Mac OS X kernel(这次演讲旨在通过深入介绍Mac OS X 内核来澄清误解)"