歡迎光臨
每天分享高質量文章

【討論】Linux kernel 的設計是否已經過時?

在開源中國看到“Linux kernel 的設計是否已經過時?”這個題目,正好有企業界的朋友問到L4 基於微內核的作業系統怎麼樣。微核心與單核心爭論似乎是永遠的話題,只是看你站在什麼角度。依然記得99年帶領學生們閱讀Minix微核心作業系統設計原理和程式碼的情景,因為在艱難的跋涉中有清晰的導航圖,《作業系統設計與實現》上下冊還是被一點一點啃完。

後來閱讀Linux原始碼,就像走進一大片森林,在各種複雜的交錯關係中摸索著前進,即使手上拿著導航圖,但經常因為走進一個岔道而忘了傳回的旅途,但是,因為眾多的人在森林中探索,你會找到同路人(開源社群的郵件串列和各種檔案),於是,在不知所然中也常常會找到幫手,於是,Linux這片森林就在不斷擴大面的,走進去能走出來的人更加困難。

關於L4, 有一段文字描述或許對你有啟發:

一般來講,目前公認的L4系統有2個特點,Fast IPC和Sigma0協議。Sigma0是一種基於IPC的記憶體管理協議,使用Sigma0,記憶體管理呈現出一種層次狀。舉例:有A和B兩個程式,如果程式B想使用程式A的記憶體。如果使用Sigma0,那麼很容易實現,只要把A設定為B的pager,並提供B的page fault handler程式就可以。在這種情況下,程式A和程式B依然具有不同的Address Space,A和B之間互相隔離(關於這種層次式的記憶體管理,請參考The sawmill framework for virtual memory diversity)。 但是如果使用Linux來實現這種樣式,除非使用share memory,想不出其它更好的辦法,但是share memory使得A和B之間有的Address Space有了交集,從security和safety兩個方面來講,都不是很好的解決方法。近年來,越來越多的L4系統開始支援一種新的特性-Capability, Capability是為了提高作業系統安全性而設計的,Capability和要訪問的Resource之間的關係類似於檔案描述符號和檔案之間的關係一樣,要訪問一個Resource,必須透過Capability來進行,Capability裡面規定了那麼資源可以被訪問等安全特性,Capability允許被grant(從一個使用者轉移到另外一個使用者),總之,Capability是比Access Control List更好的一種增強系統安全性的方法。

拋磚引玉,以下是reddit上討論的部分內容

—————————————————

Linux 多年來取得的成績毋庸多言。但最近,reddit 上有人發起了一個話題,想知道 Linux 的核心設計是否已經過時,並得到了一些有趣的答案。

這位 Ronis_BR 的使用者提問大致如下:

Linux 是在 1992 年啟動的,一些特性到現在都沒有改變。我猜想最新的作業系統核心設計技術(如果存在…)應該較之前有很大的進步。那 Linux 內核是否已經過時?

與 Windows、macOS、FreeBSD 內核的設計相比,Linux 內核的設計有沒有在哪些方面比較先進?(註意,重點是設計的先進,而不是哪一個更好)。

該話題引起了近 400 條回覆,大家紛紛發表了自己對核心設計的看法,節選幾條不同的觀點:

ExoticMandibles:

“過時”?不存在的。Linux kernel 對現代內核的設計其實是非常瞭解的,只是它選擇了保持傳統的形式。

核心設計的核心在於“安全/穩定”和“效能”之間的關係。Microkernels(微核心)以效能為代價保證安全。如果你有極小的微核心,那麼它將具有相對較小的 API surface,使其難以被攻擊。而且當你有一個錯誤的檔案時,驅動程式崩潰而不佔用核心,可以無損重啟。優越的穩定性!優越的安全性!一切很美好。

但這種方案的缺點是所有 IPC 永遠且不可避免的開銷。如果你的程式想從檔案載入資料,則必須訪問檔案系統驅動,這意味著 IPC 要處理行程背景關係切換和兩次 ring transitions 。然後,檔案系統驅動要求核心與硬體通訊,這也意味著兩次 ring transitions。然後檔案系統驅動傳送其回覆,這意味著又一輪的兩次,以及另一次背景關係切換。總開銷:兩次背景關係切換,兩次 IPC 呼叫和六次 ring transitions。非常貴!

單核心將所有裝置驅動合攏到核心中。所以當出現一個錯誤的圖形驅動,就可以佔用核心,或者如果它有一個安全漏洞,那麼可能被用來危及系統。但是,如果你的程式需要從磁碟載入某些東西,則會呼叫核心,進行 ring transitions,與硬體通話,計算結果,並傳回結果,進行另一個 ring transitions。總開銷:兩次 ring transitions。便宜得多,也快得多!

簡而言之,微內核是:“放棄效能來提高安全性和穩定性”;宏內核是:“保持效能,只要修複安全和穩定性問題就可以了”。而目前,大家更願意接受後者。

Scandalousmambo:

開發一個和 Linux kernel 相同的系統,從本質上決定了它一旦設計出來就會“過時”。

KugelKurt:

儘管這裡討論的大部分內容都是關於微核心與宏內核的關係,但是最近的研究還涉及到程式語言。如果你今天啟動一個全新的核心,那麼就可能不會用 C 去寫。微軟的 Singularity 和 Midori 專案探討了用 C#託管程式碼內核的可行性。

Daemonpenguin:

有一些概念,在理論上可以提供更好的核心設計。比如,理論上微核心也有一些非常好的設計選擇,使得它們具有便攜性、可靠性和潛在的自我修正能力。

然而,無論理論多麼好,人們總是會根據實際情況進行設計。Linux 核心擁有如此多的硬體支援,那麼多公司支援開發,其他核心(不管設計得多炫酷)都不太可能趕得上。

例如,MINIX 具有良好的設計和一些很棒的功能,但硬體支援很少,幾乎沒有人為此平臺開發。

歡迎大家就此事在下方回覆自己的看法。

贊(0)

分享創造快樂