Linux 2.6內(nèi)核的精彩世界
Linux 2.6內(nèi)核的精彩世界
Joseph Praneich
Linux內(nèi)核2.6版的開發(fā)已經(jīng)接近尾聲,2.6測試版發(fā)布已經(jīng)二個月了,正式版預計明年年初發(fā)布。作為一個主要發(fā)布版本,2.6相對于2.4有很大的改動;它引入了許多新的特性,同樣也去除很多過時的特性。它在哪些方面有大的改動?它對Linux的開發(fā)人員以及其他層面的Linux用戶可能有什么樣的影響?閱讀本文,您將得到答案。--譯者
盡管我們第一次啟動Linux 2.4似乎只是昨天的事,時間已經(jīng)流走,內(nèi)核開發(fā)團隊的2.6版內(nèi)核開發(fā)工作已經(jīng)接近完成了。本文將試圖描述2.6內(nèi)核中的許多新特性(側重i386平臺的Linux)。和封閉源碼的軟件的預發(fā)布不一樣的是,這里所描述的所有特性當前都是2.5版內(nèi)核開發(fā)樹中可用的(其中一些的bug少一些,另一些bug多一些)。(按照Linux的傳統(tǒng),偶數(shù)版本的內(nèi)核是穩(wěn)定的,奇數(shù)版本的只是開發(fā)用的)。也就是說,這里所描述的一些特性在實際的2.6版本中仍可能被去除或標志為"experimental"(試驗性)。然而內(nèi)核當前處于特性凍結(feature-freeze)時期,最終的發(fā)行版本應該不大可能過于偏離這里的描述。同時也應該清楚這里描述的一些"新"特性在第一次出現(xiàn)在2.6系列內(nèi)核后,可能被向后移植到了官方的或者發(fā)行版供應商的2.4版內(nèi)核之中。
或許使得這篇文章更為晦澀的是,即將到來的內(nèi)核的版本號至今仍未確定。最可能使用的版本號是2.6,但是一些人提議版本號可以使用3.0,因為這個版本中包含了NUMA以及無MMU系統(tǒng)的支持。為論述方便,本文將一直使用2.6作為即將到來的內(nèi)核的版本號。
您正在閱讀的是本文檔(《Linux 2.6內(nèi)核的精彩世界》)非正式版的第一版,完稿于2003年7月13日,基于2.5.75開發(fā)版內(nèi)核。隨著Linux內(nèi)核最后工作的完成,這份文檔將發(fā)布其他非正式版,但是這份文檔的正式版直到2.6的最后發(fā)布才宣告完成。由于本文是非正式版的第一版,其中可能有錯誤或者疏漏;如果您發(fā)現(xiàn)了它們,請告訴我,我將很高興地去修正它們。
到目前為止的故事...
Linux內(nèi)核始于1991年由Linus Torvalds為他的386開發(fā)的一個類Minix的操作系統(tǒng)。Linus初始曾想命名為這個系統(tǒng)為Freax,但很幸運的是最后他最后沒有那樣做。Linux 1.0的官方版發(fā)行于1994年3月,包含了386的官方支持,僅支持單cpu系統(tǒng)。Linux 1.2發(fā)行于1995年3月,它是第一個包含多平臺(Alpha,Sparc,Mips等)支持的官方版本。Linux 2.0發(fā)行于1996年6月,包含很多新的平臺支持,但是最重要的是,它是第一個支持SMP(對稱多處理器)體系的內(nèi)核版本。Linux 2.2在1999年1月到來,它帶來了SMP系統(tǒng)上性能的極大提升,同時支持更多的硬件。最后,Linux 2.4于2001年1月發(fā)布,它進一步地提升了SMP系統(tǒng)的擴展性,同時它也集成了很多用于支持桌面系統(tǒng)的特性:USB,PC卡(PCMCIA)的支持,內(nèi)置的即插即用,等等。Linux 2.6不僅包含了這些特性,同時也是一個無論對相當大的系統(tǒng)還是相當小的系統(tǒng)(PDA等)的支持都有很大提升的"大跨越"。
多種平臺支持
能夠支持相當廣泛的硬件和平臺,是采用Linux作為內(nèi)核的操作系統(tǒng)(比如 GNU操作系統(tǒng), 系統(tǒng)和環(huán)境常常是和Linux一塊分發(fā)。Linux一般不被認為是獨立的操作系統(tǒng),只是操作系統(tǒng)的內(nèi)核。)的優(yōu)勢之一。Linux自1.2版就開始包含對新的處理器類型和特性的支持,最新的Linux 2.6內(nèi)核發(fā)布版本也不例外。這種趨勢不會直接影響到Linux在Intel平臺下的使用,同時使得Linux能在盡可能大的范圍內(nèi)被使用,這一點非常重要。
小規(guī)模 - 嵌入式系統(tǒng)中的Linux
Linux 2.6 擴展多平臺支持的一個主要途徑就是把uClinux的大部并入了主流內(nèi)核(mainstream kernel)。uCLinux(可以發(fā)音為"you-see-Linux",但更正確的拼寫,首字母應該式希臘字母"mu")是將Linux應用在微控制器平臺的項目。很多年來,這個Linux分支為許多嵌入式芯片提供了支持,把它更多的集成到主流內(nèi)核中是一件非常有意義的事。
不像通常的Linux移植版本,這里描述的嵌入式移植版由于硬件限制和通常的Linux相比,不具有所有類似的特性。主要的區(qū)別在于:這些移植版是針對于沒有內(nèi)存管理單元(MMU)的處理器的(Intel的CPU從386開始就有MMU了)。缺少MMU的支持,運行真正的多任務系統(tǒng)時,任務之間沒有內(nèi)存保護機制(因此任何程序都可以使得其他程序崩潰),一些有關進程派生的系統(tǒng)調(diào)用也無法實現(xiàn)。正是因為沒有內(nèi)存保護機制(或者說,沒有任何安全性可言),它們不適用于多用戶系統(tǒng)。
在對嵌入式處理器支持上,Linux 2.6有四個主要的新進步。首先是對Motorola的新型嵌入式m68k系列處理器移植。這些被命名為Dragonball或是ColdFire的處理器可以在Motorola,Lineo,Arcturus或是其他廠商生產(chǎn)的系統(tǒng)或是評估板上找到。大多數(shù)Linux用戶應該對這些處理器相當熟悉,因為從Palm 1000到最新的Palm III,他們一直是Palm Pilots的心臟。不幸的是,對早期沒有MMU的m68k處理器(比如早期蘋果機上使用的68000系列)還沒有支持。最新支持的嵌入式平臺還包括日立(Hitachi)的H8/300系列(不包含H8S,但可能會盡快地集成進來)以及NEC v850處理器。
無論怎么強調(diào)Linux 2.6旨在支持無MMU系統(tǒng)的主要體系結構變化,都不為過分。所有Linux的前期版本,不論直接或是間接,都起源于Linus最初在Intel 80386上的工作,局限性是固有的。沿著這個方向(對無MMU系統(tǒng)的支持),將來也許會有更多的其他早期的硬件被支持(事實上,已經(jīng)有關于此目的的項目啟動)。但是,不像為現(xiàn)代的以及仍在生產(chǎn)中的嵌入式處理器的提供支持,對早期的硬件的支持被更多地認為是基于某種愛好,并且對于最終用戶而言很可能是無用的(因此在今后的Linux的官方發(fā)布版本也許不會將其包含在內(nèi))。
最新的Linux版本包含了對Axis通信公司的ETAX CRIS("Code Reduced Instruction Set")處理器的支持(更確切地說,支持ETRAX 100LX及更新的產(chǎn)品),它從技術的角度而言不是uCLinux合并的一部分(因為它包含MMU單元)。實際上對這款處理器的支持在2.4開發(fā)周期就已經(jīng)有了,但它在2.4.0以后才被引入,所以現(xiàn)在應該提到它。它是主要用于網(wǎng)絡設備的嵌入式處理器。與此相關的ETRAX 100,是得到uClinux支持的無MMU處理器,但是在主流的Linux內(nèi)核中相關支持卻沒有集成進來。
Opteron支持 - 消費級的64位Linux
另一個在2.4.x開發(fā)環(huán)節(jié)就已經(jīng)并入但這里仍然值得提及的是對AMD Opteron芯片(基于AMD64體系結構)的支持。Opteron向后與Intel-clone的處理器兼容,并且,甚至可能得到微軟的支持。是它還是Intel的Itanium家族的某一成員成為64位消費級產(chǎn)品的事實標準現(xiàn)在還很難下定論。
盡管2.4系列內(nèi)核的后期版本已經(jīng)可以在該芯片上運行,但作為產(chǎn)品應用仍受到了很大限制。對高端用戶來說,最嚴重的問題是,每個應用程序的RAM的使用都被限制在512MB以內(nèi)。另一方面,新內(nèi)核對在該平臺上運行x86(32位)的程序的支持得到了改進。
子體系結構(Subarchitecture)支持
Linux 2.6除了對許多新的處理器體系結構外,還包含了一個稱為子體系結構(Subarchitecture)的新概念。以前,Linux通常假設處理器和其他硬件是配套的。也就是說,i386系列處理器只會在PC/AT服務器上使用。這條針對i386的假設在Linux 2.4中就被打破,因為i386的額外支持使其可以在SGI的視頻工作站(Visual Workstation)中使用。(事實上,在其他非i386體系結構上,這個假設早被打破了。比如,m68k很早就支持Amiga,Michintosh等平臺。)Linux 2.6對于此最大的變化就是,讓這個特性以及概念成為標準,以便所有的體系結構都可以用相似而健全的方法來處理,以便更清晰地劃分模塊。
標準的確立使得i386可以運用于兩個新的平臺。第一個是NCR的Voyager體系。這是一個對稱多處理器(SMP)系統(tǒng)(在Intel的MP規(guī)范標準確定之前就已經(jīng)開發(fā)出來了),它支持多達32個486-686的處理器配置。實際采取這種體系結構的產(chǎn)品處理器的配置數(shù)目要相對少一些,而且目前并不是所有的型號都得到了Linux的支持(最早的就不支持)。第二種得到最新支持的體系結構是更為廣泛使用的由NEC開發(fā)的PC-9800平臺,它曾是日本市場占統(tǒng)治地位的PC平臺,一直到最近幾年。最初的PC-9800裝載的是8086處理器,最終發(fā)展到奔騰級處理器和SMP支持。(當然,Linux對它的支持局限在386以上。)盡管在美國它完全不為人所知,微軟的Windows 95之前的版本曾移植到這個平臺上。該平臺由于生產(chǎn)商對標準PC的偏愛,生產(chǎn)已經(jīng)中止。
Linux對差異細微的硬件類型支持的形式化,使得操作系統(tǒng)能更容易的移植到其他平臺上,比如移植到專為存儲設計的硬件或者是使用在工業(yè)領域的主流處理器。需要澄清的是,子體系結構也不是任何時候都管用的,它能夠發(fā)揮作用是因為這些可移植的系統(tǒng)非常底層構件(比如IRQ路由)有或多或少的不同。比起在X-box上運行Linux的差別來說,驅(qū)動程序等相對小的差別還不足以把它們從傳統(tǒng)的i386系統(tǒng)中分開。Linux對X-box的支持,就不是子體系結構的問題。
大規(guī)模 - 非一致存儲訪問體系結構(NUMA)和大型機
除了以上所提及的新硬件類型的支持之外,新的Linux內(nèi)核發(fā)行版也包含了對大型服務器(一些運行i386處理器,也有些運行其他處理器)更多的支持。對Linux來說,這樣的特性是新近加入的,還有許多優(yōu)化工作需要完成。這是一個Linux發(fā)展相當迅速的領域,我們能夠預計在不久的將來,Linux將成為此領域的有力競爭者。
在此方面最大的改變就是Linux對NUMA服務器的最新支持。NUMA(非一致存儲訪問)在多進程世界里是超越SMP以及提升多處理器系統(tǒng)效率的一個進步。SMP系統(tǒng)的設計上有著許多和對應單處理器系統(tǒng)類似的局限性。其中最大的設計局限之一就是系統(tǒng)中只有唯一的一塊內(nèi)存區(qū),所有的處理器對它都平等地對它進行訪問。在多處理器系統(tǒng)里,這樣會在同一條內(nèi)存總線上的多處理器之間引起相當高的競爭,導致性能瓶頸。NUMA服務器,通過引入了以下的理念解決了這個問題:對于某個特定的處理器,一些內(nèi)存比其他一些的更為接近(close)??梢赃@樣簡單地設想(同時技術上也不會有嚴重錯誤),你的系統(tǒng)有許多包含了處理器、內(nèi)存以及其他元件(比如I/O擴展卡)。系統(tǒng)中有很多這樣的卡,它們可以相互通訊;顯而易見,相對其他卡上的內(nèi)存,每塊卡上的處理器能更快的訪問本地內(nèi)存(自己的卡上內(nèi)存)。從許多角度上看,NUMA體系結構就是一個緊密耦合的集群特例。
為了給NUMA主機提供良好的支持,Linux十分必要在許多方面進行調(diào)整,以使新模型更具效率。首先,建立了一個內(nèi)部拓撲API,以使內(nèi)核知道處理器和內(nèi)存以及其他IO設備間的相互關系。有了內(nèi)部拓撲API的支持,Linux的進程調(diào)度器可以理解這些關系,并且會嘗試優(yōu)化任務以達到最佳的本地資源使用。此外,許多NUMA主機在各個節(jié)點(nodes)的線性內(nèi)存區(qū)域之間存在空洞(holes)。新內(nèi)核已經(jīng)能夠合理的處理這種不連續(xù)情況。內(nèi)核還有許多其他使得Linux可以支持高端(high-end)主機的變化,這也是內(nèi)核發(fā)展的一個明確方向。再過一年,我們可以期待Linux在高端機型上效率以及其他方面的進步。
深入Linux
除了橫向支持越來越多的硬件,Linux 2.6還在已支持的平臺上根據(jù)硬件的性能提升進行了改進。這些針對特定CPU的優(yōu)化包括:Transmeta的Crusoe系列,Intel’s Pentium 4 Xeon、Pentium 3-M、Pentium 4-M 和AMD移動處理器。新版本Linux還解決了某些Athlon處理器自身的bug導致的問題。Linux 2.6還解決了在某些多于16個處理器的系統(tǒng)啟動時偶爾會掛起的問題,盡管這個bug不會影響大多數(shù)用戶的正常使用。
超線程
在Linux 2.6中不算新鮮,內(nèi)核在2.4.17發(fā)布中就已經(jīng)開始包含對Intel P4處理器的超線程(Hyperthreading)的支持(在這里提及它,一是因為它并沒有包含在2.4最初的發(fā)布中,二是自那以后內(nèi)核又有了很大的改變)。超線程使得單個的處理器可以偽裝成操作系統(tǒng)看來二個或更多的多個處理器。最令人激動的是,Linux是第一個把超線程特性引入市場的操作系統(tǒng),盡管早在一年前Intel就發(fā)布了兼容的處理器。有傳聞說,微軟在對支持超線程的CPU按一個CPU還是按兩個CPU收取授權費(license)的問題上拿不定主意。Linux的開放模型(以及沒有基于cpu的授權)使得Linux操作系統(tǒng)第一個支持這個新特性。顯然,一個處理器就算扮作兩個處理器工作,它還是一個處理器,性能并不能因此增加很多。2.5中調(diào)度器和其他一些部分在有了新的優(yōu)化,使得處理器的超線程可以真正的發(fā)揮作用。如果是在2.4下加入超線程支持,結果就不一定了,有時性能還會下降。
容量 -- 可擴展性的進展
除了對NUMA的支持,Linux 2.6在處于食物鏈頂端的Intel服務器方面,也有一些變動。最重要的就是對Intel的物理地址擴展(PAE)的完全支持,使得較新的32位的x86系統(tǒng)可以訪問高達64GB的內(nèi)存,但僅僅限于頁面映射模式。另外,通過加強對高級可編程中斷控制器(APIC)的支持,多處理器系統(tǒng)之上的IRQ均衡(balancing)大大提升。
在許多其他方面,內(nèi)部限制在可能的地方都有所放松。Linux系統(tǒng)上用戶和用戶組的數(shù)目從65000越升到了超過40億(實際就是16位到32位的變化)。這使得Linux在之前可能超越限制的大型文件和認證服務器上更加實用。類似的,進程標識號(PID)的數(shù)目也從32000升到10億。這個改變,與其他PID子系統(tǒng)優(yōu)化一起,將提高在十分繁忙或是長期工作的系統(tǒng)上的應用程序的啟動性能。盡管同時打開的文件最大數(shù)目并沒有增加,但是Linux 2.6不會再要求你預先設定限制值;限制值會隨著系統(tǒng)的運行自動調(diào)整。最后,Linux 2.6包含了改進的64位的塊設備支持(當然塊設備本身應當支持64位模式),即使是在i386這樣的32位平臺。這樣一來,文件系統(tǒng)的存儲上限可達 2TB。
內(nèi)核互動性以及響應性
Linux 2.6中一個受關注的焦點就是使得系統(tǒng)對于桌面用戶以及其他一些需要對事件進行高度人為控制的應用具有更具響應性(responsitive)。這其中各個不同的目標系統(tǒng)具有很不同的挑戰(zhàn),但內(nèi)核中包含了很多改變,使得它們同時受益。
2.6中一個必須理解的主要內(nèi)部改變是現(xiàn)在內(nèi)核自身是可搶占的。在所有之前的Linux版本中,當系統(tǒng)運行內(nèi)核的相關事務時,它不能被打斷(在多處理器系統(tǒng)中,基于各cpu的角度這也是成立的)。Linux 2.6中,內(nèi)核現(xiàn)在允許自身在執(zhí)行任務時被打斷,這樣用戶任務可以繼續(xù)運行即使內(nèi)核正在做一些復雜的事情。(為了避免明顯這可能帶來的競爭情況,內(nèi)核中含有一些具有鎖的代碼段,運行于這樣的代碼段的時候,內(nèi)核不能被打斷。)這個改變的主要好處是系統(tǒng)的可交互性(比如,對于桌面用戶)大大提升,系統(tǒng)對于用戶輸入這樣的事件感覺起來快多了。
其他使得Linux成為一個更加具有響應性系統(tǒng)的改變是并入對新的"futexes"("Fast User-Space Mutexes")的支持,這項支持發(fā)揮作用需要用戶程序的支持(使用futex實現(xiàn)互斥)。Futexes是一種序列化(serialize)事件使得它們不會相互沖突的機制。與傳統(tǒng)的多數(shù)的線程庫鎖支持的mutex操作不同,這是部分基于內(nèi)核的(partially kernel based),同時它也支持設置優(yōu)先級使得高優(yōu)先級的應用或線程優(yōu)先獲得競爭的資源。通過使用一個程序去指定一個等待的任務比其他的更重要,它帶來了可能是一個應用的時序--關鍵區(qū)域更佳的響應性。
Linux的I/O子系統(tǒng)也經(jīng)歷的很大的修改,使得它在各種工作負荷下都更具響應性。這個變化包括I/O 調(diào)度子系統(tǒng)--決定何時、哪一進程去讀一個設備的內(nèi)核代碼的完全重寫。重寫的I/O層現(xiàn)在可以更好地保證沒有進程過長時間地停留在I/O等待上,同時不排斥以前的優(yōu)化工作使得讀等請求以最有效的次序操作硬件的優(yōu)化工作。
盡管實時操作系統(tǒng)(RTOS)的開發(fā)者可以從這些改變中受益,Linux 2.6將不會成為一個實時內(nèi)核。然而,這些以及其他相關的背景工作使得將Linux轉變?yōu)镽TOS成為可能。為用戶或開發(fā)者提供這樣的支持的外部patch(尚未合并到官方的內(nèi)核版本)已經(jīng)出現(xiàn)了。
模塊子系統(tǒng) - 設備驅(qū)動程序
在 Linux 2.6的開發(fā)歷程中,模塊子系統(tǒng)是另一有重大改進的部分。許多代碼被重寫,以提高穩(wěn)定性,并使系統(tǒng)更加透明。除了這些明顯的表層的變化之外,還有更多背后的內(nèi)核如何看待以及使用模塊的改變。
首先,Linux 2.6中內(nèi)核驅(qū)動程序最顯而易見的(雖然并沒有太大作用)的變化是文件擴展名改變了。".ko"(kernel object,內(nèi)核目標文件)取代了".o"(這是一目標文件的常見擴展名,通常在程序編譯期間,鏈接生成可執(zhí)行應用程序之前創(chuàng)建)。與其說這使得模塊并不是真正的中間文件這一點更為清楚,還不如說這僅僅是一個裝飾性(cosmetic)的改動。
完完全全實質(zhì)性的改進在于消除存在于很多內(nèi)核版本中的競態(tài)的多方面工作。問題的關鍵在于,如果卸載發(fā)生在模塊檢查并確認沒有其它的設備正在使用它之后,使用一個正在被卸載的模塊來啟動設備是有可能的。新的內(nèi)核模塊代碼應使得這一條件更難被觸發(fā)。更進一步,現(xiàn)在簡單地完全禁止模塊卸載也是有可能的。
更加透明是新的模塊子系統(tǒng)另一特性。在此之前,幾乎所有的 Linux版本中,模塊是足夠智能的,它們可以通過掃描總線尋找它識別(recognized)的設備ID號,檢測到它所能夠支持的設備(比如PCI,ISA PnP以及PC卡)。Linux 2.6標準化了這種支持,使之對內(nèi)核來說外部化,外部程序以及模塊加載器判斷一個特定的模塊可以支持哪些設備將更為容易。這將允許各種硬件管理程序(比如 Redhat的kudzu)對硬件作出智能化的判斷,即使他們本身對自己所處理的硬件設備并不熟悉。如果你的知識超越了當前版本的驅(qū)動程序,你可以(通過新的 sys文件系統(tǒng)中的一個接口)強制一個驅(qū)動程序工作于某一特定的設備,即使驅(qū)動程序并不知道自己可以支持該設備。
其他改進
除了上述的許多改變之外,還有很多其他可以提升系統(tǒng)性能的普遍性的改變。這其中包括更多的去除了"Big kernel Lock"(早期Linux用于支持SMP系統(tǒng)時所采用的非細粒度鎖),以及針對文件系統(tǒng)預讀、回寫和小文件操作的優(yōu)化等。
Linux 2.6還解決了一個更為深刻的穩(wěn)定性問題:內(nèi)核將不會分配多于系統(tǒng)中RAM(加swap)數(shù)量的內(nèi)存。此前,Linux在一些即使系統(tǒng)內(nèi)存耗盡的情況下,仍然允許malloc操作分配內(nèi)存成功。過量分配(overcommitment)邏輯得到修改,使得這種情況現(xiàn)在不再可能出現(xiàn)。(當然,如果你耗盡了系統(tǒng)的RAM,即使沒有超越最大可用數(shù)量--你需要擔心更更嚴重的問題。)
Linux總是一個開放標準的支持者。內(nèi)核內(nèi)部的大改變之一就是Linux的線程框架被重寫,以使NPTL(Native POSIX Thread Library)可以運行于其上。對于運行負荷繁重的線程應用的Pentium Pro以及更先進的處理器而言,這是一個主要的性能提升;它也是企業(yè)級應用中的很多高端系統(tǒng)一直以來所期待的。(實際上,RedHat已經(jīng)將它向后移植到了Linux 2.4,從RedHat 9.0中開始包含)線程框架的改變包含LInux線程空間中的許多新的概念,包括線程組、線程各自的本地存儲區(qū)、POSIX風格信號以及其他改變。主要的缺點之一是依賴于老式的Linux-isms而沒有遵循POSIX標準的應用程序(比如Sun Java)將不能運行在支持新式線程的系統(tǒng)之上。鑒于使用新的線程模型利遠大于弊,很明顯,新的內(nèi)核發(fā)布不久,最為重要的那些應用都將會支持這個改變。
最后,2.6可以支持編譯時關閉內(nèi)核對存儲交換(swap)的支持,盡管對于絕大多數(shù)Linux之上的應用而言,沒有直接的益處。這使得Linux可以在相對小的內(nèi)存足跡(footprint)內(nèi)運行,對于不大可能使用交換設備的嵌入式系統(tǒng)可能也是有益的。
統(tǒng)一設備模型
作為操作系統(tǒng)中的一個相對獨立的組件,設備模型對于那些被設計運行于用于多種硬件之上的操作系統(tǒng)而言是至關重要的。簡單地說,設備模型是內(nèi)核中的基礎設施,用于檢測和決定系統(tǒng)中所有可選模塊的資源使用。所有的操作系統(tǒng)(包括各版本的Linux)都固有一些設備的概念。老版本的Linux(2.2或更早)僅使用一種直接的方法操作設備。系統(tǒng)為不同種類的硬件總線提供驅(qū)動程序,各式各樣的設備驅(qū)動程序知道如何探測它們所支持的設備總線以尋找對應的硬件設備。這種系統(tǒng)非常分散,各種各樣的總線提供許多互不兼容的API,用于處理各種不同的操作。Linux 2.4通過使用一組通用接口將PCI,PC卡以及ISA PnP 整合到一個單一的設備結構中,完成了構建統(tǒng)一設備模型的第一步。Linux 2.6更進一步地推進了這方面的努力,力求在整個系統(tǒng)的范圍內(nèi),內(nèi)核以一種新的統(tǒng)一的視角看待它所依賴的硬件。
內(nèi)核對象抽象
新設備模型基礎的核心是一個所有底層設備類型都需使用的新的面向?qū)ο蟮慕涌?。這個內(nèi)核設備對象結構(稱為"kobject")包含用于引用計數(shù)和操作子設備的所有接口。底層設備(例如系統(tǒng)總線)利用這一公共接口層,向內(nèi)核以及用戶空間提供統(tǒng)一的系統(tǒng)視圖?,F(xiàn)在,所有這些都被放在了中心位置,這使得Linux可以使用這些信息作許多有用的事。
在內(nèi)核中完整地保存這些新的信息,使得Linux可以更好的支持那些需要有深入的硬件知識的系統(tǒng)。一個明顯的例子就是電源管理。近幾年新出現(xiàn)的電源管理標準是ACPI。ACPI,即高級電源配置管理界面,最早是在Linux 2.4中有支持。不同于APM(高級電源管理),擁有這種接口的系統(tǒng)在改變電源狀態(tài)時需要分別通知每一個兼容的設備。新的內(nèi)核系統(tǒng)允許子系統(tǒng)跟蹤需要進行電源狀態(tài)轉換的設備。另一個例子是支持熱插拔的總線。機器啟動后依然可以添加設備的能力在現(xiàn)在看來顯得很普通,但Linux直到2.2版本才提供相關支持。到了Linux 2.4,這種支持得到進一步的加強,范圍也擴大到可熱插拔的PCI、PC卡、USB以及Firewire設備。通過從根本上消除熱插拔設備和傳統(tǒng)設備的差異,新內(nèi)核的集中化設備系統(tǒng)擴展了這一支持。當你啟動計算機的時候,設備檢測例程將"插入"系統(tǒng)中的設備。無論在系統(tǒng)啟動時,或是啟動以后,系統(tǒng)發(fā)現(xiàn)系統(tǒng)中的某個設備時,都會相應創(chuàng)建一個相同的內(nèi)核對象,這就使得處理可插拔設備的底層結構簡單化了。
sys文件系統(tǒng)
最明顯的用戶可見的改變可能是新的sysfs文件系統(tǒng)的出現(xiàn),它集成了下面3種文件系統(tǒng)的信息:針對進程信息的proc文件系統(tǒng)、針對設備的devfs文件系統(tǒng)以及針對偽終端的devpts文件系統(tǒng)。該文件系統(tǒng)(安裝在/sys目錄)是核心看到的設備樹的一個直觀反映。核心通過緊密合作的核心對象(kernel object)子系統(tǒng)來建立這個信息:當一個核心對象被創(chuàng)建的時候,對應的文件和目錄也被創(chuàng)建。(必要的話,也有可能一個核心對象被創(chuàng)建的時候并不在sysfs文件系統(tǒng)中有記錄。)
既然每個設備(或者說內(nèi)核對象)在sysfs中都有唯一對應的目錄結構,那么下一步可以把設備的屬性(設備名,電源模式,中斷處理等)信息輸出到這個目錄樹中以供系統(tǒng)管理員讀寫。相應的,很多跟設備相關的/proc/sys的用法已經(jīng)或者將要移到/sys目錄下。
核心硬件支持
隨著Linux的這些年的發(fā)展并逐步進入主流行列,從內(nèi)核所支持的設備類型來看,每一次的內(nèi)核發(fā)布,都像是一次跳躍:支持新興的技術(2.4的USB),支持古老一些的傳統(tǒng)技術(2.2的MCA)。發(fā)展到Linux2.6,不被Linux支持的設備已經(jīng)相當少了。PC機上的主流硬件沒被支持的很少。正是由于這個原因,多數(shù)(顯然不是所有)關于硬件支持方面的改進(包括上面所說的設備模型)圍繞對已有支持的加強。
內(nèi)部設備總線
位于系統(tǒng)底層的總線幾乎與處理器同樣重要;這些總線就像膠合劑,將系統(tǒng)的各個部件連到一起。在PC世界中,這些總線一直是不可或缺的,無論是老的ISA(在最初的IBM PC機中可以找到)總線,還是現(xiàn)在的外部串口以及無線(wireless)總線。一旦新的總線及設備變成流行的消費產(chǎn)品,Linux總是能以很快的速度去適應它;而對于不很流行的設備,情況則差很多。
一個能說明這一情況的例子就是ISA總線的PnP(即插即用)特性,Linux直到2.4版本才支持ISA總線的即插即用擴展,比其他流行的商業(yè)操作系統(tǒng)要晚很多(在內(nèi)核支持ISA PnP之前,你或許可以勉強使用一些用戶態(tài)的實用程序使它工作)。Linux 2.6對這個子系統(tǒng)做了一個重要的改進,使它更完善、更好地集成于新的設備模型之中。新特性包括完整的PnP BIOS支持、設備名稱數(shù)據(jù)庫以及一些其他的使系統(tǒng)更加健壯的特性。這些改進的結果,是使得Linux成為一個真正意義上的即插即用操作系統(tǒng),并且可以被設置成就像那些兼容機的BIOS達到的那樣。
ISA時代ISA-PnP的兩個可選的替代方案是MCA(微通道體系)和EISA(擴展ISA),盡管它們不那么流行。在Linux2.6的開發(fā)周期中,這兩個子系統(tǒng)都做了一些改進以支持新的設備模型。此外,通過引入設備名稱數(shù)據(jù)庫,EISA與其他子系統(tǒng)一起獲得了更進一步的標準化。
除了剛才提到的幾個重要特性,Linux對硬件總線的支持也做了許多其它值得關注的改變。PCI總線是所有總線中最流行也是最重要的總線,Linux 2.6極大地提升了對它的支持,包括改進的熱插拔和電源管理支持。新版本同樣也支持包含多個AGP總線(即加速圖形端口――基于PCI協(xié)議的一種獨立高速總線)的系統(tǒng),如高端圖形工作站。就對PC硬件的支持而言,Linux緊緊跟隨著硬件市場的潮流。
除了這些實際的設備總線,Linux2.6也增加了一個概念上的Legacy總線。這種總線對每種體系結構都是專有的,這些體系結構包含所有你可能想到的設備。例如,在一臺PC機上,可能會有板上(on-board)的串口、并口、以及PS/2端口,這些設備實際存在著,但不被系統(tǒng)中的任何一個實際總線所枚舉(enumerated)。在其他的一些平臺上,這種Legacy支持可能包含更復雜的事情(如查詢固件)。但一般來說,這只是一層包裝,使得設備驅(qū)動程序在新的驅(qū)動模型視圖下能以標準的方式操作這些設備。
外部總線
雖然早先的設備標準成熟并鮮有新的特性增加,但USB是一個例外。USB的支持在最近的內(nèi)核開發(fā)周期中有了許多改進,其中最為顯著的是新內(nèi)核將支持USB 2.0設備。USB2.0是一種新的標準,支持設備帶寬高達480M bps(當前的USB只有12Mbps)。支持此標準的設備通常被稱作高速USB設備,它們正逐步占領市場。另外一個新的相關標準叫做USB On-the-Go(或稱作USB OTG),它是USB協(xié)議中一個點到點的變種,用以直連設備;Linux 2.6尚未支持它(2.6的補丁是可以支持的)。除了設備支持外,多數(shù)USB設備的枚舉方式都作了修正,使得Linux能訪問現(xiàn)今許多同類型設備的所有實例(instance)。這一點對于大型打印機或存儲設備來說相當有益(雖然后者可能更傾向于使用專用存儲總線)。很明顯,這一領域的技術最近幾年成長顯著,Linux對相關設備的支持也是緊跟市場的步伐。
無線設備
過去的幾年,無線技術在公眾應用中真正起飛了。看起來,在不遠的將來,線纜(非電源)將成為歷史。無線設備既包括網(wǎng)絡設備(目前最常見的無線設備),也包括更通用的設備,比如PDA。
在無線網(wǎng)絡空間中,設備可以大致分為長距(如基于業(yè)余無線設備的AX.25)和短距(通常是802.11,但一些舊式協(xié)議也存在)。從很早的時候(v1.2)起,對這兩者的支持就成為 Linux的一個特征。在 2.6 的開發(fā)中,它們又都得到了更新。這里最大的改動是,用于支持各種板卡、協(xié)議的短距子系統(tǒng)的主要組件合并為一個單一的"無線"子系統(tǒng)以及 API。通過提供一組能工作于所有支持的設備的用戶空間工具來實現(xiàn)不同的設備統(tǒng)一處理。這種方式解決了原先的不同設備不同處理所帶來的很多小的兼容性問題。除了這種標準化之外,Linux 2.6版內(nèi)核還有很多全局性的改進,包括當狀態(tài)發(fā)生改變(比如一個處于"漫游"狀態(tài)的設備)時更好的通知能力,以及對旨在更好地處理無線設備中周期性的延遲波動的一個TCP相關的改動。由于人們對2.4版內(nèi)核中無線支持的期望,上述的很多特性已經(jīng)包含在2.4版內(nèi)核中了。
在無線設備空間,有著類似的主要改進。IrDA(以 Infrared Data Associates group命名的紅外線協(xié)議)部分自上一主要發(fā)布以來有一些改進,比如電源管理、集成進了新的內(nèi)核驅(qū)動模型。真正的改進還在于提供了對藍牙設備的支持。藍牙是一種新的無線協(xié)議,它設計為短距,功耗很低,也沒有 IrDA 中的"視線"的限制。作為一種協(xié)議,藍牙被設計為"到處可用"。它已被應用于多種設備,如 PDA,移動電話,打印機,以及更為怪異(bizarre)的設備如車載設備。協(xié)議本身由兩種不同的數(shù)據(jù)連接類型組成:用于有損音頻應用的SCO(Synchronous Connection Oriented,面向同步連接);以及可以支持重傳等更為強壯的連接L2CAP(Logical Link Control and Adaptation Protocal,邏輯連接控制和適配協(xié)議)。L2CAP 還進一步的支持各種子協(xié)議,包括用于點對點網(wǎng)絡的 RFCOMM 以及用于類以太網(wǎng)的 BNEP。Linux對采用藍牙技術的設備的支持在不斷提升,我們可以相信,當足夠多的采用藍牙技術的設備被使用時,這種支持將會非常成熟。值得一提的是,對藍牙最初的支持已經(jīng)集成到了2.4系列內(nèi)核后幾個版本中。
塊設備支持
存儲總線
在2.6的開發(fā)中,IDE/ATA、SCSI等存儲總線也都得到了主要的更新。最主要的改變集中于被重寫(再一次被重寫)的 IDE 子系統(tǒng),解決了許多可擴展性問題以及其他限制。比如,現(xiàn)在 IDE CD/RW 設備可以直接通過IDE磁盤驅(qū)動程序進行寫操作,這種實現(xiàn)方法比過去的方法要簡潔的多。(在以前,需要再使用一個特別的SCSI模擬的驅(qū)動程序。這樣顯得很混亂,而且實現(xiàn)起來有困難。) 現(xiàn)在,遇到一個不能識別的控制器時,IDE 層可以查詢機器的 BIOS 信息,從而獲取時序操作所需數(shù)據(jù)或其他數(shù)據(jù)。SCSI部分有不少散布于系統(tǒng)中的小的改進,使之能支持更多的設備,同時提升了可擴展性。一個針對舊式系統(tǒng)的特別改進是,現(xiàn)在的 Linux能夠支持 SCSI-2多通道設備(這種設備在單個設備上有多于2個的 LUN)。另一個重要的改進則是現(xiàn)在 Linux 能夠默像 MS Windows那樣檢測介質(zhì)的變動,以更好地兼容那些并不完全遵照標準規(guī)范的設備。既然這些技術歷經(jīng)時間的考驗穩(wěn)定下來,那么 Linux 也提供對它們的支持。
Linux現(xiàn)在也包含對新一些的機器的EDD(Enhanced Disk Device) BIOS進行直接訪問的支持,這樣便可以獲得服務器中的磁盤設備視圖。EDD BIOS包含所有連接到系統(tǒng)的、BIOS識別的存儲總線(包括IDE以及SCSI)的信息。除了獲得連接設備的配置以及其他信息之外,它還有另外幾個優(yōu)點。比如,這種新的接口使 Linux 能夠知道系統(tǒng)是從哪一個磁盤設備上啟動的。這在新一些的系統(tǒng)上非常有用,因為這樣的系統(tǒng)中到底是從哪一個設備啟動的常常不明顯。智能安裝程序也可以考慮使用這些信息,比如在決定把GRUB(一種Linux啟動裝載器)安裝在哪里時。
所有這些改動之外,這里需要再次強調(diào)的是,所有的總線設備類型(硬件、無線和存儲)都集成到了Linux新的設備模型子系統(tǒng)中。一些改動僅僅是"裝飾性"的,另一些則包含了非常顯著的改動(比如,甚至是如何檢測設備的邏輯都需要修改)。
文件系統(tǒng)
Linux(或其他一些系統(tǒng))下塊設備的最常見用法是在塊設備上面建立一個文件系統(tǒng)。相對Linux 2.4而言,Linux 2.6對于文件系統(tǒng)的支持在很多方面都有大的改進。關鍵的變化包括對擴展屬性(extended attributes)以及POSIX標準的訪問控制(access controls)的支持。
EXT2/EXT3文件系統(tǒng)作為多數(shù)Linux系統(tǒng)缺省安裝的文件系統(tǒng),是在2.6中改進最大的一個。最主要的變化是對擴展屬性的支持,也即給指定的文件在文件系統(tǒng)中嵌入一些元數(shù)據(jù)(metadata)。一些擴展屬性被系統(tǒng)使用,只能由root用戶進行讀寫。很多其他操作系統(tǒng),如Windows和MacOS系統(tǒng)已經(jīng)大量地使用了這種擴展屬性。不幸的是,UNIX系的操作系統(tǒng)一般都還沒有很好地支持擴展屬性,很多用戶級的程序(比如tar)需要進行更新才能保存和轉儲這些擴展屬性信息。這是Linux成長的又一方面;Linux對擴展屬性的支持正在成熟。
新的擴展屬性子系統(tǒng)的第一個用途就是實現(xiàn)POSIX訪問控制鏈表。POSIX訪問控制是標準UNIX權限控制的超集,支持更細粒度的訪問控制。必要的話(比如從NFS輸出文件的時候),這些訪問控制可以被映射到標準的user/group權限控制上。除了以上,EXT3還有其他一些小的變化。文件系統(tǒng)日志提交(commit)的時間能夠進行調(diào)整得更加適合于筆記本電腦(處于省電模式時,可能會加速驅(qū)動器);缺省的加載選項可以保存在文件系統(tǒng)自身之中(這樣不用每次加載時都輸入加載選項);可以標記一個目錄為"indexed"以加速在這個目錄中的文件查找。
Linux對文件系統(tǒng)層還進行了大量的改進以兼容PC機的主流操作系統(tǒng)。首先,Linux 2.6支持Windows的邏輯卷管理器(即動態(tài)磁盤Dynamic Disks)。這個是Windows XP及后續(xù)版本中新的分區(qū)表機制,能夠很方便的支持多分區(qū)系統(tǒng)中的分區(qū)大小的調(diào)整以及新分區(qū)的創(chuàng)建。(當然,Linux系統(tǒng)不一定會馬上使用這一機制)其次,Linux 2.6對NTFS文件系統(tǒng)的支持也進行了重寫,現(xiàn)在能以讀/寫模式安裝一個NTFS卷。寫支持仍處于試驗階段,在逐步改進;最終的內(nèi)核發(fā)布版中可能含有也可能不含有寫支持這一部分。最后,Linux對FAT12(很老的系統(tǒng)或軟盤上使用的DOS文件系統(tǒng))的支持中消除了使用一些MP3播放器時所遇到的bug。跟蹤PC領域的其他一些技術將一直是Linux核心向前發(fā)展的一個重要環(huán)節(jié)。
文件系統(tǒng)部分在與其他操作系統(tǒng)的兼容性方面也有改進。對HPFS文件系統(tǒng)(OS/2和其他系統(tǒng)中使用)的擴展屬性的支持有了改進。OS/2風格的擴展屬性被分離到另一個的名字空間中。XFS文件系統(tǒng)也得到了更新,以達到與IRIX操作系統(tǒng)的磁盤級(on-disk)兼容。
此外,Linux文件系統(tǒng)中還有很多分散的變化。配額(quota)管理進行了重寫以便系統(tǒng)可以支持更多的用戶;用戶可以標記目錄為同步,從而所有變化(增加文件等)都是原子的(這一點對于郵件系統(tǒng)和基于目錄的數(shù)據(jù)庫系統(tǒng)尤為重要,而且在磁盤故障的恢復方面也更好一些);透明壓縮功能(僅Linux支持的擴展)被加到ISO9660文件系統(tǒng)(CD-ROM中使用)中。最后,一個新的基于內(nèi)存的文件系統(tǒng)(hugetlbfs)被創(chuàng)建;創(chuàng)建該文件系統(tǒng)旨在更好地支持基于共享內(nèi)存的數(shù)據(jù)庫。
輸入輸出設備
在任何計算機系統(tǒng)的更"外部"的一層是輸入輸出設備,包括像鍵盤、鼠標、聲卡、顯卡等顯而易見的東西,還包括像游戲操縱桿以及輔助設備等不那么常見的東西。在2.6的開發(fā)周期里,許多Linux的用戶端子系統(tǒng)得到了擴展,但大部分常見設備都已經(jīng)非常成熟了。Linux 2.6中對這些設備的改進多半衍生于內(nèi)核對外部總線支持的改進,比如藍牙無線鍵盤以及其它類似設備。盡管如此,Linux 在好幾個領域都有更大的改進。
人機接口設備
Linux 2.6中一個主要的內(nèi)部改動是人機接口層的大量重寫。人機接口層是一個Linux系統(tǒng)中用戶體驗的中心,包括視頻輸出、鼠標、鍵盤等。內(nèi)核的新版本中,這一層的重寫以及模塊化工作超出了以前的任何一個版本。使用新內(nèi)核構建一個不包含對顯示器等的支持的完全"headless"的Linux系統(tǒng)是可能的。嵌入式系統(tǒng)開發(fā)人員或許會是這一模塊化工作的主要受益者,可以制造出只能通過網(wǎng)絡或串行線管理的設備;另一方面,對普通用戶也是有好處的,因為許多關于設備及體系結構的內(nèi)在假設被模塊化了。比方說,之前總是假定如果你擁有一臺PC,那么你一定需要對標準AT(i8042)鍵盤控制器的支持。在 Linux 的新版本中移除了這一要求,因而可以在不那么遵照傳統(tǒng)的系統(tǒng)中拋開不必要的代碼。
Linux對顯示器輸出處理的支持也有不少改進,但大部分只在配置使用內(nèi)核內(nèi)部的幀緩沖控制臺子系統(tǒng)時才有用。( 多數(shù)基于Intel體系的Linux機器并不采用這種方式配置,但其他大部分體系結構卻采用。)在我看來,最大的亮點在于啟動圖標(如果你從來沒有見過,那我告訴你那是一只可愛的企鵝)現(xiàn)在支持24 bpp的分辨率。這是一個方面,其它的面向控制臺的新特性包括可以重設大小、旋轉等(對PDA及其它類似設備),還有為更多的硬件提供了硬件加速支持。最后,Linux現(xiàn)在對VESA監(jiān)視器的顯示能力信息的查詢提供了內(nèi)核支持,雖然XFree86 和大部分發(fā)布版本的安裝系統(tǒng)都在用戶空間提供了這種支持。
除這些比較大的改進之外,Linux 2.6 在人機交互方面還有一系列小的改進。比方說,現(xiàn)在支持觸摸屏了。另外,鼠標及鍵盤驅(qū)動程序也得到了更新和標準化,現(xiàn)在不管底層的硬件或協(xié)議是什么,系統(tǒng)都只導出一個單一的設備節(jié)點(比如 /dev/input/mouse)。一些怪異的鼠標(比如有多個滾輪的)現(xiàn)在也得到了支持。PC鍵盤的鍵值映射得到了更新,以遵循Windows 的"標準"來支持擴展鍵。對游戲控制桿的支持也得到了提升,這不僅僅得益于許多新的驅(qū)動程序(包括 X Box 游戲控制盤的驅(qū)動),還歸功于引入了一些新的特性,如力量反饋(force-feedback)。最后(但絕不是最不重要的),新版本內(nèi)核提供了對 Tieman Voyager 的盲人用 TTY設備的支持,以使盲人用戶更好地使用Linux。(這個特性是如此的重要,以至于被向后移植到了Linux 2.4。)
順便提一下,Linux 修改了"系統(tǒng)請求"接口以更好地支持那些沒有本地鍵盤的系統(tǒng)。系統(tǒng)請求接口("sysrq")是系統(tǒng)管理員在本地控制臺做一些高級工作的方法,比如獲取調(diào)試信息、強制系統(tǒng)重啟、重新掛載文件系統(tǒng)為只讀等等。因為 Linux 2.6 現(xiàn)在支持一個完全"headless"的系統(tǒng),所以現(xiàn)在也可以通過/proc 文件系統(tǒng)觸發(fā)這些事件。(當然,如果你的系統(tǒng)已經(jīng)掛起而你又要強制它做一些事情,這一特性也幫不上你什么忙。)
音頻
對于桌面用戶而言,Linux 2.6 中最為期望的新特性之一是以ALSA(Advanced Linux Sound Architecture)取代過時的聲音系統(tǒng)。舊式的聲音系統(tǒng)OSS(Open Sound System)很早的時候起便為Linux提供音頻支持,但是它有許多體系結構上的缺陷。新系統(tǒng)首要的改進在于它從設計之初開始便是完全線程安全的,且能很好的工作于 SMP 系統(tǒng)。這修正了過去的許多驅(qū)動程序在"桌面即意味著單CPU"這一教條的例外情況下不能正常工作的問題。更為重要的是,此驅(qū)動程序從一開始便采用模塊化設計(Linux舊版本的用戶應該還記得,在Linux 2.2時代,模塊被解構以適應聲音系統(tǒng)),這使得系統(tǒng)能更好地支持多塊聲卡,包括不同類型的聲卡。無論系統(tǒng)內(nèi)部是多么完美,如果沒有一些令人驚訝的新特性,系統(tǒng)對于用戶來說仍沒有任何改進。事實上,新的聲音系統(tǒng)有許多這樣的新特性。其中最為重要的是提供了對許多新硬件(包括USB音頻及MIDI設備)的支持,支持全杜比錄音及回放、無縫混音、支持聲音合成設備等等。無論你是一個音響發(fā)燒友或只是喜歡播放 MP3 的人,Linux提升的聲音支持都將是大受歡迎的一個進步。
多媒體
現(xiàn)今單純的音頻支持似乎遠遠不夠,用戶想要的是對真正新奇的硬件的支持,比如網(wǎng)絡攝像機,廣播及電視適配器,數(shù)字視頻錄制器等。Linux在2.6版本中對以上三者的支持都有所提升。
Linux對廣播卡的支持(通常是通過用戶空間實現(xiàn)歷經(jīng)了好幾個開發(fā)周期,而對電視調(diào)諧器和視頻攝像機的支持只是在最近的1、2個主要版本中才有。此系統(tǒng)通常稱為V4L(Vedio4Linux 譯者注: "4" for "for"),在新版本的內(nèi)核開發(fā)中得到了重大更新,包括API的清理工作以及對設備更多功能的支持。新的API與舊版本不兼容,支持它的應用程序需要隨內(nèi)核的升級而升級。
作為一個全新的領域,Linux 2.6首次包含對DVB(Digital Video Broadcasting,數(shù)字視頻廣播)硬件的支持。這種硬件常見于機頂盒,它可以使得Linux服務器通過適當?shù)能浖優(yōu)橐慌_tivo(類似機頂盒的設備)。
軟件方面的改進
Linux的改進并不只關注于硬件及其它基礎設施。沒有支撐軟件(如文件系統(tǒng)及網(wǎng)絡協(xié)議),硬件支持將毫無意義(just so much a dead wood)。
網(wǎng)絡
先進的網(wǎng)絡支持一直是Linux的主要財富之一。Linux作為一種操作系統(tǒng),已經(jīng)可以支持世界上大多數(shù)主流網(wǎng)絡協(xié)議,包括TCP/IP(v4和v6)、AppleTalk、IPX等。(就"等"而言,唯一較為普遍的是微軟老的、復雜的NETBIOS/NetBEUI協(xié)議。)
像許多其它子系統(tǒng)一樣,網(wǎng)絡硬件針對Linux2.6的改變是在幕后進行的,顯得并不那么直接。這包括旨在利用Linux的設備模型底層的改進和許多設備驅(qū)動程序的升級。例如,Linux 2.6提供一個獨立的MII(媒體獨立接口,或是IEEE 802.3u)子系統(tǒng),它被許多網(wǎng)絡設備驅(qū)動程序使用。新的子系統(tǒng)替換了原先系統(tǒng)中各自運行的多個實例,消除了原先系統(tǒng)中多個驅(qū)動程序使用重復代碼、采用類似的方法處理設備的MII支持的情況。其他改變還包括對ISDN的改進等。
在軟件方面,Linux的一個重要改進是提供了對IPsec協(xié)議的支持。IPsec,或者稱之為安全IP,是在網(wǎng)絡協(xié)議層為IPv4和IPv6提供加密支持的一組協(xié)議。由于安全是在協(xié)議層提供的,對應用層是透明的。它與SSL協(xié)議及其他tunneling/security協(xié)議很相似,但是位于一個低地多的層面。當前內(nèi)核支持的加密算法包括SHA("安全散列算法")、DES("數(shù)據(jù)加密標準")等。
在協(xié)議方面,Linux還加強了對多播網(wǎng)絡的支持。網(wǎng)絡多播使得由一點發(fā)出的數(shù)據(jù)包可以被多臺計算機接收(傳統(tǒng)的點對點網(wǎng)絡每次只能有兩方通信)。這一功能主要被即時通訊系統(tǒng)(如Tibco)以及音頻/視頻會議軟件使用。Linux 2.6現(xiàn)在支持若干新的SSM協(xié)議(定源多播),包括MLDv2(multicast listner discovery 多播偵聽發(fā)現(xiàn))協(xié)議以及IGMPv3(Internet組管理協(xié)議)協(xié)議。這些都是標準協(xié)議,被多數(shù)高端網(wǎng)絡硬件提供商所支持,如思科。
Linux 2.6也提供了一個分離的LLC棧。LLC,即邏輯鏈路控制協(xié)議(IEEE 802.2),是一個底層協(xié)議,在若干個常用的高層網(wǎng)絡協(xié)議之下使用,如Microsoft的NetBeui,IPX,以及AppleTalk。作為修改的一部分,IPX,AppleTalk,以及令牌環(huán)驅(qū)動程序都已被重寫,以利用這個新的公用子系統(tǒng)。此外,一個外部源(an outside source)整合了可以工作的NetBEUI協(xié)議棧,它是否要被加到的標準內(nèi)核中還有待研究。
除了以上這些,還有其他一些小的改變。IPv6做了一些主要的改進,使其可以運行在令牌環(huán)網(wǎng)絡中。Linux的NAT/Masquerading 支持也得到了擴展,從更好地處理需要多個連接的協(xié)議(H.323,PPTP等)。在Linux的路由器前端,對配置VLAN的支持也已經(jīng)成熟,不再是"試驗性的"的了。
網(wǎng)絡文件系統(tǒng)
Linux對網(wǎng)絡文件系統(tǒng)的支持構建在Linux健壯的網(wǎng)絡協(xié)議支持之上,它也同樣健壯。安裝或者輸出(export)一個網(wǎng)絡文件系統(tǒng),是需要內(nèi)核直接參與的為數(shù)不多的幾個上層網(wǎng)絡相關操作之一。(另外比較明顯的還有對于網(wǎng)絡塊設備的支持,在2.6中沒有特別大的改變,并且也只是在類似文件系統(tǒng)操作的特定應用中使用。)所有其他的網(wǎng)絡相關操作都可以被放到用戶空間去,而不需要核心開發(fā)人員去考慮。
在Linux和類UNIX世界中,最普遍的網(wǎng)絡文件系統(tǒng)是一個名為Network File System的文件系統(tǒng),簡稱NFS。
NFS是一個復雜的文件共享協(xié)議,跟UNIX特別是Sun Solaris有相當深厚的淵源??梢允褂肨CP或UDP作為NFS的主要傳輸協(xié)議,但也需要其他一些子協(xié)議,這些協(xié)議又各自運行在RPC(遠程過程調(diào)用)協(xié)議之上。這其中包括獨立的用于認證的mount協(xié)議以及用于文件鎖的NLM(network lock manager)。(通常的實現(xiàn)版本同時也跟其他一些基于RPC的協(xié)議緊密地結合在一起,比如用于身份驗證的NIS-網(wǎng)絡信息服務--用于認證。NIS在Linux機器上沒有得到廣泛應用,主要因為它缺乏安全性。)可能正是因為NFS協(xié)議如此的復雜性,才沒有被作為"Internet協(xié)議"廣泛接受。
Linux 2.6中,NFS文件系統(tǒng)得到了很大的更新和改進。最大的改進就是實驗性地支持新的并且還沒有被廣泛接受的NFSv4協(xié)議(以前的linux版本支持NFS2和NFS3兩種協(xié)議)在客戶端和服務器端的實現(xiàn)。新的版本有更強、更安全的身份認證(采用加密技術),支持更智能化的鎖管理,支持偽文件系統(tǒng)等。Linux還沒有實現(xiàn)所有NFS4的新特征,但是目前的版本已經(jīng)比較穩(wěn)定并且能夠支持一些產(chǎn)品級的應用。并且,基于Linux的NFS服務端的實現(xiàn)已得到改進,從而具有了更好的擴展性,更好的完整性(支持UDP還支持TCP),更健壯(文件系統(tǒng)在輸出文件的時候能夠進行調(diào)整以維持它們自有的一些特征),更簡便的管理(通過新的nfsd文件系統(tǒng),而不再是系統(tǒng)調(diào)用)。還有其他方面的一些改進,比如分離lockd和nfsd,支持零拷貝傳輸?shù)取FS客戶端也因為底層RPC協(xié)議在緩存機制、UDP連接控制以及其他在TCP協(xié)議上的改進而受益。Linux支持NFS共享卷作為根文件系統(tǒng)的功能也因為核心對TCP協(xié)議上的NFS的改進而改進。
除了改進對UNIX風格的網(wǎng)絡文件系統(tǒng)的支持,Linux 2.6對于Windows類型的網(wǎng)絡文件系統(tǒng)的支持也進行了改進。Windows服務器(也包括OS/2和其他一些操作系統(tǒng))的標準共享文件系統(tǒng)是遵循SMB(server message block)協(xié)議的,Linux核心在SMB協(xié)議的客戶端對該協(xié)議的很多版本都已經(jīng)有了非常優(yōu)秀的支持。然而,Windows2000將SMB協(xié)議的一個超集的升級版標準化了,即熟知的CIFS("common internet filesystem")。CIFS修改的主要目的是簡化與精煉SMB協(xié)議中一些比較混亂的部分。(注:協(xié)議之前的定義很松散,甚至會出現(xiàn)Win95/98/ME版與WinNT/Win2k版不兼容的情況。)CIFS達到了修改的目的,并且增加了UNICODE支持,改善了文件鎖,支持硬鏈接,徹底消除了對NetBIOS的依賴,并給Windows用戶增加了一些新的特征。既然Linux用戶不打算始終呆在被遺忘的角落(譯者注:CIFS是Windows系統(tǒng)提出的標準,之前僅在Windows系統(tǒng)之上有實現(xiàn)),Linux 2.6核心對本地安裝CIFS文件系統(tǒng)的部分徹底進行了重寫。Linux 2.6現(xiàn)在也支持SMB和CIFS的擴展--SMB-UNIX,該擴展使得Linux可以訪問SMB服務器(比如Samba)上的可能存在的非Windows的文件類型(比如設備節(jié)點和符號鏈接)。
盡管現(xiàn)在已經(jīng)不常見到,但是Linux還是沒有完全忘記Novell NetWare用戶。Linux 2.6最多允許256個Linux客戶端安裝同一個使用NCP(NetWare Core Protocol)文件系統(tǒng)驅(qū)動的NetWare卷。
Linux 2.6也加入了相對新的一些分布式網(wǎng)絡文件系統(tǒng)(即在一個邏輯卷上的文件可以分布在多個節(jié)點中)的支持。除了Linux 2.4中引入的CODA文件系統(tǒng),Linux現(xiàn)在也包含對另兩個分布式文件系統(tǒng):AFS和InterMezzo的支持。AFS,即the Andrew filesystem(如此命名是因為它最初是CMU開發(fā)的),特性非常有限,目前只支持讀操作。另一個新支持的文件系統(tǒng)InterMezzo(也是CMU開發(fā)的)也在Linux2.6中得到支持;它具有一些更為先進的特性,如:無連接操作(工作在客戶端的緩存中),適合要求高可用性的應用,在那些應用環(huán)境中,需要保證存儲區(qū)永遠可用。同時它也支持保持數(shù)據(jù)在多個計算機之間(比如筆記本電腦、PDA和桌面電腦)同步的應用。很多對這些新的文件系統(tǒng)提供支持的項目都是在Linux平臺上實現(xiàn)的,這也使得Linux能夠走在對這些新特性支持的最前面。
其他特性
安全性
Linux2.6的另一個沒有引起足夠注意的大的變化是跟安全相關的變化。甚至本質(zhì)上,整個基于核心的安全體系(在類UNIX操作系統(tǒng)中的超級用戶權限)已經(jīng)被劃分成一些可以被替換的安全模塊。(不過目前提供的安全模式只有缺省的一個,權當一個向我們展示如何自定義安全模塊的例子。)作為這個變化的一部分,核心所有的部分都被更新以具有更細粒度的用戶訪問控制,而不是象以前的"超級用戶"系統(tǒng)。雖然幾乎所有的Linux系統(tǒng)中將仍然存在一個具有完全訪問權限的root用戶,但上述的改變使得類Linux系統(tǒng)可以不再必須如此。另一個安全相關的變化是一些二進制模塊(比如硬件廠商提供的驅(qū)動程序)不能再重載系統(tǒng)調(diào)用,也不能看到以及修改系統(tǒng)調(diào)用表。這極大地限制了非開放源碼的模塊在核心中的訪問,同時也修補了GPL版權協(xié)議在這方面的一些可能存在的漏洞。最后一個跟安全相關的變化就是新的核心能夠使用硬件隨機數(shù)生成器(一些新的處理器中提供),而不是依靠隨機的硬件熵值變化。
虛擬Linux
Linux 2.6一個很有趣的特點是自包含了一個"用戶態(tài)(user-mode)"的體系結構。它本質(zhì)上是一種移植--將Linux移植到它自身(正如移植到不同的硬件體系那樣),從而允許一個完全虛擬的Linux-on-Linux運行環(huán)境。新的Linux實例像普通應用程序一樣運行。在這個新的Linux內(nèi)部,你可以配置偽網(wǎng)絡、文件系統(tǒng)或者其他一些設備,整個過程通過專用的驅(qū)動程序與宿主Linux進行安全交互。這被證明不僅是在開發(fā)方面(進行分析、統(tǒng)計等),而且在安全分析和密罐(honeypots)技術中都是非常有用的。當然大多數(shù)用戶還不需要這樣的支持,它只是被當作了一個可以運行在你的機器上的很酷的特性而已。(給你的朋友留下深刻的印象!)
筆記本電腦
除了上面提到的一些通用的支持(比如APM和ACPI的改進,以及對無線支持的改進等),Linux還有兩個很難分類的與筆記本電腦用戶相關的特征。第一個是新核心支持的軟停機磁盤存儲(sofware-suspend-to-disk 譯者注:保存內(nèi)存鏡像到磁盤,之后停機--類似halt,再次開機時內(nèi)核從磁盤獲取保存的內(nèi)存鏡像并恢復運行;軟停機功能不需要APM、ACPI等硬件支持)。
另一個是對現(xiàn)代移動處理器的可根據(jù)用戶是否在使用機器從而作出cpu運行速度(以及相應的電源需求)自動調(diào)節(jié)的支持。
向后兼容
盡管Linux 2.6是大的內(nèi)核升級,但是對用戶層應用的影響幾乎是不存在的。主要的例外是線程,一些能夠在2.4或2.2上運行的多線程程序?qū)⒉荒茉?.6上運行。
當然,一些底層的應用如模塊工具將肯定不能工作。另外,/proc目錄和/dev目錄下的一些文件和格式也發(fā)生了變化,如果上層應用對此有依賴,也可能不能繼續(xù)工作。(當更多的內(nèi)容被移動到/sys虛擬文件系統(tǒng)中的時候,情況尤其如此。在/dev目錄中,向后兼容的設備名很容易就能推出來。)
除了提到的這些明顯的變化,還有很多小的變化可能會對一些應用環(huán)境產(chǎn)生影響。首先,非常陳舊的(linux 2.0或更早)交換分區(qū)需要重新格式化才能在2.6中使用。(由于交換分區(qū)并不包含永久數(shù)據(jù),這對用戶來說不會是問題。)由于多數(shù)抑制Apache,Zeus等http服務器接近內(nèi)核速度的的性能瓶頸已經(jīng)被解決,之前的允許核心直接提供網(wǎng)頁服務的kHTTPd守護進程也被去除。
對諸如陳舊硬盤的OnTrack和EzDriveDOS磁盤管理器以及相應的DOS兼容性的支持也被去除。從軟盤上含有核心的啟動扇區(qū)進行啟動的支持也被去除,取而代之的是SysLinux。最后,soundmodem功能也被去除了,但是用戶空間的版本維護地更好,并且更加實用。
寫在最后
這篇文檔主要出自BitKeeper changelogs的長時間的閱讀,對源代碼的"賞玩"(looking at and playing with),對郵件列表的閱讀,以及很多很多為完成本文所進行的Google和Lycos或這或那的搜索。盡管如此,文中可能有遺漏或者理解有誤的地方。我也盡量地小心地不過分使用那些被合并入內(nèi)核的項目網(wǎng)頁,因為它們相對官方的內(nèi)核版本支持要"大大超前"。如果您發(fā)現(xiàn)這篇文檔中的任何錯誤,或者希望email給我詢問我的情況,您可以email給jpranevich@kniggit.net。
具有更多技術背景的人可能只需要一個公告列表,Dave Jones編寫了另一份出色的2.6開發(fā)進展的總括:http:/www.codemonkey.org.uk/post-halloween-2.5.txt。他的工作與本文的任何相似之處純屬巧合,因為我們都始于源代碼,并且都側重于x86體系。
pid控制相關文章:pid控制原理
linux相關文章:linux教程
評論