Kernel
什么是内核呢?内核协作着硬件和软件之间的输入和输出。它是操作系统最关键的一部分,正是因为它,程序开发者可以不需要考虑底层硬件设备,自由地编写代码。
Apple 操作系统有很多有趣的故事!
Apple , Next, &Be
乔布斯因为一些原因,离开了Apple
公司,并加入一家新的公司-NEXT
,这家公司专门生产基于NEXTSTEP
操作系统的硬件。
NeXTSTEP
是一个面向对象的多任务操作系统,以Mach
和BSD
为基础,以Objective-C
作为本地语言,具有先进的GUI
接口。
后期,苹果公司收购了NEXT
公司,以NeXTSTEP
为基础,开发出了以Darwin
(达尔文)为核心的Mac OS X
操作系统。
Darwin
OS X是操作系统的一个集体名称,操作系统有很多组件,Darwin 就是其中一个。
Darwin
是操作系统的类UNIX
核心,本身由XNU
内核、runtime
以及I / O
设备驱动的框架组成。
XNU 是Darwin
的内核,它是“X is not UNIX
”的缩写,它是一个混合内核,由Mach
微内核和BSD
组成。
Mach 内核是轻量级的平台,只能完成操作系统最基本的职责,比如:进程和线程、虚拟内存管理、任务调度、进程通信和消息传递机制。所以其他工作无法完成,任何额外的功能,例如文件操作和设备访问,都由 BSD 层实现。
BSD
BSD 层建立在 Mach 层之上,这一层提供更现代化的 API,具有更高层次的抽象,。其中包括:POSIX
线程模型、网络协议栈、文件系统、设备访问等
我们经常谈到的沙盒机制、GCD,就是在BSD基础上实现的。
Mach-O
Mach-O 是Mach object
文件格式的缩写,是一种可执行文件、目标代码、共享程序库。iOS 、OS X 、NEXTSTEP 正是使用了这种独有的二进制格式。
Darwin Additions
从内核和操作系统的角度来看,iOS 可以看成 OS X精简之后的版本,但是有一些区别
- iOS 的架构是基于ARM 而不是Intel x86 或 x86_64。
- XNU 虽然是开源的,但是iOS 的内核源码保持闭源
Basic Security Module
Darwin 加入了 Sun 公司的BSM(basic security module
,一个审计系统,最早源于 Sun Solaris
),可以对用户和进程的行为进行追踪,这个系统对OS X的价值最大,而对iOS 这样的移动系统不是很有意义,因此在后者上并没有启用审计。
Mandatory Access Control
强制访问限制(MAC):限制特定进程对具体文件或资源(例如:套接字和 IPC)的访问权限。这个特性最早属于 TrtstedBSD
,并在 OS X 10.5的时候被加入到 OS X系统中。
MAC
是OS X
沙盒机制和 iOS Entitlements
机制(这个阶段可以先看成更严格的沙盒机制)的基础机制
JetSam
OS X 和 iOS 实现了一个低内存情形的处理机制,称为Jetsam,或者称为memorystatus,这个机制类似与linux上的 “out of memory”
。jetsam会监控内存的使用情况,会杀掉消耗太多内存的进程。
launchd 进程是内核直接启动的第一个用户态进程,它负责管理系统中的其他进程。那么launchd
就采用了Jetsam
机制。这种机制会维护两个表,一个是快照列表,保存系统中所有进程的状态以及消耗的内存页面数;还有一个是优先级列表,保存要杀掉的备选进程。这种机制在 iOS 中是非常有用的,可以保证在前台和后台没有过度使用内存的进程。
如果一个程序被标记为被杀掉的备选进程,应用程序可以通过以下方法来做一些处理
UIApplicationDelegate - applicationDidReceiveMemoryWarning:
UIViewController -didReceiveMemoryWarning
UIApplicationDidReceiveMemoryWarningNotification
Kernel Address Space Layout Randomization
地址空间布局随机化:进程每一次启动,地址空间都会简单地随机化。
对于大多数应用程序来说,地址空间随机化是一个和他们完全不相关的实现细节,但是对于黑客来说,它具有重大的意义。
如果采用传统的方式,程序的每一次启动的虚拟内存镜像都是一致的,黑客很容易采取重写内存的方式来破解程序。采用ASLR
可以有效的避免黑客攻击。
I/O Kit
I/O Kit
的源码开源了,你可以在这里下载
I/O Kit
既不属于mach
也不属于BSD
,它是由NEXTSTEP
的DriverKit
改进而来,DriverKit
是Objective-C
编写,但是I/O Kit
使用C++
。同时I/O Kit
是一个自包含的运行时环境,就是说编写的依赖于I/O Kit API
的代码,可以不用考虑Mac
h层和BSD
层的存在。
I/O Kit 由很多不同的族(Family)组成,每个族都定义了抽象的类和具体的类
- ADB(Apple Desktop Bus)
- AGP(Accelerated graphics port)
- ATA & ATAPI(ATA packet interface)
- Audio
- Fire Wire
- Graphics
- HID(Human interface devices)
- Network
- PCI
- SBP
- SCSI
- Serical
- Storage
- USB(Universal Serial Bus)
这应该是概述,后面有更深入的分析,期待ing!
这是关于 Low-Level Programming 的读书笔记, 如果有理解错误,望留言告知