作为一个BSD衍生的操作系统,OSX继承了很多BSD的特性,包括POSIX系统调用、一些BSD扩展(内核队列)以及BSD的强制访问控制。
苹果新增的内容:“沙盒”机制。替换了原本系统配置的/etc目录。标准的UNIX syslog被AppleSystem Log增强了。还有FSEvents新技术。
BSD相关特性
尽管XNU的绝对的核心是Mach,但XNU向用户态展现出来的主要接口是BSD层。
sysctl
sysctl(8)访问内核内部状态的标准方法。直接查询内核变量的值,获得重要的运行时诊断信息。也可以设置可写变量的值。
命令:sysctl user // 列出user名称空间下的所有内核变量
内核组件也可以在运行会注册额外的sysctl变量值,甚至增加整个名称空间。
sysctl变量的范围很广,包括从一些简单的调试变量到其他可控制整个子系统行为的读写变量。ps和netstat都依赖于sysctl获得PID和socket系列,当然也可以通过其他方式获得。
kqueue
kqueue是BSD中使用的内核事件通知机制。一个kqueue指的是一个描述符,这个描述符会阻塞等待知道一个特定类型和种类的事件发生。用户态的进程(或内核)可以等待这个描述符,因为kqueue提供了一种用于一个或多个进程同步的简单高效的方法。
kqueue和对应的kevent(表示事件的数据结构)构成了内核异步I/O的基础。
审计(OSX)
审计是OSX中一个自包含的子系统。主要的用户态组件是auditd,由launchd根据需要而启动的后台服务进程。这个后台服务进程不负责实际的审计日志记录,审计日志记录是由内核本身直接完成的。然后这个后台服务进程能控制内核。
如果启用了审计,那么XNU中编号从350到359的系统调用都被分配用于启用和控制审计。
强制访问控制(MAC)
添加了对象级别的安全性,限制特定进程针对具体文件或资源的访问权限。可以控制一个给定的应用程序不允许访问用户的私有数据或某网站。
从内核的角度看,在各种系统调用的实现中插入了对MAC的调用,每一个系统调用都必须先通过MAC的验证,然后才能真正处理来自用户态的请求。
MAC是OSX的隔离机制和iOS的entitlement机制的基础。
OSX和iOS特有的技术
用户和组的管理
UNIX从传统上都依赖密码文件/etc/passwd 和保存密码的散列文件/etc/shadow。在OSX单用户(以及iOS)中,使用/etc/master.passwd作为shadow文件,其他情况都放弃了这些密码文件,使用自己的目录服务。
目录服务的维护的内容不仅仅是用户和用户组,还保存了系统配置和很多其他方面的信息。
系统配置
OSX还抛弃了大部分其他配置文件,这些配置文件传统上在UNIX中是当做系统“注册表”使用的。
为了维护系统配置,OSX和IOS使用了一个特殊的守护程序——configd(8),这个守护程序可以加载额外的可加载的bundle(插件),这个bundle位于/System/Library/SystemConfiguration
下,包含IP和IPv6配置、日志以及其他bundle。
可通过工具scutil
来流量和查询系统配置。
记录日志
OSX也继承了传统UNIX的系统日志功能。OSX10.4引入新的日志模型,ASL,提供了更多特性,例如过滤和搜索。
ASL采用模块化设置,同时提供了以下四种日志接口:
- 向后兼容syslogd
- 网络协议syslogd
- 内核日志接口
- 全新的ASL接口
ASL日志收集在/var/log/asl
目录中。aslmanager(8)
命令负责管理这些日志,launchd自动运行这条命令。
ASL日志采用的是二进制格式,而不是syslog采用的文本文件。日志文件变小了,但不像syslog那么对grep友好。OSX包含了syslog()命令用于显示和查看日志,并提供了搜索和过滤的功能。
Apple事件和AppleScript
OSX有非常强大的支持脚本的能力。通过osascript(1)命令和友好的Automator应用程序可以访问AppleScript
FSEvents
FSEvents是文件系统的通知API,应用程序可以简单快速地响应文件添加、修改和删除事件。
通知
OSX提供了一个系统级的通知机制,这是分布式IPC的一种形式。
通知机制核心部分在于notifyd(8)守护进程,在系统引导时启动,这是Darwin的通知服务器。
其他重要API
- GCD
- 一个系统级的并行化框架,使用了工作队列扩展,建立在pthread API之上
- Launch Daemon
- 同一管理UNIX系统守护程序,还管理Mach自举服务器
- XPC
- 高级IPC框架,实现进程间特权的分离
- kdebug
- 可以在内核层级跟踪系统调用和Mach陷阱
- 系统套接字
- PF_SYSTEM 名称空间的套接字,允许在内核态的组件进行通信
- Mach API
- 直接提供了XNU的Mach核心的接口,某些情况比高层BSD/POSIX接口更强大
- I/O Kit API
- 用于和设备驱动程序通信的APi,提供了大量诊断信息。
OSX和iOS安全机制
代码签名
沙盒化
- 无法突破应用程序目录之外的位置
- 无法访问系统上的其他进程
- 无法直接使用任何硬件设备,只能通过苹果提供的框架
- 无法动态生成代码
- 应用程序的root权限不存在
Entitlement可以将一些表现行为良好的应用程序单独从监禁中释放出来。