Loading AI tools
来自维基百科,自由的百科全书
XNU是一个由苹果电脑开发用于macOS操作系统的操作系统内核。它是Darwin操作系统的一部分,跟随着Darwin一同作为自由及开放源代码软件被发布。它还是iOS、tvOS和watchOS操作系统的内核。XNU是X is Not Unix的缩写[3]。
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。
XNU内核以一个被深度定制的Mach3.0内核作为基础。如此这般,它便可以把操作系统的核心部分作为独立的进程运行,由此带来极大的灵活性(Mach核心之上可平行运行多个操作系统)。但是因为内核态/用户态的上下文切换会额外消耗时间,同时内核与服务进程之间的消息传递也会降低运行效率,所以这种设计通常会降低性能。为了提高效率,在 Mac OS X 中BSD部分与Mach一起内建于核心部分。深度定制的“混合”Mach3.0内核与传统BSD内核聚变一体的产物就是一个“混合”内核,同时具有两者的优点与缺点。
内核的伯克利软件套件(BSD)部分提供了POSIX应用程序接口(BSD系统称为API):基于Mach的任务之上的Unix进程模型,基本安全策略,用户和用户组,权限,网络协议栈,虚拟文件系统(包括一个文件系统无关的日志层),几个本地文件系统(例如HFS/HFS+),网络文件系统(NFS)客户端与服务器,加密框架,UNIX System V进程间通信(IPC),审计机制,强制访问控制,和一些锁原语[5]。XNU中的BSD代码来自FreeBSD内核。尽管其中相当一部分代码都被深度修改过,苹果和FreeBSD项目之间依然会交换代码[6]。
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]:
在支持64位内核的机器启动时按下6和4按键会使机器使用K64启动。K64可以运行32位应用,但不会运行32位的内核模块,所以这些内核模块需要移植到K64才能被加载。
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一样使用一种折中的互斥模型来获得在多处理器系统上的高性能表现。