(读书笔记)解析OS X & iOS操作系统:进化史和概

2018-04-29  本文已影响99人  狂奔的胖蜗牛

1 前达尔文时代:Mac OS Classic

Classic是Mac OS在OS X之前的名称。该版本是创新的全GUI系统,但是,内存管理非常糟糕,多任务系统是协作式的。
协作式的多任务系统中,进程需要资源放弃自己的CPU时间片,如果进程行为良好,则可以很好的工作,然而如果有的进程拒绝协作,即使有一个这样的进程,整个系统都会停止运行。
尽管如此,如今的OS X还是在该系统的基础上发展而来,比如现在的Finder,HFS文件系统等。

2.NeXTSETP

乔布斯创建的NeXT公司,生产专用硬件:NeXT计算机和NeXTstation。这些机器运行中专用的操作系统:NeXTSTEP。

NeXTSTEP的特性:

后来,该公司被苹果收购,乔布斯也回到苹果,NeXTSTEP操作系统的遗产被OS X系统继承了。

3.OS X

实际上,可以把OS X当成是Classic和NeXTSTEP的融合。Mac OS X的第一个版本是Rhapsody,该系统的内核也就是今天所熟知的Darwin(达尔文)。
OS X的核心组件-Cocoa/Mach/IOKit/Xcode的Interface Builder以及很多其他组件,都是直接来自于NeXTSTEP。这也就是OC里面很多类都是以NS开头的原因。

4.iOS----移动平台的OS X

从本质上看,iOS实际上就是Mac OS X,但两者还是有区别的:

5.OX X架构概述

OS X和iOS的分层:

其中,Darwin是需要关心的,具体架构:


image.png

这表明,Darwin是由两个技术混合在一起的:Mach和BSD。还添加了一些其他组件。

6.Darwin--UNIX核心

Terminal应用程序会打开一个带有UNIX shell的终端模拟器。默认使用shell是/bin/bash,即GUN的Bourme Again的shell。还提供了其他可选:

命令行工具都可以通过telnet或SSH远程访问,但默认都是禁止的。不推荐telnet,不安全。

可以方便的启动telnet和SSH,只要编辑/System/Library/LaunchDaemons目录对象的plist文件(telnet.plist和ssh.plist),将Disabled键值设置为false即可。

7.UNIX的系统目录

OS X特有目录:

8.Bundle

bundle:一种标准化的层次结构,保存了可执行代码以及代码所需要的资源。

bundle的结构:
Contents/
CodeResoures/
Info.plist 包中的manifest文件
MacOS/ 包中的二进制文件
PkgInfo 包的8字节标识符
Resources/ .nib文件和.lproj文件
Version.plist 包版本信息
CodeSignature/
CodeResources

Cocoa提供了一中简单的编程方法用于访问和加载bundle,即通过NSBundle对象和CoreFoundation提供的CFBundle系统API可以访问和加载bundle。

9.应用程序

应用程序整洁的包装在bundle中,包含运行该应用程序所需的大部分文件:主二进制文件,私有的库,图标,UI元素以及图形元素。而用户不知情,bundle在Finder中只是显示为一个图标。因此,Mac OS上安装程序只需要将应用程序图标拖到Applications目录即可。

10.lproj文件实现国际化

bundle设计上就支持国际化,每一种语言对应一个子目录,语言目录的后缀为.lproj。在表示语言的目录中包含针对指定语言本地化的字符串文件,nib文件和多媒体。

11.CodeResources

实际上是一个属性列表,包含bundle中所有其他文件的列表,该属性列表只有一项files,是一个字典,键是文件名,值通常是Base64格式的散列值。用于判断应用程序是否完好无损,是否被修改等。

OS X和iOS都没有在系统中为应用程序设置维护一个注册表。因此,程序必须通过其他机制存储用户首选项和各种默认设置。

苹果提供的机制为defaults,每个程序都会得到一个属于自己的名称空间,应用程序可以在这个名称空间中根据需要随意添加,修改和删除设置。这个名称空间称为应用程序的域。

应用程序的默认设置通常保存在属性列表中。

12.框架

OS X中,框架就是bundle,包含一个或多个共享库以及相关的支持文件。

框架不是Darwin的一部分。因为Darwin是开源的,而框架是闭源的。

框架保存位置:

13.库

框架可以说是一种特殊的库,框架中的二进制文件就是库。

库文件使用.dylib后缀,而不是.so文件。

14.系统调用

用户程序不允许直接访问系统资源,可以操作通用寄存器,执行一些简单的计算,但如果需要执行任何重要功能,比如打开文件或套接字,甚至发送一条简单的消息,都必须使用系统调用。

系统调用值得是由内核导出的预定义函数的入口点,在用户态需要连接/usr/lib/libSystem.B.dylib才能访问这些系统调用。OS X系统调用特殊之处在于实际上导出了两套独特的调用接口----一个是Mach调用,一个是POSIX调用。

POSIX是一套标准的API,定义了如下内容:

OS X是在Mach内核的基础上构建的,BSD是对Mach内核的包装。但Mach系统调用仍然可以在用户态访问。

32位系统上,Mach系统调用编号为负数,POSIX定义了非负的系统调用。

64位上,Mach系统调用是证书,但是以0x2000000开头,而POSIX是以0x1000000开头。

15.XNU概述
XNU是Darwin的核心。也是整个OS X的核心。有如下几个组件构成:

Mach职责:

BSD层:建立在Mach之上,提供了:

libkern:大部分内核都是完全使用C语言和底层汇编语言编写的。而XNU不同,设备驱动程序可以用C++语言编写。为了支持C++运行时并提供所需要的基类,XNU包含了libkern库,这是一个内建的,自包含的C++库。

I/0 Kit:设备驱动程序框架。驱动程序可以通过C++编写,可以在一个面向对象的环境中编写驱动程序。

上一篇 下一篇

猜你喜欢

热点阅读