作為一個BSD衍生的操作系統(tǒng),OSX繼承了很多BSD的特性,包括POSIX系統(tǒng)調(diào)用、一些BSD擴展(內(nèi)核隊列)以及BSD的強制訪問控制。
蘋果新增的內(nèi)容:“沙盒”機制。替換了原本系統(tǒng)配置的/etc目錄。標準的UNIX syslog被AppleSystem Log增強了。還有FSEvents新技術(shù)。
BSD相關特性
盡管XNU的絕對的核心是Mach,但XNU向用戶態(tài)展現(xiàn)出來的主要接口是BSD層。
sysctl
sysctl(8)訪問內(nèi)核內(nèi)部狀態(tài)的標準方法。直接查詢內(nèi)核變量的值,獲得重要的運行時診斷信息。也可以設置可寫變量的值。
命令:sysctl user // 列出user名稱空間下的所有內(nèi)核變量
內(nèi)核組件也可以在運行會注冊額外的sysctl變量值,甚至增加整個名稱空間。
sysctl變量的范圍很廣,包括從一些簡單的調(diào)試變量到其他可控制整個子系統(tǒng)行為的讀寫變量。ps和netstat都依賴于sysctl獲得PID和socket系列,當然也可以通過其他方式獲得。
kqueue
kqueue是BSD中使用的內(nèi)核事件通知機制。一個kqueue指的是一個描述符,這個描述符會阻塞等待知道一個特定類型和種類的事件發(fā)生。用戶態(tài)的進程(或內(nèi)核)可以等待這個描述符,因為kqueue提供了一種用于一個或多個進程同步的簡單高效的方法。
kqueue和對應的kevent(表示事件的數(shù)據(jù)結(jié)構(gòu))構(gòu)成了內(nèi)核異步I/O的基礎。
審計(OSX)
審計是OSX中一個自包含的子系統(tǒng)。主要的用戶態(tài)組件是auditd,由launchd根據(jù)需要而啟動的后臺服務進程。這個后臺服務進程不負責實際的審計日志記錄,審計日志記錄是由內(nèi)核本身直接完成的。然后這個后臺服務進程能控制內(nèi)核。
如果啟用了審計,那么XNU中編號從350到359的系統(tǒng)調(diào)用都被分配用于啟用和控制審計。
強制訪問控制(MAC)
添加了對象級別的安全性,限制特定進程針對具體文件或資源的訪問權(quán)限。可以控制一個給定的應用程序不允許訪問用戶的私有數(shù)據(jù)或某網(wǎng)站。
從內(nèi)核的角度看,在各種系統(tǒng)調(diào)用的實現(xiàn)中插入了對MAC的調(diào)用,每一個系統(tǒng)調(diào)用都必須先通過MAC的驗證,然后才能真正處理來自用戶態(tài)的請求。
MAC是OSX的隔離機制和iOS的entitlement機制的基礎。
OSX和iOS特有的技術(shù)
用戶和組的管理
UNIX從傳統(tǒng)上都依賴密碼文件/etc/passwd 和保存密碼的散列文件/etc/shadow。在OSX單用戶(以及iOS)中,使用/etc/master.passwd作為shadow文件,其他情況都放棄了這些密碼文件,使用自己的目錄服務。
目錄服務的維護的內(nèi)容不僅僅是用戶和用戶組,還保存了系統(tǒng)配置和很多其他方面的信息。
系統(tǒng)配置
OSX還拋棄了大部分其他配置文件,這些配置文件傳統(tǒng)上在UNIX中是當做系統(tǒng)“注冊表”使用的。
為了維護系統(tǒng)配置,OSX和IOS使用了一個特殊的守護程序——configd(8),這個守護程序可以加載額外的可加載的bundle(插件),這個bundle位于/System/Library/SystemConfiguration
下,包含IP和IPv6配置、日志以及其他bundle。
可通過工具scutil
來流量和查詢系統(tǒng)配置。
記錄日志
OSX也繼承了傳統(tǒng)UNIX的系統(tǒng)日志功能。OSX10.4引入新的日志模型,ASL,提供了更多特性,例如過濾和搜索。
ASL采用模塊化設置,同時提供了以下四種日志接口:
- 向后兼容syslogd
- 網(wǎng)絡協(xié)議syslogd
- 內(nèi)核日志接口
- 全新的ASL接口
ASL日志收集在/var/log/asl
目錄中。aslmanager(8)
命令負責管理這些日志,launchd自動運行這條命令。
ASL日志采用的是二進制格式,而不是syslog采用的文本文件。日志文件變小了,但不像syslog那么對grep友好。OSX包含了syslog()命令用于顯示和查看日志,并提供了搜索和過濾的功能。
Apple事件和AppleScript
OSX有非常強大的支持腳本的能力。通過osascript(1)命令和友好的Automator應用程序可以訪問AppleScript
FSEvents
FSEvents是文件系統(tǒng)的通知API,應用程序可以簡單快速地響應文件添加、修改和刪除事件。
通知
OSX提供了一個系統(tǒng)級的通知機制,這是分布式IPC的一種形式。
通知機制核心部分在于notifyd(8)守護進程,在系統(tǒng)引導時啟動,這是Darwin的通知服務器。
其他重要API
- GCD
- 一個系統(tǒng)級的并行化框架,使用了工作隊列擴展,建立在pthread API之上
- Launch Daemon
- 同一管理UNIX系統(tǒng)守護程序,還管理Mach自舉服務器
- XPC
- 高級IPC框架,實現(xiàn)進程間特權(quán)的分離
- kdebug
- 可以在內(nèi)核層級跟蹤系統(tǒng)調(diào)用和Mach陷阱
- 系統(tǒng)套接字
- PF_SYSTEM 名稱空間的套接字,允許在內(nèi)核態(tài)的組件進行通信
- Mach API
- 直接提供了XNU的Mach核心的接口,某些情況比高層BSD/POSIX接口更強大
- I/O Kit API
- 用于和設備驅(qū)動程序通信的APi,提供了大量診斷信息。
OSX和iOS安全機制
代碼簽名
沙盒化
- 無法突破應用程序目錄之外的位置
- 無法訪問系統(tǒng)上的其他進程
- 無法直接使用任何硬件設備,只能通過蘋果提供的框架
- 無法動態(tài)生成代碼
- 應用程序的root權(quán)限不存在
Entitlement可以將一些表現(xiàn)行為良好的應用程序單獨從監(jiān)禁中釋放出來。