為什麼有一個永不破壞使用者空間的 Linux 核心策略?
我開始在 Linux Kernel Mailing list 上的禮儀背景下考慮這個問題。作為世界上最著名、可以說是最成功和最重要的自由軟體項目,Linux 核心獲得了大量的新聞。項目創始人兼負責人 Linus Torvalds 顯然不需要在這裡介紹。
萊納斯偶爾會因為他在 LKML 上的火焰而引起爭議。他自己承認,這些火焰通常與破壞使用者空間有關。這讓我想到了我的問題。
我可以對為什麼破壞使用者空間是一件壞事有一些歷史觀點嗎?據我了解,破壞使用者空間需要在應用程序級別進行修復,但如果它改進了核心程式碼,這是一件壞事嗎?
據我了解,Linus 聲明的政策是不破壞使用者空間勝過其他一切,包括程式碼質量。為什麼這如此重要,這種政策的利弊是什麼?
(這種政策顯然有一些缺點,一直適用,因為 Linus 偶爾會與他在 LKML 上的高級副手在這個話題上發生“分歧”。據我所知,他總是在這件事上有所作為。)
原因不是歷史原因,而是實際原因。有很多很多程序執行在 Linux 核心之上。如果核心介面破壞了這些程序,那麼每個人都需要升級這些程序。
現在確實大多數程序實際上並不直接依賴於核心介面(系統呼叫),而只依賴於C 標準庫的介面(圍繞系統呼叫的C包裝器)。哦,但是哪個標準庫?格利布?uClibC? 飲食庫?仿生?穆斯林?等等
但也有許多程序實現了特定於作業系統的服務,並且依賴於標準庫未公開的核心介面。(在 Linux 上,其中許多是通過
/proc
和提供的/sys
。)然後是靜態編譯的二進製文件。如果核心升級破壞了其中之一,唯一的解決方案是重新編譯它們。如果您有來源:Linux 也支持專有軟體。
即使資源可用,收集所有資源也可能很痛苦。特別是當您升級核心以修復硬體錯誤時。人們經常獨立於系統的其餘部分升級他們的核心,因為他們需要硬體支持。用 Linus Torvalds的話來說:
破壞使用者程序是不可接受的。(…) 我們知道人們使用舊的二進製文件已經很多年了,製作一個新版本並不意味著你可以把它扔掉。您可以信任我們。
他還解釋說,將這一規則作為一個強有力的規則的一個原因是避免依賴地獄,在這種情況下,您不僅必須升級另一個程序才能讓一些更新的核心工作,而且還必須升級另一個程序,另一個,另一個,因為一切都取決於一切的某個版本。
有一個明確定義的單向依賴關係是可以的。這是可悲的,但有時是不可避免的。(…) 不能有雙向依賴。如果使用者空間 HAL 程式碼依賴於新核心,那沒關係,儘管我懷疑使用者希望它不是“本週的核心”,而更多的是“過去幾個月的核心”。
但是如果你有一個雙向依賴,你就完蛋了。這意味著您必須同步升級,這是不可接受的。這對使用者來說很可怕,但更重要的是,這對開發人員來說很可怕,因為這意味著你不能說“發生了錯誤”並做一些事情,比如嘗試用二等分或類似的方法縮小範圍。
在使用者空間中,通常通過保持不同的庫版本來解決這些相互依賴關係;但是你只能執行一個核心,所以它必須支持人們可能想用它做的所有事情。
正式地,
向後兼容
$$ system calls declared stable $$將保證至少2年。
但在實踐中,
大多數介面(如係統呼叫)預計永遠不會改變並且始終可用。
更經常改變的是那些只打算由硬體相關程序使用的介面,在
/sys
. (/proc
另一方面,自從引入以來,它/sys
一直保留給與硬體無關的服務,幾乎不會以不兼容的方式中斷。)總之,
破壞使用者空間需要在應用程序級別進行修復
這很糟糕,因為只有一個核心,人們想要獨立於系統的其餘部分進行升級,但是那裡有許多具有復雜相互依賴性的應用程序。保持核心穩定比讓數千個應用程序在數百萬個不同的設置上保持最新更容易。