Mac OS X操作系统结构分析.docx
《Mac OS X操作系统结构分析.docx》由会员分享,可在线阅读,更多相关《Mac OS X操作系统结构分析.docx(24页珍藏版)》请在冰豆网上搜索。
MacOSX操作系统结构分析
MacOSX操作系统结构分析
李俊阳1
(1.武汉理工大学计算机科学与技术学院物联网1203班,湖北省武汉市,430063)
摘要:
MacOSX是苹果公司为Mac电脑开发的专属操作系统的最新版本。
一直以来,MacOSX操作系统以它的快速、干净、安全等特性为公众喜爱。
MacOSX可谓是Unix系操作系统当中最为成功的操作系统之一,那么研究其操作系统结构就成了探寻其快速、干净、安全等特性的必不可少的步骤。
作为Unix系操作系统,MacOSX的核心底层部分和Unix系统类似,但是在应用、框架等方面,MacOSX做了大量的工作来保证在功能愈发强大的同时保护MacOSX的安全。
MacOSX的系统结构由四个层组成,分别是:
内核环境、应用服务层、核心服务层和应用程序环境。
关键词:
MacOSX;操作系统结构;系统架构;苹果操作系统
MacOSX是苹果公司为Mac电脑开发的专属操作系统的最新版本。
一直以来,MacOSX操作系统以它的快速、干净、安全等特性为公众喜爱。
MacOSX可谓是Unix系操作系统当中最为成功的操作系统之一。
目前,苹果公司已经开放了MacOSX的内核系统Darwin的源代码,并公开了一系列的MacOSX系统文档,借助Darwin源代码的分析、苹果公司公开的文档以及Unix系统架构的分析,我们可以总结出一个完整的MacOSX操作系统结构框架。
1MacOSX操作系统简介
MacOSX于1998年首次推出,并从2002年起随Mac电脑发售。
它是一套Unix基础的操作系统,包含两个主要的部份:
核心名为Darwin,是以FreeBSD源代码和Mach微核心为基础,由苹果公司和独立开发者社群协力开发;及一个由苹果电脑开发,名为Aqua之专有版权的图形用户接口。
MacOSX是先进的操作系统。
基于坚如磐石的UNIX基础,设计简单直观,让处处创新的Mac安全易用,高度兼容,出类拔萃。
UNIX之威力,Mac之简单OSX既简单易用且功能强大。
所有的一切-从启动Mac后所看到的桌面,到你日常使用的应用程序,都设计得简约精致。
无论是浏览网络、查看邮件和外地朋友视频聊天,所有事情都简单高效、趣味盎然。
当然,简化复杂任务要求尖端科技,而OSX正拥有这些尖端科技。
它不仅使用基础坚实、久经考验的UNIX系统提供空前的稳定性,还提供超强性能、超炫图形并支持互联网标准。
[2]
2系统架构
MacOSX架构的主要特点是系统软件和接口的分层结构,其中一层依赖于它的下一层。
并且MacOSX需要把不同的一组技术继承到一起(其中某些技术在发展历史上有着很大的差异),并将这套统一整合后的技术建立在一个高级内核环境的基础上。
[1]
而我们分析复杂软件的一种常用方法就是把软件的各个部分分解成不同的“层”。
直观地看来,一层位于另一层之上,最基础的层位于最底端。
这种视图暗示了软件层与层之间的一般接口与依赖关系。
软件中位置越高的层就越接近于实际的应用程序代码,其下又紧紧依赖于其他层的支持,层层累加,高层依赖于低层。
2.1内核环境(CoreOperatingSystem)[3]
内核环境为MacOSX提供基础层。
MacOSX的核心基于Unix操作系统,名为Darwin,主要由Mach和BSD组成。
用户可以通过终端(Terminal)程序来使用Unix的命令。
同时,MacOSX也包括了网络协议栈、网络服务、文件系统和设备驱动程序。
内核环境为开发设备驱动(I/OKit)和可装载内核扩展提供了工具。
内核是操作系统的核心,距有很多最基本的功能,它负责管理系统的进程、内存、设备、驱动程序、文件和网络系统,决定着系统的性能和稳定性。
内核环境由以下几个主要部分构成:
2.1.1系统内核:
XNU
XNU,由苹果电脑发展的操作系统内核,被使用于MacOSX中,XNU是XisNotUnix的缩写。
XNU最早是由NeXT公司为了NeXTSETP操作系统而发展的,采用了一种混合式核心(HybridKernel),结合了Mach、BSD以及I/OKit的面向对象应用程式接口,系统内核以C++撰写。
2.1.2Mach内核
Mach提供了对任务、线程、端口、虚拟地址、内存管理和任务间通信的基本抽象概念和具体实现。
Mach也是操作系统的一部分,用于管理处理器的使用,控制时序安排及强制内存保护。
另外,它为操作系统的其他部分提供了计时服务、同步基本单元和以消息为中心的底层构造。
Mach内核使得任何进程都拥有一般系统中内核才有的权限,从而允许用户进程实现与硬件交互等基本操作。
Mach主要是以以下概念作为基础而研发的:
·“任务”即拥有一组系统资源的对象,允许“线程”在其中执行。
·“线程”是执行的基本单位,拥有一个任务的上下文,并且共享任务中的资源。
·“port”是任务间通讯的一组受保护的消息队列,任务可以对任何port发送或接收数据
·“消息”是某些有类型的数据对象的集合,它们只可以发送至port,而非某特定任务或线程
Mach继承了AccentIPC的理念,基于共享内存的进程间通信机制(IPC)。
除了操作文件,Mach可以操作“任务”,可以使大量的内核代码可以转移到用户空间,使内核变得更小。
在原本的UNIX下,用户进程调用内核只能通过系统调用或陷入(trap)。
用户进程使用一个库安排好数据的位置,然后软件触发一个中断,内核在初始化时会为所有中断设置handler,因此程序触发中断的时候,控制权就转移给了内核,在一些必要的检查之后即可得以进一步操作。
在Mach下这交给了IPC系统,用户进程先向内核申请一个port的访问许可,然后利用IPC机制向这个port发送消息。
IPC消息传递机制的应用为线程和并发提供了很好的支持。
进程之下是多个线程,线程作为IPC机制的单元,Mach得以在消息被处理时控制线程睡眠或唤醒。
这允许系统将进程分布于多个处理器上,消息直接通过共享内存实现。
基本的Mach内核由以下几个部分组成:
2.1.2.1文件系统
从体系结构上看,MacOSX实现了对多文件系统的支持,其中最为重要的文件系统包括有:
MacOSExtended(HFS)、MacOSStandard(HFS)、UFS、ISO9660、NFS和AFP。
MacOSX文件系统中的几乎每个文件都有其适合放置的存储这一类型文件的标准目录区域。
文件系统的层次通常被表现为一个以“根(root)”开始的分层架构,通过使用虚拟文件系统(VFS)底层构造,开发者可以编写内核扩展以增加对其他文件系统的更多支持。
在典型的MacOSX文件系统的根目录中,其包含:
/MacOSX/:
一个特殊的卷,操作系统由它开始启动,系统文件和资源也被安装在其上。
这个卷通常是MacOS扩展格式(HFS+,MacOSExtended)的卷。
/Network/:
作为装载到用户系统上的本地网络的根目录。
/OtherVolumes/:
显示一个或多个被连接的外部设备或不是启动卷的内部设备。
其中可以包括有Zip驱动器、CD-ROM驱动器、被装载的网络服务器以及硬盘和它们的分区等。
2.1.2.2网络
内核环境实现了许多的本地网络协议以及功能。
作为网络内核扩展(NKE),实现了一些MacOSX的网络功能和协议栈。
并且可以在不进行重新编译和重新连接的情况下动态地对内核的网络底层结构进行扩展。
2.1.2.3POSIX
可移植操作系统接口(PortableOperatingSystemInterface,POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称。
POSIX标准意在期望获得源代码级别的软件可移植性。
换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。
2.1.3BSD内核
伯克利软件套件(BerkeleySoftwareDistribution,BSD)可以通过一个二进制兼容层(compatibilitylayer)运行相同架构下其他操作系统上的源程序。
BSD采用单内核,这意味着内核中的设备驱动,在核心态下运行,从而作为操作系统的核心部分。
MacOSX使用的BSD内核是4.4版本,其用于支持Mach的抢占式多任务处理、内存保护、动态内存分配和对称多处理。
在MacOSX中,BSD构成网络和文件系统的基础。
它所提供或支持的一些其他方面的特性,包括:
进程的生成与管理、信号处理、系统启动与关闭、一般输入/输出设备的操作、基本文件的操作,以及对终端和其它设备的处理。
它也能实现用户和组的身份识别技术,以及对文件和其他资源进行访问限制的相关功能。
2.1.4设备驱动程序和I/OKit
在MacOSX中,设备驱动程序由I/OKit生成。
I/OKit是一种提供面向对象编程模型(基于限制性的C++形式)以改善设备驱动程序开发效率的框架。
I/OKit对连接到MacOSX的硬件进行建模,并且抽象出特定范畴内的各种设备的公共功能,从而简化了设备驱动程序开发的过程。
内核环境包括有许多现成的设备驱动程序。
I/OKit的基本目标从一开始就是为了提供和增加MacOSX(特别是内核环境)的内在功能和能力。
作为MacOSX的驱动程序模型,I/OKit支持下面的特性:
·动态和自动的设备配置(即插即用)
·支持很多新型设备,包括图形加速和多媒体设备
·电源管理
·内核的强制内存保护——分离核心级和用户级程序的地址空间
·抢占式多任务
·对称多处理
·对不同类型的设备可以共享的公共功能进行抽象
·增强了的开发体验——新的驱动程序易于书写
2.2应用服务层(GraphicsandMedia)
应用服务包含了那些与图形用户界面有关的系统服务,它们对所有的应用程序环境开放。
应用服务层包括Quartz、QuickDraw、OpenGL和一些基础的系统管理器。
这个环境负责处理屏幕渲染、打印、事件处理、低级别的视窗和指针管理。
并且它也包含了用来实现图形用户界面的库、框架和后台服务器。
2.2.1图形和视窗环境
MacOSX的抢占式应用服务是对图形和视窗环境的一种补充。
从它的本质来说,应用程序必须通过图形用户界面来显示它的视窗,并允许用户来使用它的控件。
图形和视窗环境“无偿”提供给应用程序这些基本能力,以减轻它们在自己的环境中实现这些功能的负担。
除了对屏幕上所显示的视窗进行文本和图像渲染(以及文本和图形打印),该环境也提供了重要的低级别功能,例如:
初始事件路由以及指针管理。
2.2.1.1Quartz2D
Quartz的Quartz2D是一个具有矢量特性的图形库。
它的API允许您通过指定一系列命令和数学程式来生成文本与图像。
这些命令和程式用来在二维空间内绘制线段,几何形状,颜色,阴影,半透明效果和其它图形属性,而您无需为每一个特定像素指定属性。
作为结果,一个几何形状可有效地以一系列路径和属性的方式来定义,而不是以位图的方式来定义。
通过使用矢量,Quartz2D也能使用一种坐标系来作为绘画的参照,比方说这种坐标系是以英寸或厘米为单位的,而不是基于像素栅格。
这种坐标体系很灵活,允许不同的度量标准,并且当它不与任何一个屏幕分辨率绑定时,它具有一定程度的显示独立性。
它还使用了浮点坐标。
优先于QuartzCompositor的合成,Quartz2D把以坐标系来表现的矢量图像信息转化为像素值。
Quartz2DAPI是设备独立的,这意味着,绘画操作的最终目的文件可以是窗口位图,也可以是可移植文档格式(PDF)文件、PostScript文件或其它输出格式。
当使用QuickDraw或其它输入机制来显示PDF文件时,应用程序可以直接或间接地调用Quartz2DAPI
用于Quartz2D的主要输入方式是由QuickDraw和本机CAPI所生成的绘画命令和程式。
(将来,更多的前端API可能会被支持)使用QuickDraw的应用程序可以通过CGContextRef接口来调用Quartz2D,从而获得它的功能。
而QuickDraw使应用程序可以由GrafPort接口来得到CGContextRef。
来自QuickDraw或本机API的命令和程式被即刻转换为所需的输出格式,这些输出格式既可以是屏幕渲染的位图数据、PostScript(PostScript打印机的打印数据格式),也可以是其它类型打印机的光栅数据。
打印预览时,还可以自动发布PDF。
将来,更多的后端转换器可能会被支持,例如:
绘图仪。
正如前一段所提出的,Quartz2D是MacOSX打印系统的底层引擎。
打印工作常常被分成二个步骤。
Quartz2D用于解释那些由本机C或QuickDrawAPI所构建的文本和图形,并将它们保存为PDF格式(主要的脱机打印格式)。
这时,PDF可再次通过Quartz2D,将其转换为适当的输出格式。
2.2.1.2OpenGL
开放图形库(OpenGraphicsLibrary,OpenGL)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规范,它用于生成二维、三维图像。
OpenGL规范描述了绘制2D和3D图形的抽象API。
尽管这些API可以完全通过软件实现,但它是为大部分或者全部使用硬件加速而设计的。
OpenGL规范描述了绘制2D和3D图形OpenGL的API定义了若干可被客户端程序调用的函数,以及一些具名整型常数(例如,常数GL_TEXTURE_2D对应的十进制整数为3553)。
虽然这些函数的定义表面上类似于C编程语言,但它们是语言独立的。
的抽象API。
尽管这些API可以完全通过软件实现,但它是为大部分或者全部使用硬件加速而设计的。
OpenGL不仅语言无关,而且平台无关。
规范只字未提获得和管理OpenGL上下文相关的内容,而是将这些作为细节交给底层的窗口系统。
出于同样的原因,OpenGL纯粹专注于渲染,而不提供输入、音频以及窗口相关的API。
2.2.1.3QuickTime
QuickTime是一种交互式多媒体环境,具有图形环境和应用程序环境上的功能和特性。
2.2.1.4QuartzCompositor
MacOSX的QuartzCompositor层由视窗服务器和由视窗服务器所实现的(私有的)系统编程接口(SPI)所组成。
这一层负责对初始屏幕显示、视窗合成与管理、事件路由和指针管理进行响应。
视窗服务器是一个单独的系统范围内的进程,用于协调低级别的视窗动作,并强制保持在屏幕上所显示视窗的基本一致性。
它是一个轻量级的服务器,因为它自己不能进行渲染,但可以与位于其上层的客户图形库进行通讯。
从绘画模型方面来说,它是“不会发表意见的”。
视窗服务器与其它系统服务和库几乎没有依赖关系。
它依赖于内核环境中的I/OKit(尤其是,用I/OKit构建的设备驱动程序),为的是与框架缓冲器、输入设备的底层结构和输入输出设备进行通讯。
它也与核心服务的某些框架相链接,以获取进程管理服务,如基本进程的激活。
视窗服务器的一个首要职责是视窗合成。
当视窗在被绘制、被重画、覆盖和被覆盖时,由它来合成每一个应用程序的视窗像素。
每个视窗都被描述成一幅位图,它包括了半透明(alpha通道)和抗锯齿信息。
位图作为缓冲器允许视窗服务器去“记住”一个应用程序的视窗内容,并在不干涉应用程序的情况下将它进行再合成。
然而,视窗服务器(QuartzCompositor)没有记忆那些被图形库(例如Quartz2D)用来创建视窗和其它图象的矢量信息。
取而代之的是,位图被应用程序和视窗服务器所共享,应用程序直接对共享位图进行绘画操作,并相应地由视窗服务器来合成该位图。
在它的QuartzCompositor组件中,Quartz以一个分层式的合成引擎来作为视窗系统的模型。
传统的视窗系统使用"交换"模型,在这个模型中屏幕上的每一个像素完全属于一个视窗(或桌面)。
因为这种模型,转变就必然很突然;举个例子来说,当您关闭一个视窗时,它会立刻消失。
在另一方面,一个分层式合成视窗系统基于“图像(视频)混合”模型。
在这个模型上,屏幕中的每一个像素都能够被视窗和视窗间实时共享(尤其是在半透明和抗锯齿特性上)。
这种模型允许平滑地在图形用户界面的状态间进行转换,这是Aqua体验所带来的与众不同的特性之一。
2.2.2GUI:
Aqua
Aqua是MacOSX的GUI之商标名称,以及在这个GUI主要使用的布景主题(另外一个布景主题是拉丝金属,Brushedmetal)。
它是以水的布景主题为基础,如同它的名字可以猜想到的,有类似液滴的元件,且丰富地使用半透明和反射效果。
2.2.3进程管理器
MacOSX中,由进程管理器来管理所有的进程。
它对共享资源的访问进行控制,管理应用程序的调度和执行,并允许多个应用程序共享CPU时间和其它资源。
当用户双击一个应用程序或一个文档图标时,Finder使用进程管理器来启动应用程序。
进程管理器也提供了许多机制,允许您控制进程的执行,启动进程并获得有关进程的信息。
2.2.4Carbon事件管理器
Carbon事件管理器把事件分配给合适的事件处理器,这种分配是基于事件类型和目标应用程序环境的。
视窗服务器把它接收到的事件放到目标应用程序进程的运行循环端口中。
Carbon事件管理器从端口获得事件,把它打包成合适的形式,并把它传递给应用程序(可以是Carbon、Cocoa和Java)事件处理结构的最低层“容器”。
要实现这一点,Carbon事件管理器需要经常确定哪个窗口是当前的活动窗口,在窗口上是否有键盘输入的焦点,等等。
2.2.5Apple事件
Apple事件是一种高级事件,应用程序可以把它发送到本地或者远程计算机上的其它应用程序中,甚至可以发送给它们自己。
Apple事件是MacOSX中应用程序间通讯的主要机制。
应用程序主要用它们来对其它应用程序的服务和信息发出请求,或者对这些请求提供响应。
系统级的脚本语言AppleScript,作为一项相关的技术同样也是MacOSX的一部分。
用户可以使用AppleScript发送Apple事件给应用程序。
2.2.6剪贴板
MacOSX中的剪贴板(也被称为“粘贴板”)是一种后台服务程序,它允许在应用程序间转移数据。
在某些方面它与MacOS9中的剪贴板相似,但也有一些不同的地方。
MacOSX中的剪贴板可以对同一数据保留多种表现形式。
它被所有正在执行的应用程序所共享使用,剪贴板中包含了用户进行剪切或复制的数据。
当一个应用程序要把数据传送给另一个应用程序时,剪贴板同样也能帮助实现这一功能。
剪贴板用于复制-剪切-粘贴操作,并在拖拽操作中作为一种数据传送机制。
同时它也被服务用于在应用程序间的数据传送。
2.3核心服务层(FrameworksandUI)
在核心服务层中,通常的服务与图形用户界面没有直接的联系。
核心服务层包含了一些跨环境执行的与编程相关的基本抽象概念,例如:
字符串、运行循环和集合。
在核心服务中,也有用来管理进程、线程、资源、虚拟内存和用来与文件系统进行交互的API。
2.3.1核心基础(CoreFoundation)[4]
CoreFoundation是一种提供底层软件服务的框架(CoreFoundation.framework),所提供的这些底层软件服务不论对应用服务、应用程序环境还是对应用程序本身都是十分有用的。
使用CoreFoundation所带来的一个好处就是:
提高了在不同环境和层中的框架、库和应用程序之间共享代码和数据的性能。
CoreFoundation也能够通过Unicode字符串来容易地实现国际化,并提供了用于实现操作系统独立性的抽象概念。
在CoreFoundation中需要使用隐含类型,您可以用这些类型来创建“对象”,每一个对象都有它自己的独立标识和值(或一系列值)。
在创建这些对象时,CoreFoundation为内存分配提供了特定工具。
并且,它还具备了一些通用基本类型和多态函数,用以实现类型间操作。
CoreFoundation包括了与一些编程实体相符合的隐含类型,这些编程实体如字符串、数组、代码字典、日期、整数和树。
它还具备了一种用于插件的标准体系结构,以及一种用于动态查找、装载代码和位置相关资源的机制(和一套与其相对应的API)。
另外,它所拥有的服务能够通过URL访问本地和远程资源,设立分布式通知中心,读写XML属性列表,解析XML以及读写每个用户和每台机器的预置参数。
表1列出了CoreFoundation的服务和它的相关隐含类型:
服务
类型
描述
基本服务(BaseServices)
CFAllocator,基本类型
定义了在整个CoreFoundationAPI中被使用的基本类型和多态函数。
束服务(BundleServices)
CFBundle
提供了一种极好的方法,用来组织、定位程序中不同类型的资源,包括:
图像,声音,本地化字符串,和可执行代码。
集合服务(CollectionServices)
CFArray,CFDictionary,CFTree,CFSet,CFBag
提供了对于常用数据结构连同相关功能的一种高级抽象,这些数据结构包括:
数组、字典(关系数组或向量)和树。
通知服务(NotificationServices)
CFNotificationCenter
一种实现分布式通知的机制,它允许一个进程发送消息(通知)给同一台机器上的另外一个进程。
插件服务(Plug-inServices)
CFPlugIn
为MacOSX应用程序(和MacOS9应用程序)提供了一种标准插件体系结构。
预置服务(PreferencesServices)
CFPreference
允许程序保存和获取用户的预置参数。
属性列表服务(PropertyListServices)
提供了一种把数据组织成某种形式的方法,这种组织形式具有高度的结构化,可传递,可存储,和易于访问的特点,并能保持尽可能的高效。
属性列表API允许基本数据类型的分层组织结构与标准XML之间的相互转换。
运行循环服务(RunLoopServices)
CFSocket,CFRunLoop(andrelated)
提供了低级事件处理和分派服务。
字符串服务(StringServices)
CFString,CFCharacter-Set
提供了一整套快速高效的字符串处理和转换功能。
字符串服务提供了对Unicode的完全支持,因此大大简化了国际化的过程。
它同样也增强了字符串数据在Carbon和Cocoa应用程序之间的共享。
URL服务(URLServices)
CFURL,CFURLAccess
允许程序通过URL来访问储存在本地或远程的资源。
实用工具服务(UtilityServices)
CFDate,CFTimeZone,CFNumber,CFUUID,CFByteOrder
提供了各种杂项服务,例如:
日期和时间的计算和显示,数字的“对象”封装,字节交换和UUID的生成。
XML解析器(XMLParser)
CFXMLParser
为读取和分析XML文档的数据提供了一个XML解析器。
表1CoreFoundation服务
2.3.2