現在,我們所知道的操作系統中,都有一個關鍵的核心組件,叫做內核(kernel)。內核能夠充分利用底層 CPU 提供的所有特性和能力,為客戶提供各種各樣的服務。
那么,內核到底為我們做了什么呢?
- 內核為我們應用程序開發者,做了層次的抽象,我們不需要過多考慮設備訪問、文件讀寫,我們可以使用內核提供的一套 API 很快速的完成想要的功能
- 現在操作系統都是多任務搶占式的操作系統,程序的數目可以遠多于處理器(核心)的數目,內核會判定哪一個程序運行在哪一個處理器上
- 程序會訪問共享設備(顯示器、網絡適配器等),內核提供安全的調度方式,來規避沖突和瓶頸
- 內核也提供安全服務,對各種權限做驗證
內核架構
1.單內核
單內核,也叫宏內核,將所有的內核功能都放到一個地址空間中,線程調度和內存管理,以及文件系統、安全管理、設備驅動等都放在一起。
所有內核功能都實現在同一個地址空間中,宏內核只需要函數調用就可以完成各個功能的協調合作,具有簡潔、性能好的特點。
2.微內核
微內核,只包含最核心的功能,通常包括任務調度和內存管理,其他功能都交給用戶態的服務程序。所有這些服務,都被分解到不同的地址空間里,因此,不能夠像單內核那樣直接的函數調用,微內核各個服務程序之間需要通過消息傳遞(IPC)來進行通信。
微內核的進程通信需要內存復制、上下文切換等操作,同時消息傳遞也存在一些延遲,所以微內核的性能不及單內核。但是,微內核的擁護者,一直以微內核的靈活性、穩定性而驕傲。
3.混合內核
混合內核想要結合以上兩種內核的好處,最核心的底層服務,包括調度、進程通信和虛擬內存,和微內核一樣,包含在最核心的位置,對于這個核心之外的服務,也是在內核態的,同時和這個核心在同一內存空間中。
我們 Mac OS X
系統的內核就是混合內核,我們叫它 XNU
。XNU
的核心是 Mach
,同時在 Mach
之上建立了一個BSD
層 ,他們都在同一地址空間中,和單內核一樣具有較高的運行效率。
注:
XNU
也有消息傳遞,但是消息以指針的形式傳遞,不需要昂貴的復制操作,所以與單內核一樣具有高效率。
XNU-Mach
Mach 和 BSD 都有自己職責的分工,那么先說 Mach 都有那些核心的職責
- 進程和線程管理:我們平時所用到的 POSIX 線程和 NSThread 都是和 Mach 層線程一一對應的,POSIX 線程是BSD 層對 線程的更高層次抽象
- 虛擬內存的分配和管理
- CPU 等物理設備的分配和調度
- 異常:Mach 在已有的消息傳遞機制上實現了一種異常處理機制,下面會仔細介紹作為應用層面的開發者,如何來做 Mach 異常捕獲,可以利用這個做一些 crash 信息的收集工作,其他 crash 收集文章可以參考這里
如果想要做mach
異常捕獲,需要注冊一個異常端口,這個異常端口會對當前任務的所有線程有效,如果想要針對單個線程,可以通過 thread_set_exception_ports
注冊自己的異常端口,發生異常時,首先會將異常拋給線程的異常端口,然后嘗試拋給任務的異常端口,當我們捕獲異常時,就可以做一些自己的工作,比如,當前堆棧收集等。
對于如何注冊一個異常端口,這里有一個示意圖和 相關代碼 可以參考
XNU-BSD
Mach 層的服務不足以支撐整個完整的操作系統,在Mach 之上,又建立了一個 BSD 層,BSD 提供了更豐富的功能
- 進程和線程更多特性:BSD 層的 進程和線程比 Mach 層包含更多的信息,支持更多的特性,Mach 層的進程和線程并不能滿足操作系統的高級需求,通過BSD 層 XNU 提供了更為豐富且標準化的 API
- 網絡協議棧
- 文件系統:在 OS X 中可執行文件格式為 Mach-O,對于 Mach-O 的初級理解,可以先了解下 趣探 Mach-O:文件格式
- 設備訪問
libkern + I/O Kit
libkern
是一個自包含的 C++ 類庫,為 C++ 運行時提供支持和基礎類。I/O Kit
是一個 C++ 編寫的設備程序驅動框架,讓開發者可以快速的創建穩定優雅的設備驅動程序。
OS X 與 iOS 區別
OS X 與 iOS 大致上保持一致,但是也有些區別
- iOS 上內存管理使用
jetsam
機制,一個基于優先級隊列的機制,優先級由低到高是:IDLE
(空閑)->BACKGROUND
->FOREGROUND
,依次類推。當內存過低的時候,就會在隊列中進行廣播,希望大家盡量釋放內存,如果一段時間后,仍然內存不夠,就會開始Kill
進程,直到內存夠用。但是OS X
上使用的是Swap
機制,利用內存和磁盤的交換來協調進程間內存使用。 - 沙盒化,所有通過
app store
分發的程序都會有沙盒化這一機制, OS X 可以通過多種渠道下載軟件,但是 iOS 只能通過app store
下載, iOS 上所有軟件必須都支持沙盒化。 -
entitlement
:是一個 plist 文件,里面列舉了可以獲得的授權,會由蘋果進行數字簽名。entitlement
是用來賦予你某種權限,apple
可以通過entitlement
來賦予開發者更多的權限。 -
encrypted image
:程序image
加密功能
參考資料
- 代碼簽名探析
- Mac OS X and iOS Internals: To Apple Core
- iDev 開發者大會 - 李亮