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