單體核心(monolithic kernel)
核心是作業系統完全信任的那一個程式:它執行在所有應用程式之下,直接掌控硬體,並決定誰被允許做什麼。單體核心是這樣一種設計:作業系統所做的幾乎一切——管理記憶體、排程行程、與磁碟和網路卡溝通、實作檔案系統——都住在那一個龐大而受信任的程式裡,全部一起跑在同一個特權定址空間中。想像一間大工坊,每位專家都在同一張工作檯上幹活,彼此自由地遞工具。
具體來說,在單體核心裡,一個請求是透過普通的函式呼叫流動的。當你的程式讀取檔案時,它發出一個系統呼叫進入核心;核心的檔案系統程式碼呼叫核心的區塊裝置程式碼,後者再呼叫核心的磁碟驅動程式碼——這些全是同一個二進位檔裡的函式,共用一組資料結構,彼此之間不需跨越任何邊界。Linux 就是著名的例子:排程器、虛擬記憶體系統、TCP/IP 協定堆疊以及大多數驅動程式,全都編譯進(或載入到)同一個跑在 CPU 特權模式下的核心。Linux 用可載入模組軟化了「一個巨大二進位檔」的形象,模組能在執行期加入或移除程式碼,但載入後的模組仍跟其他一切跑在同一個受信任的核心空間裡。
這個取捨正是重點所在。因為所有部分共用一個定址空間並直接彼此呼叫,單體核心很快——沒有訊息傳遞,子系統之間也沒有上下文切換。代價是信任的脆弱:任何一個驅動程式或子系統裡的單一臭蟲,都以完整特權執行,能破壞不相關的核心資料、讓整台機器當機,或成為一個安全漏洞。這正是微核心設計試圖逃離的核心張力,也是為何「單體核心對微核心」是作業系統裡最古老的論戰之一。
read(fd, buf, n) -> [核心] sys_read() -> vfs_read() -> ext4_file_read_iter() -> 區塊層 -> nvme_driver ——全是同一個特權二進位檔內的普通函式呼叫,無須跨越邊界。
在單體核心裡,一次檔案讀取以直接呼叫的方式穿過檔案系統、區塊層與驅動程式碼,全在同一個受信任的定址空間中。
單體不代表「無法模組化」。Linux 是單體的,卻透過可載入核心模組而高度模組化——但載入後的模組仍以完整核心特權跑在核心空間裡,所以這裡的模組化講的是組織與執行期載入,而非隔離或信任邊界。