?? 3.txt
字號:
第3章 內核體系結構概述本章從較高層次上對內核進行說明。從順序上來說,本章首先介紹內核設計目標,接下來介紹內核體系結構,最后介紹內核源程序目錄結構。3.1 內核設計目標Linux 的內核展現出了幾個相互關聯的設計目標,它們依次是:清晰性、兼容性、可移植性、健壯性、安全性和速度。這些目標有時是互補的,有時則是矛盾的。但是它們被盡可能的保持在相互一致的狀態,內核設計和實現的特性通常都要回歸到這些問題上來。本節接下來的部分將分別討論這些設計目標,同時還將對它們之間的取舍與平衡進行簡要的說明。3.1.1 清晰性稍微簡化點說,內核目標是在保證速度和健壯性的前提下盡量清晰。這和現在的大多數應用程序的開發有所區別,后者的目標通常是在保證清晰性和健壯性的基礎上盡量提高速度。因而在內核內部,速度和清晰性經常是一對矛盾。在某種程度上,清晰性是健壯性的必要補充:一個很容易理解的實現方法比較容易證明是正確的;或者即使不正確,也能比較容易的找出其問題所在。從而這兩個目標很少會發生沖突。但是清晰性和速度通常卻是一對矛盾。經過仔細手工優化的算法通常都使用了編譯器生成代碼的類似技術,很少可能是最清晰的解決方案。當內核中清晰性和速度要求不一致時,通常都是以犧牲清晰性來保證速度的。即便如此,程序員仍然清楚地知道清晰性的重要性,而且他們也做了大量的工作以使用最清晰的方法保證速度。3.1.2 兼容性正如第1章中所述,Linux最初的編寫目的是為了實現一個完整的、與Unix兼容的操作系統內核。隨著開發過程的展開,它也開始以符合POSIX標準為目標。就內核而言,兼容Unix(至少是同某一現代的Unix實現相兼容)和符合POSIX標準并沒有什么區別,因此我們也不會在這個問題上詳細追究。內核提供了另外一種類型的兼容性。基于Linux 的系統能夠提供可選擇的對Java.class文件的本地運行支持(據說Linux是第一個提供這種支持的操作系統)。盡管實際負責Java程序解釋執行的是另外一個Java虛擬機進程,該虛擬機并沒有內置到內核中。但是內核提供的這種機制可以使得這種支持對用戶是透明的。通過內核本身提供的程度不同的支持(這并不代表大部分工作像Java的解決方式一樣能夠通過外部進程實現),對其他可執行文件格式的支持也能夠以同樣的方式插入內核中。這方面的內容將在第7章中詳細介紹。另外需要說明的是,GNU/Linux系統作為一個整體通過DOSEMU仿真機器提供了對DOS可執行程序的支持,而且也通過WINE設計提供了對Windows可執行程序的部分支持。系統還以同樣的方式通過SAMBA提供了對Windows兼容文件和打印服務的支持。但是這些都不是同內核密切相關的問題,因此在本書中我們不再對它們進行討論。兼容性的另外一個方面是兼容異種文件系統,本章中稍后會有更為詳細的介紹,但是大部分內容已經超出了本書的范圍。Linux能夠支持很多文件系統,例如ext2(“本地”文件系統)、ISO-9660(CD-ROM使用的文件系統)、MS-DOS、網絡文件系統(NFS)等許多其他文件系統。如果你有使用其他操作系統格式的磁盤或者一個網絡磁盤服務器,那么Linux將能夠和這些不同的文件系統進行交互。兼容性的另外一個問題是網絡,這在當今Internet流行的時代尤為重要。作為Unix的一個變種,Linux自然從很早就開始提供對TCP/IP的支持。內核還支持其他許多網絡協議,它們包括AppleTalk協議的代碼,這使得Linux單元可以和Macintosh機自由通訊;Novell的網絡協議,也就是網絡報文交換(IPX),分組報文交換(SPX)和NetWare核心協議(NCP);IP協議的新版本IPv6以及其它一些不太出名的協議。兼容性考慮的最后一個方面是硬件兼容性。似乎每個不常見的顯卡、市場份額小的網卡、非標準的CD-ROM接口和專用磁帶設備都有Linux的驅動程序(只要它不是專為特定操作系統設計的專用硬件)。而且只要越來越多的廠商也逐漸認識到Linux的優勢,并為更容易地實現向Linux上移植而開放相應的源程序代碼,Linux對硬件支持會越來越好。這些兼容性必須通過一個重要的子目標:模塊度(modularity)來實現。在可能的情況下,內核只定義子系統的抽象接口,這種抽象接口可以通過任何方法來實現。例如,內核對于新文件系統的支持將簡化為對虛擬文件系統(VFS)接口的代碼實現。第7章中介紹的是另外一個例子,內核對二進制句柄的抽象支持是實現對諸如Java之類的新可執行格式的支持的方法。增加新的可執行格式的支持將轉變為對相應的二進制句柄接口的實現。 3.1.3 可移植性與硬件兼容性相關的設計目標是可移植性,也就是在不同硬件平臺上運行Linux的能力。系統最初是為運行在標準IBM兼容機上的Intel x86 CPU而設計的,當時根本沒有考慮到可移植性的問題。但是從那以后情況已經發生了很大的變化。現在正式的內核移植包括向基于Alpha、ARM、Motorola 68x0、MIPS、PowerPC、SPARC及SPARC-64 CPU系統的移植。因而,Linux可以在Amigas、舊版或新版的Macintosh、Sun和SGI工作站及NeXT機等機器上運行。而且這些還只是標準內核發行版本的移植范圍。從老的DEC VAX到3Com掌上系列個人數字助理(例如Palm III)的非正式的移植工作也在不斷進行中。成功的非正式移植版本后來通常都會變成正式的移植版本,因此這些非正式的移植版本很多最終都會出現在主開發樹中。廣泛平臺支持之所以能夠成功的部分原因在于內核把源程序代碼清晰地劃分為體系結構無關部分和體系結構相關部分。在本章的后續部分將對這個問題進行更深入的討論。3.1.4 健壯性和安全性Linux必須健壯、穩定。系統自身應該沒有任何缺陷,它還應該可以保護進程(用戶)以防止互相干擾,這就像把整個系統從其他系統中隔離開來加以保護一樣。后一種考慮很大程度上是受信任的用戶空間應用程序領域的問題,但是內核至少也應該提供支撐安全體系的原語(primitive)。健壯性和安全性比任何別的目標都要重要,包括速度。(系統崩潰的速度很快又有什么好處呢?)保證Linux健壯性和安全性的唯一一個最重要的因素是其開放的開發過程,它可以被看作是一種廣泛而嚴格的檢查。內核中的每一行代碼、每一個改變都會很快由世界上數不清的程序員檢驗。還有一些程序員專門負責尋找和報告潛在的缺陷—他們這樣做完全是出于自己的個人愛好,因為他們也希望自己的Linux系統能夠健壯安全。以前檢查中所沒有發現的缺陷可以通過這類人的努力來定位、修復,而這種修復又合并進主開發樹以使所有的人都能夠受益。安全警告和缺陷報告通常在幾天甚至幾個小時內就能夠得到處理和修復。Linux可能并不一定是現有的最安全的操作系統(很多人認為這項桂冠應該屬于OpenBSD,它是一個以安全性為主要目標的Unix變種),但是它是一個有力的競爭者。而且Linux健壯性遠沒有發展到盡頭。3.1.5 速度這個術語自己就可以說明問題。速度幾乎是最重要的衡量標準,雖然其等級比健壯性、安全性和(在有些時候)兼容性的等級要低。然而它卻是代碼最直觀的幾個方面之一。Linux內核代碼經過了徹底的優化,而最經常使用的部分—例如調度,則是優化工作的重點。幾乎在任何時候都有一些不可思議的代碼,這是由于這種方式的執行速度比較快(這并不總是很明顯,但是你經常不得不通過自己的試驗來對這種優化代碼進行確認)。雖然有時一些更直接的實現方法速度也很快,但是我所見過的這種情況很少。在某些情況下,本書推薦用可讀性更好的代碼來替代那些打著速度的名義而被故意扭曲了的代碼。雖然速度是一個設計目標,但我基本上只在以下兩種情況時才會這樣做:a) 在所考慮的問題中,速度明顯不是關鍵問題 b) 沒有其他的辦法。3.2 內核體系結構初識圖3-1是一種類Unix操作系統的相當標準的視圖,實際上,更細致地說,該圖能夠說明所有期望具有平臺無關特性的操作系統。它著重強調了內核的兩個特性:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -