核心內部與作業系統建構

單核心(monolithic kernel)

/ mon-oh-LITH-ic /

當你建造作業系統中以完整硬體特權執行的那一部分時,會面臨一個基本的設計抉擇:把所有東西都放進去一起跑,還是只讓一個極小的核心保有特權、把其餘的推到外面。單核心(monolithic kernel)走第一條路——排程器、記憶體管理員、檔案系統、裝置驅動程式與網路堆疊全都一起在一個特權程式裡、共享一個位址空間中執行。想像一棟大型醫院,外科、藥房、病歷、廚房等每個部門都在同一個屋頂下;人員直接從一處走到另一處、不必預約,這很快,但其中一翼起火就危及整棟樓。

具體來說,在單核心裡各子系統像同一記憶體空間中的普通函式呼叫那樣彼此呼叫。當你的程式讀一個檔案時,系統呼叫進入點、檔案系統程式碼、區塊裝置層與磁碟驅動程式全都在核心模式中執行,並直接彼此呼叫,它們之間沒有任何邊界跨越——這非常快。Linux 是著名的例子,它是單核心,卻也模組化:它大部分的程式碼是整體式的,但能在執行期以核心模組的方式載入與卸載驅動程式與功能,因此既獲得了彈性、又不放棄單一位址空間的速度。

它之所以重要,是因為這是作業系統設計中那場重大結構辯論的一方,與微核心相對。單核心的強處在於效能與通訊的簡單;誠實的弱點則是穩健與安全:由於所有東西共享一個特權位址空間,任何一個驅動程式裡的錯誤都可能毀掉任何地方的記憶體並當掉整個系統,而那龐大的可信程式碼基底也難以完整驗證。一個常見的誤解是把單核心當成不模組化或老舊——Linux 證明了單核心能高度模組化且十足現代;這個標籤講的是程式碼在哪裡執行(同一個特權空間),而非它在原始碼中如何組織。

在 Linux 中,當你對一個檔案呼叫 read 時,整條路徑都停留在核心的單一位址空間裡:系統呼叫分派 -> 虛擬檔案系統 -> ext4 檔案系統程式碼 -> 區塊層 -> 磁碟驅動程式,彼此只隔著一次函式呼叫。對照微核心,那些步驟中有好幾個會是各自獨立、彼此交換訊息的使用者行程。

所有特權的東西都住在一個位址空間裡、直接互相呼叫——快,但沒有故障隔離。

單核心對微核心是一種取捨,沒有絕對贏家:單核心以故障隔離換取速度。核心空間中單一個有缺陷的驅動程式就能讓整台機器恐慌(panic),而這正是微核心試圖透過把驅動程式移到使用者空間來圍堵的問題。

又稱
monolithic design巨核心整體式核心