Darwin 内核
最后更新于
图片引用自《深入解析Mac OS X & iOS 操作系统》
Darwin的内核是XNU,XNU is Not Unix。XNU是两种技术的混合体,Mach和BSD。BSD层确保了Darwin系统的UNIX特性,真正的内核是Mach,但是对外部隐藏。BSD以上属于用户态,所有的内容都可以被应用程序访问,而应用程序不能访问内核态。当需要从用户态切换到内核态的时候,需要通过mach trap实现切换。
Mach微内核
BSD层
libkern
I/O Kit
Mach 是 XNU的原子核,是一个微内核轻量级操作系统,仅处理最核心的任务
进程和线程抽象
任务调度
进程间通讯和消息传递
虚拟内存管理
BSD层简历在Mach之上,确保了Darwin符合 POSIX 。提供了更高层次的功能,包括:
UNIX 进程模型
POSIX线程模型(Pthread)及相关的同步原语
UNIX 用户和组
网络协议栈(BSD Socket API)
文件系统访问
设备访问(通过/dev目录访问)
I/OKit是C++ 编写的;为了支持C++运行时并提供所需要的基类,是一个內建的自包含的C++库。
I/O Kit 这是一个在内核中的完整的自包含的执行环境,让开发者可以使用C++快速创建设备驱动程序。
POSIX 兼容性是由XNU中BSD层提供的。 所有的POSIX 系统调用不论底层实现如何都有相同的原型,也就是说具有相同的参数和返回值。 系统调用编号:除了固定的原型之外,POSIX还完整定义了系统调用的编号。
BSD层是对Mach内核的包装,但是Mach系统调用仍然可以在用户态访问。需要借助mach trap实现用户态到内核态的转换。 在32位系统上,Mach系统调用的编号都为负数,POSIX调用编号为非负。 在64位系统上,Mach系统调用为正数,但是以0x2000000开头,而POSIX调用编号以0x1000000开头。
iOS的核心是Darwin,Darwin的核心是XNU,XNU有两个核心,外层的BSD和内层的Mach。由于有两个内核所有有两种系统调用方式。造成这种现象的原因是OS X作为一款PC操作系统希望运行针对UNIX开发的应用,而iOS作为OS X的分支继承了这个特性。