XNU 核心
/ ex-en-YOO /
XNU 是蘋果作業系統內部的核心——Mac 上的 macOS,以及蘋果手機、平板與手錶上的 iOS、iPadOS、watchOS 與 tvOS。這名字是個俏皮的遞迴玩笑(XNU is Not Unix,XNU 並非 Unix),但實際上這套系統的行為非常像 Unix。如果說 NT 是一家從頭打造的自律公司,XNU 更像是兩支已驗證的團隊合併進同一棟大樓:它把兩個著名的較早核心縫合在一起,各取所長。
具體地說,XNU 是個混合核心,以一個 Mach 核心搭配一大片 BSD Unix 包裹而成。Mach 部分(出自卡內基美隆的微核心)提供最底層的機制:排程執行緒、管理虛擬記憶體,以及任務之間基於訊息的通訊。BSD 部分提供熟悉的 Unix 面貌:行程、信號、檔案系統層、通訊端與網路,以及一般程式使用的 POSIX 系統呼叫。第三層 I/O Kit 則是撰寫裝置驅動程式的乾淨物件導向框架。這兩半並不像嚴格微核心那樣作為各自隔離的伺服器執行;為了效能,它們同居於核心之中,這正是 XNU 被稱為混合核心而非純微核心的原因。
誠實的細微之處是:儘管 Mach 本身是微核心,把 XNU 稱作微核心仍會誤導。蘋果保留了 Mach 的介面,卻把 BSD 與 Mach 的程式碼安置在同一個核心位址空間,以避開真正微核心要付出的訊息傳遞開銷,於是 XNU 既享有 Mach 靈活的記憶體與行程間通訊模型,又能像單核心一樣快。這種務實的揉合——下層 Mach、上層 BSD Unix,全在一個核心裡——正是為什麼你的 Mac 感覺像一套打磨精緻的 Unix,卻又與你口袋裡的 iPhone 共享著深層機制。
在 Mac 上你打開終端機,執行像 ls 或 grep 這類熟悉的 Unix 指令,再寫個會呼叫 fork 與 exec 的程式。那些 POSIX 呼叫由 XNU 的 BSD 層服務。同時,你程式所用的記憶體與排程器執行的執行緒,是底層的 Mach 核心在管理——兩種血統在一個核心裡協作。
下層 Mach、上層 BSD Unix:一個混合核心同時驅動 Mac 與 iPhone。
常見的錯誤:因為 XNU 含有 Mach,人們便稱它為微核心。但它並非以微核心方式執行——為了速度,BSD 與 Mach 的程式碼共用同一個核心空間,使 XNU 實際上是混合核心。