Linux核心

Linux核心等。工作於平板電腦、智慧手機及智慧手錶的Android作業系統同樣透過Linux核心提供的服務完成自身功能。儘管於桌面電腦的佔用率較低，基於Linux的作業系統統治了幾乎從移動裝置到主機的其他全部領域。截至2017年11月，世界前500臺最強的超級計算機全部使用Linux。Linux核心最早是於1991年由芬蘭駭客林納斯·託瓦茲為自己的個人電腦開發的，他當時在Usenet新聞組codice_1登載帖子，這份著名的帖子標誌著Linux核心計劃的正式開始。如今，該計劃已經拓展到支援大量的計算機體系架構，遠超其他作業系統和核心。它迅速吸引了一批開發者和使用者，利用它作為其他自由軟體專案的核心，如著名的 GNU 作業系統。而今天，Linux 核心已接受了超過1200家公司的近12000名程式設計師的貢獻，其中包括一些知名的軟硬體發行商。從技術上說，Linux 只是一個符合POSIX 標準的核心。它提供了一套應用程式介面。Linux 核心是在GNU通用公共許可證第2版之下發布的，是一個開源專案協作的突出例子。它的版本支援根據版本最長可達6年，貢獻者遍佈世界各地，日常開發相關的討論在上。歷史.1991年，林納斯·託瓦茲，一名21歲的就讀於芬蘭赫爾辛基大學的計算機科學專業學生，基於一些簡單的想法，打算編寫一個作業系統核心。他透過英特爾80386組合語言的任務切換器和一個終端驅動程式開始工作。8月25號，他在codice_1新聞組裡發了一封帖子：我在做個。我現在已經移植了bash(1.08)和gcc(1.40)， 而且看起來奏效了。這意味著我會在幾個月內得到一些實用的東西。「……」是的——它沒有任何minix程式碼，並且它有一個多執行緒的fs。它不可移植，而且它可能永遠不會支援除AT硬碟之外的其他東西，因為我只有這些:-(。「……」它基本上是用C語言寫的，但是大多數人可能不會把我寫的東西叫做C語言。它使用我能找到的386的每個可以想象的特性，因為它也是一個教我關於386的功能的專案。我前面提到過，它使用記憶體管理單元來進行分頁幾乎用了和C一樣多的彙編。「……」不像minix，我也碰巧喜歡中斷，所以中斷將在不試圖隱藏背後的原因的情形下被處理。之後，許多人為這個專案貢獻了程式碼。在早期，MINIX社群向 Linux 核心貢獻了程式碼和想法。當時，GNU 專案已經建立了許多自由作業系統所需的元件，但是它自己的核心 GNU Hurd 尚不完整且無法使用；而BSD作業系統還沒有擺脫合法的阻礙。因此，儘管早期版本的 Linux 功能有限，但它迅速獲得了開發人員和使用者。到1991年9月，Linux核心版本 0.01 在芬蘭大學和研究網路上釋出。它有10,239行程式碼。在1991年10月，0.02版本的核心釋出了。1991年12月，0.11版本的核心釋出。由於它可以由執行相同核心版本的計算機編譯，因此該版本是第一個 Linux 核心。當託瓦茲於1992年2月釋出0.12版本時，他採用了 GNU 通用公共許可證，而不是以前的自行起草的許可證，原先的許可證不允許商業再分發。1992年1月19日，第一篇文章提交給新的新聞組codice_3出現。1992年3月31日，該新聞組更名為 codice_4。X Window 系統隨後被移植到Linux上，所以在1992年3月，Linux 0.95 是第一個能夠執行X的版本。從0.1x到0.9x的版本號大幅跨越是因為期望沒有大的缺失部分的版本1.0的即將出現。然而，這被證明是錯誤的。從1993年到1994年初，出現了0.99版本的15個開發版本。1994年3月14日，Linux核心1.0.0釋出，共176,250行程式碼。隨後的1995年3月，有310,950行程式碼的 Linux 核心1.2.0釋出。在1996年6月9日釋出的 Linux核心2.0版本之後，以2.0為大版本的主要更新有如下這些：從2004年開始，釋出過程發生了變化，新的核心每隔2-3個月定期釋出，編號為2.6.0、2.6.1，直到2.6.39。2011年7月21日，Torvalds宣佈釋出Linux核心3.0：“2.6. 的日子過去了”。與Linux 2.6.39相比，大的技術變化同版本躍升沒有關係；它標誌著核心的20週年紀念。基於時間的釋出過程保持不變。2013年6月釋出的Linux核心版本3.10包含15,803,499行程式碼，而2015年6月釋出的4.1版本已發展到超過1950萬行程式碼，由近14000名程式設計師貢獻。塔能鮑姆-林納斯辯論.Linux不是微核心架構的事實曾經引起了林納斯·託瓦茲與安德魯·斯圖爾特·塔能鮑姆之間一場著名的爭論。1992年在Usenet討論群組comp.os.minix開始了一場網路論戰，討論的主題在於作業系統架構的選擇。稍後一些著名的駭客也加入討論，如大衛·米勒、曹子德。這場辯論影響了Linux核心的設計走向。塔能鮑姆認為Linux核心採用的宏核心已經過時了，應該採取比較先進的微核心架構，引起了林納斯的反擊。在2006年5月9日，這個主題被重新審視，並且在2006年5月12日塔能鮑姆寫了一份立場宣告。架構.Linux是一個單體核心，支援真正的搶佔式多工處理、記憶體管理、Internet協議族和執行緒等功能。裝置驅動程式和核心擴充套件運行於核心空間，可以完全訪問硬體，但也有運行於使用者空間的一些例外，例如基於FUSE/CUSE的檔案系統，和部分UIO。多數人與Linux一起使用的圖形系統不執行在核心中。與標準單體核心不同，Linux的裝置驅動程式可以輕易的配置為核心模組，並在系統執行期間可直接裝載或解除安裝。也不同於標準單體核心，裝置驅動程式可以在特定條件下被搶佔；增加這個特徵用於正確處理硬體中斷並更好的支援對稱多處理。出於自願選擇，Linux核心沒有二進位制核心介面。硬體也被整合入檔案層級中。使用者應用到裝置驅動的介面是在#重定向 或#重定向 目錄下的入口檔案。程序資訊也透過#重定向 目錄對映到檔案系統。程式語言.Linux是用C語言中的GCC版。包括Perl、Python和多種指令碼語言。有一些驅動可能是用C++、Fortran或其他語言寫的，但是這樣是強烈不建議的。編譯器相容性.GCC是Linux核心原始碼的預設編譯器。在2004年，Intel主張透過修改核心，以便Intel C++編譯器能正確編譯核心。在2009年，有透過修改核心2.6.22版而成功編譯的報告。自從2010年，已經開始進行使用Clang建造Linux核心的努力，Clang是一個可作為替代的C語言編譯器；截止2014年4月12日，官方核心幾乎可以完全用Clang編譯。致力於這個目標的計劃叫做“LLVMLinux”，得名於Clang所基於的LLVM編譯器下部構造。LLVMLinux不意圖複製Linux核心或LLVM，因此它是由最終提交給上游計劃的補丁構成的一個元計劃。使Linux核心可以用Clang編譯最大的好處是比GCC有更快的編譯速度，核心開發者可以得益於由此而來的更快的工作流程。介面.符合標準是Linux核心內部的普遍策略。另一個規則是Linux核心主線不接受只由專有使用者空間軟體使用的核心模組。核心至使用者空間API.原始碼可移植性確保符合標準的C程式可以在符合同樣標準的任何系統上編譯和執行。Linux核心開發、GNU C函式庫和相關的實用工具致力於追隨POSIX和單一UNIX規範。是核心的系統呼叫介面。核心至使用者空間API.二進位制可移植性將保證任何程式在符合標準的給定硬體平臺上一旦編譯透過，可以在符合同樣標準的任何其他硬體平臺上以編譯後的形式執行。二進位制可移植性是在基於Linux核心的作業系統上建造獨立軟體供應商。核心內API.在不同子系統間使用了數個核心內部API。其中一些是跨越多個發行版保持穩定的，另一些則不然。對於核心內API不作擔保。維護者和貢獻者可以在任何時候增加或變更它們。核心內API的例子包括針對下列類別裝置驅動程式的軟體框架/API：核心內ABI.Linux核心開發者選擇不維護穩定的核心內ABI。技術特性.搶佔式排程系統.Linux核心提供在特定條件下的搶先式排程。直到核心版本2.4，只有使用者程序是搶先式的，就是說除了時間片用盡，在使用者模式下執行的當前程序，如果有更高態優先順序的程序進入codice_5狀態，它就會被中斷。自從2.6系列Linux核心，增加了中斷執行核心程式碼的任務的能力，但不是對於核心程式碼的所有段落。Linux核心含有不同的排程器類。核心預設使用的排程機制叫做完全公平排程器，它介入於核心版本2.6.23。這個預設排程器類在內部也叫做codice_6，而核心還含有兩個遵循POSIX的實時排程類，分別叫做codice_7，二者都優先於預設類。透過使用實時Linux核心補丁codice_9，可以支援對關鍵段落、中斷處理器和“中斷禁用”程式碼序列的完全搶先。 實時Linux核心補丁部分地整合入主線核心已經帶給它一些功能。搶先機制改善延遲、增進響應性，並使得Linux更加適合桌面和實時應用。老版本核心有所謂的，用於鎖定粒度為整個核心的同步，它最終由Arnd Bergmann在2011年移除了。還有叫做codice_10的排程策略，實現了演算法，它增加於2014年3月30日發行的核心版本3.14。可移植性.儘管林納斯·託瓦茲的初衷不是使Linux成為一個可移植的作業系統，今天的Linux卻是全球被最廣泛移植的作業系統核心。從行動電話到超級電腦，甚至於有人成功的將Linux核心在索尼出品的遊戲機PS2及PS3和微軟出品的遊戲機Xbox上使用。Linux也是IBM超級計算機Blue Gene的作業系統。直至2011年11月，全球前五百大超級電腦有高達91.4%的比例採用Linux為它們的作業系統。一些為手機開發的作業系統，使用Linux核心的修改後的版本，其中包括谷歌Android、Firefox OS、HP WebOS和諾基亞Maemo。核心錯誤和oops.在Linux中，核心錯誤是指作業系統在監測到核心系統內部無法恢復的錯誤，相對於在使用者空間程式碼類似的錯誤。作業系統試圖讀寫無效或不允許的記憶體地址是導致核心錯誤的一個常見原因。核心錯誤也有可能在遇到硬體錯誤或作業系統BUG時發生。在許多情況中，作業系統可以在記憶體訪問違例發生時繼續執行。然而，系統處於不穩定狀態時，作業系統通常會停止工作以避免造成破壞安全和資料損壞的風險，並提供錯誤的診斷資訊。在Linux上，oops即Linux核心的行為不正確，併產生了一份相關的錯誤日誌。許多型別的oops會導致核心錯誤，即令系統立即停止工作，但部分oops也允許繼續操作，作為與穩定性的妥協。這個概念只代表一個簡單的錯誤。當核心檢測到問題時，它會列印一個oops資訊然後殺死全部相關程序。oops資訊可以幫助Linux核心工程師除錯，檢測oops出現的條件，並修復導致oops的程式錯誤。安全.計算機安全是一個非常公眾化的主題，關係到Linux核心，因為大量在核心中的錯誤可能成為潛在的安全漏洞，是否允許提升許可權漏洞或拒絕服務攻擊源漏洞。在過去的幾年中，許多這樣的缺陷被發現，並在Linux核心中被修補好。新的安全功能被繼續實現，以解決在Linux核心中的電腦不安全問題。批評者指責核心開發人員，稱他們掩蓋安全漏洞。2008年，作為回應，Torvalds稱：「個人認為，安全漏洞只是『正常的漏洞』。這些漏洞我並不去掩蓋，不過我不認為應當把它們特殊化，更不認為應該追蹤並公示它們……我不理會整個安全團隊，原因之一就是，我認為這些漏洞不僅美化還鼓勵了錯誤的行為。這令安全人員成了『英雄』，就猶如不修補正常漏洞的人就不值一提似的。而事實上，所有無聊的正常漏洞極為重要，僅僅因為它們實在太多了。我不認為該美化和關心那些嚴重的安全漏洞——它們並不及那些由死鎖造成的隨機嚴重崩潰來得更特殊。」如2012年五月，SYSRET指令被發現在AMD和英特爾處理器間在實現方面有差異，這個差異在Windows、FreeBSD、XenServer和Solaris這些主流作業系統會導致漏洞。2012年六月，Linux核心中該問題已被修復。2021年，來自明尼蘇達大學的研究人員，曾藉由貢獻修補程式至Linux核心的名義，利用修補程式匯入臭蟲或漏洞，以觀察Linux核心社群的反應，再度故技重施時，被發現後封鎖了所有來自該大學的貢獻，與移除過去該大學曾經貢獻的程式碼。開發.開發者社群.截止2007年，核心開發已經從20位最活躍開發者寫80%的程式碼轉變為頂端30人寫30%的程式碼，而頂端開發者花費更多的時間稽核變更。 開發者還可以按從屬關係來歸類；在2007年，頂端類屬是“不知名”而頂端公司是Red Hat，它佔有12%的貢獻，而知名業餘愛好者佔3.9%。 在2007年中所做核心變更已經由超過1900位開發者提交。一般假定Linux核心開發者社群由5000或6000名成員組成。Linux基金會發表的2016年Linux核心開發報告的更新表明，從版本3.18類屬。開發過程與模式.一個想要對 Linux 核心進行修改的開發者一般就從對那個修改的開發和測試開始著手。接下來的過程取決於變化的重要程度，及修改該變更的子系統數量是由單個還是多個修補程式組成。如果僅僅是修改了由單個維護人員維護的單個子系統，那麼這些修改的補丁程式碼就直接透過Cc中某個郵件列表傳送給相關的維護人員。郵件列表的閱讀者和子系統的維護人員將檢查補丁程式碼並提供反饋。一旦審查過程完成，維護者接受他核心程式碼樹中的補丁。如果這些更改被認為是夠重要的錯誤修復，那麼包含這些修補程式的拉取請求將在幾天內傳送給Linus。否則，將在下一個合併視窗時向Linus傳送拉取請求。合併視窗通常會持續兩週，並在之前的核心版本釋出後立即啟動。Linus Torvalds擁有對Linux核心能夠接受哪些更改和誰可以成為維護者的最終決定權。核心維護者在他們自願放棄之前將維持他們的角色。目前，沒有任何已知的核心維護者被要求退出。此外，還沒有一個核心維護者因與其他維護者的互動風格的因素而受到Linus批評的例子。這為維護者提供了寬鬆的社群空間。雖然核心開發社群的文化多年來有所改善，但曾有一段時間它的聲譽很糟糕。認為自己遭受了不公正對待的開發者可以向Linux基金會的技術專家委員會報告。儘管如此，一些社群成員仍然不認同現在的討論氛圍。同 Linux 發行版的關係.大多數Linux使用者執行一個由他們 Linux 發行版提供的核心。一些發行版搭載的是 Linux 的通用核心而言更新的速度更慢一些，但是同樣會包括所有相關的穩定版本分支的補丁。此外，他們同時也會增添一些新特性和對新硬體的支援，而這些支援是這些發行商分支基於的穩定分支所不包括的。重新開發的估價.按照傳統商業軟體開發的方式，重新開發Linux 2.6.0核心的估計代價將是6.12億美元。截至2011年1月4日，使用當前的程式碼行，才能夠重新開發Linux的核心。版本命名.Linux核心有三個不同的命名方案。早期版本：第一個版本的核心是0.01，其次是0.02,0.03,0.10,0.11,0.12（第一GPL版本),0.95,0.96,0.97,0.98,0.99及1.0。，從0.95版有許多的補丁釋出於主要版本版本之間。舊計劃釋出後，人們認識到，更短的釋出週期將是有益的。自那時起，版本的格式為A.B.C.D，其中A,B,C,D代表：A和B是無關緊要的，C是核心的版本，D是安全補丁。自3.0釋出後，則延續3.A.B的命名格式，只是將主版號變更為4。法律層面.許可證.原先託瓦茲將 Linux 置於一個禁止任何商業行為的條例之下，但0.12版本之後改用 GNU 通用公共許可證第二版。 該協議允許任何人對軟體進行修改或發行，包括商業行為，只要其遵守該協議，所有基於Linux的軟體也必須以該協議的形式發表，並提供原始碼。託瓦茲曾經公開聲稱將Linux置於GNU通用公共許可證之下是他一生中所做的“最好的決定”。GPL第三版.Linux 核心明確地僅發表在 GNU 通用公共許可證以及這種更改是否合乎需要，存在著相當多的爭論。 託瓦茲本人在版本2.4.0的釋出中明確指出，他自己的程式碼僅在版本2下發布。然而，GPL的條款規定，如果沒有指定版本，那麼可以使用任何版本；並且艾倫·考克斯指出，很少有其他 Linux 貢獻者指定了特定版本的 GPL。2006年9月，對29位關鍵核心程式設計師的調查顯示其中的28位更傾向於使用 GPL 第二版草案。 託瓦茲評論說：“我認為一些外界人士...相信我才是那個古怪不合群的人，因為我這麼大張旗鼓地不做 GPLv3 的忠實粉絲。”這些高水平的核心開發者就大眾媒體對 GPLv3 的反對發表了評論，其中包括林納斯·託瓦茲本人、葛雷格·克羅哈曼和安德魯·莫頓。他們提到有關DRM/、專利及“附加限制”的條款，並警告GPLv3對“開源宇宙”的巴爾幹化。決定不採用 GPLv3 作為 Linux 核心許可證的託瓦茲在幾年後重申了他的批評。韌體爭議.許可證爭議的一個重點是Linux使用韌體二進位包以支援某些硬體裝置。理察·馬修·斯托曼認為這些東西讓Linux某部份成為非自由軟體，甚至以此散佈Linux更會破壞GPL，因為GPL需要完全可獲取的原始碼。林納斯·託瓦茲及Linux社群中的領導者，支援較寬鬆的許可證，不支援理察·馬修·斯托曼的立場。社群中的Linux-libre提供完整的自由軟體韌體。載入式核心模組許可證.另一個爭論點，就是載入式核心模組是否算是智慧財產權下的衍生創作，意即LKM是否也受GPL約束？託瓦茲本人相信LKM僅用一部分「公開」的核心介面，因此不算衍生創作，因此允許一些僅有二進位包裹的驅動程式或不以GPL宣告的驅動程式用於核心。但也不是每個人都如此同意，且託瓦茲也同意很多LKM的確是純粹的衍生創作，也寫下「基本上，核心模組是衍生創作」這樣的句子。另一方面託瓦茲也說過：有時候一些驅動程式原先並非為Linux設計，而是為其他作業系統而作，這是個灰色地帶……這「的確」是個灰色地帶，而我個人相信一些模組可視為非Linux衍生創作，是針對Linux設計，也因此不會遵守Linux訂下的行為準則。特別像繪圖卡驅動程式就有非常大的爭議，也許到最後得由立法機關給個答案。SCO爭議.在2003年3月，SCO Group對IBM提告，聲稱IBM將一些在SCO智慧財產權許可證保護下的Unix原始碼植入Linux中，破壞了SCO給予IBM的原始碼使用許可權。另外SCO也發出一大堆存證函給許多公司，警告他們在沒有SCO許可權的情況下使用了Linux，此舉可能導致侵犯智慧財產權，並且以起訴為手段對個別使用者施壓。SCO也同時對Novell、戴姆勒克萊斯勒，法院認定Novell才是Unix商標的合法擁有者，而不是SCO。2010年3月20日，美國聯邦第十巡迴上訴法院宣判，Novell才是UNIX與UnixWare商標的合法擁有者。此項判決宣佈後，已進入破產保護程式的SCO公司，決定停止繼續提出訴訟。