第1章 概述
本章首先回顧了 Linux 操作系統(tǒng)的誕生、開發(fā)和成長過程,由此可以理解本書為什么會選擇 Linux 系統(tǒng)早期版本作為學(xué)習(xí)對象的一些原因。然后具體說明了選擇早期 Linux 內(nèi)核版本進行學(xué)習(xí)的優(yōu)點和不 足之處以及如何開始進一步的學(xué)習(xí)。最后對各章的內(nèi)容進行了簡要介紹。
1.1 Linux 的誕生和發(fā)展
Linux 操作系統(tǒng)是 UNIX 操作系統(tǒng)的一種克隆系統(tǒng)。它誕生于 1991 年的 10 月 5 日(這是第一次正 式向外公布的時間)。此后借助于 Internet 網(wǎng)絡(luò),經(jīng)過全世界各地計算機愛好者的共同努力,現(xiàn)已成為當(dāng) 今世界上使用最多的一種 UNIX 類操作系統(tǒng),并且使用人數(shù)還在迅猛增長。
Linux 操作系統(tǒng)的誕生、發(fā)展和成長過程依賴于以下五個重要支柱:UNIX 操作系統(tǒng)、MINIX 操作 系統(tǒng)、GNU 計劃、POSIX 標(biāo)準(zhǔn)和 Internet 網(wǎng)絡(luò)。下面根據(jù)這五個基本線索來追尋一下 Linux 的開發(fā)歷程、 它的醞釀過程以及最初的發(fā)展經(jīng)歷。首先分別介紹其中的四個基本要素,然后根據(jù) Linux 的創(chuàng)始人 Linus Toravlds 從對計算機感興趣而自學(xué)計算機知識、到心里開始醞釀編制一個自己的操作系統(tǒng)、到最初 Linux 內(nèi)核 0.01 版公布以及從此如何艱難地一步一個腳印地在全世界 hacker 的幫助下最后推出比較完善1.0版本這段時間的發(fā)展經(jīng)過,也即對 Linux 的早期發(fā)展歷史進行詳細介紹。
當(dāng)然,目前 Linux 內(nèi)核版本已經(jīng)開發(fā)到了 2.5.52 版。而大多數(shù) Linux 系統(tǒng)中所用到的內(nèi)核是穩(wěn)定的2.4.20 版內(nèi)核(其中第 2 個數(shù)字若是奇數(shù)則表示是正在開發(fā)的版本,不能保證系統(tǒng)的穩(wěn)定性)。對于 Linux的一般發(fā)展史,許多文章和書籍都有介紹,這里就不重復(fù)。
1.1.1 UNIX 操作系統(tǒng)的誕生
Linux 操作系統(tǒng)是UNIX 操作系統(tǒng)的一個克隆版本。 UNIX 操作系統(tǒng)是美國貝爾實驗室的Ken.Thompson 和 Dennis Ritchie 于 1969 年夏在 DEC PDP-7 小型計算機上開發(fā)的一個分時操作系統(tǒng)。
Ken Thompson 為了能在閑置不用的 PDP-7 計算機上運行他非常喜歡的星際旅行(Space travel)游 戲,于是在 1969 年夏天乘他夫人回家鄉(xiāng)加利福尼亞渡假期間,在一個月內(nèi)開發(fā)出了 UNIX 操作系統(tǒng)的原 型。當(dāng)時使用的是 BCPL 語言(基本組合編程語言),后經(jīng) Dennis Ritchie 于 1972 年用移植性很強的 C 語言進行了改寫,使得 UNIX 系統(tǒng)在大專院校得到了推廣。
1.1.2 MINIX 操作系統(tǒng)
MINIX 系統(tǒng)是由 Andrew S. Tanenbaum(AST)開發(fā)的。AST 是在荷蘭 Amsterdam 的 Vrije 大學(xué)數(shù)學(xué) 與計算機科學(xué)系統(tǒng)工作,是 ACM 和 IEEE 的資深會員(全世界也只有很少人是兩會的資深會員)。共發(fā)表了 100 多篇文章,5 本計算機書籍。
AST 雖出生在美國紐約,但卻是荷蘭僑民(1914 年他的祖輩來到美國)。他在紐約上的中學(xué)、M.I.T 上的大學(xué)、加洲大學(xué) Berkeley 分校念的博士學(xué)位。由于讀博士后的緣故,他來到了家鄉(xiāng)荷蘭。從此就與 家鄉(xiāng)一直有來往。后來就在 Vrije 大學(xué)開始教書、帶研究生。荷蘭首都 Amsterdam 是個常年陰雨綿綿的 城市,但對于 AST 來說,這最好不過了,因為在這樣的環(huán)境下他就可以經(jīng)常待在家中擺弄他的計算機了。 MINIX 是他 1987 年編制的,主要用于學(xué)生學(xué)習(xí)操作系統(tǒng)原理。到 1991 年時版本是 1.5。目前主要 有兩個版本在使用:1.5 版和 2.0 版。當(dāng)時該操作系統(tǒng)在大學(xué)使用是免費的,但其它用途則不是。當(dāng)然目前 MINIX 系統(tǒng)已經(jīng)是免費的,可以從許多 FTP 上下載。
對于 Linux 系統(tǒng),他后來曾表示對其開發(fā)者 Linus 的稱贊。但他認為 Linux 的發(fā)展很大原因是由于 他為了保持 MINIX 的小型化,能讓學(xué)生在一個學(xué)期內(nèi)就能學(xué)完,因而沒有接納全世界許多人對 MINIX 的擴展要求。因此在這樣的前提下激發(fā)了 Linus 編寫 Linux 系統(tǒng)。當(dāng)然 Linus 也正好抓住了這個好時機。 作為一個操作系統(tǒng),MINIX 并不是優(yōu)秀者,但它同時提供了用 C 語言和匯編語言編寫的系統(tǒng)源代碼。 這是第一次使得有抱負的程序員或 hacker 能夠閱讀操作系統(tǒng)的源代碼。在當(dāng)時,這種源代碼是軟件商們一直小心守護著的秘密。
1.1.3 GNU 計劃
GNU 計劃和自由軟件基金會 FSF(the Free Software Foundation)是由 Richard M. Stallman 于 1984 年一 手創(chuàng)辦的。旨在開發(fā)一個類似 UNIX 并且是自由軟件的完整操作系統(tǒng):GNU 系統(tǒng)(GNU 是"GNU's Not Unix"的遞歸縮寫,它的發(fā)音為"guh-NEW")。各種使用 Linux 作為核心的 GNU 操作系統(tǒng)正在被廣泛的使 用。雖然這些系統(tǒng)通常被稱作"Linux",但是 Stallman 認為,嚴(yán)格地說,它們應(yīng)該被稱為 GNU/Linux 系 統(tǒng)。
到上世紀(jì)90 年代初,GNU 項目已經(jīng)開發(fā)出許多高質(zhì)量的免費軟件,其中包括有名的 emacs 編輯系 統(tǒng)、bash shell 程序、gcc 系列編譯程序、gdb 調(diào)試程序等等。這些軟件為 Linux 操作系統(tǒng)的開發(fā)創(chuàng)造了一個 合適的 環(huán)境。 這是 Linux 能夠誕生的基礎(chǔ)之一, 以至于 目前許 多人 都將 Linux 操作系統(tǒng)稱 為 “GNU/Linux”操作系統(tǒng)。
1.1.4 POSIX 標(biāo)準(zhǔn)
POSIX(Portable Operating System Interface for Computing Systems)是由 IEEE 和 ISO/IEC 開發(fā)的一 簇標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)是基于現(xiàn)有的 UNIX 實踐和經(jīng)驗,描述了操作系統(tǒng)的調(diào)用服務(wù)接口。用于保證編制的應(yīng) 用程序可以在源代碼一級上在多種操作系統(tǒng)上移植和運行。它是在 1980 年早期一個 UNIX 用戶組(usr/group)的早期工作基礎(chǔ)上取得的。該 UNIX 用戶組原來試圖將 AT&T 的 System V 操作系統(tǒng)和 BerkeleyCSRG 的 BSD 操作系統(tǒng)的調(diào)用接口之間的區(qū)別重新調(diào)和集成。并于 1984 年定制出了/usr/group 標(biāo)準(zhǔn)。
1985 年,IEEE 操作系統(tǒng)技術(shù)委員會標(biāo)準(zhǔn)小組委員會(TCOS-SS)開始在 ANSI 的支持下責(zé)成 IEEE 標(biāo)準(zhǔn)委員會制定有關(guān)程序源代碼可移植性操作系統(tǒng)服務(wù)接口正式標(biāo)準(zhǔn)。到了 1986 年 4 月,IEEE 制定出 了試用標(biāo)準(zhǔn)。第一個正式標(biāo)準(zhǔn)是在 1988 年 9 月份批準(zhǔn)的(IEEE 1003.1-1988),也既以后經(jīng)常提到的 POSIX.1 標(biāo)準(zhǔn)。
到 1989 年,POSIX 的工作被轉(zhuǎn)移至 ISO/IEC 社團,并由 15 工作組繼續(xù)將其制定成 ISO 標(biāo)準(zhǔn)。到 1990年,POSIX.1 與已經(jīng)通過的 C 語言標(biāo)準(zhǔn)聯(lián)合,正式批準(zhǔn)為 IEEE 1003.1-1990(也是 ANSI 標(biāo)準(zhǔn))和 ISO/IEC9945-1:1990 標(biāo)準(zhǔn)。
POSIX.1 僅規(guī)定了系統(tǒng)服務(wù)應(yīng)用程序編程接口(API),僅概括了基本的系統(tǒng)服務(wù)標(biāo)準(zhǔn)。因此工作組 期望對系統(tǒng)的其它功能也制定出標(biāo)準(zhǔn)。這樣 IEEE POSIX 的工作就開始展開了。剛開始有十個批準(zhǔn)的計 劃在進行,有近 300 多人參加每季度為期一周的會議。著手的工作有命令與工具標(biāo)準(zhǔn)(POSIX.2)、測試方 法標(biāo)準(zhǔn)(POSIX.3)、實時 API(POSIX.4)等。到了 1990 年上半年已經(jīng)有 25 個計劃在進行,并且有 16 個工作組參與了進來。與此同時,還有一些組織也在制定類似的標(biāo)準(zhǔn),如 X/Open,AT&T,OSF 等。
在 90 年代初,POSIX 標(biāo)準(zhǔn)的制定正處在最后投票敲定的時候,那是 1991-1993 年間。此時正是 Linux 剛剛起步的時候,這個 UNIX 標(biāo)準(zhǔn)為 Linux 提供了極為重要的信息,使得 Linux 能夠在標(biāo)準(zhǔn)的指導(dǎo)下進 行開發(fā),并能夠與絕大多數(shù) UNIX 操作系統(tǒng)兼容。在最初的 Linux 內(nèi)核源代碼中(0.01 版、0.11 版)就 已經(jīng)為 Linux 系統(tǒng)與 POSIX 標(biāo)準(zhǔn)的兼容做好了準(zhǔn)備工作。在 Linux 0.01 版內(nèi)核的/include/unistd.h 文件中 就已經(jīng)定義了幾個有關(guān) POSXI 標(biāo)準(zhǔn)要求的符號常數(shù),而且 Linus 在注釋中已寫道:“OK,這也許是個玩 笑,但我正在著手研究它呢”。
1991 年7 月3 日在comp.os.minix 上發(fā)布的post 上就已經(jīng)提到了正在搜集POSIX 的資料。其中透露了他正在著手一個操作系統(tǒng)的開發(fā),并且在開發(fā)之初已經(jīng)想到要實現(xiàn)與POSIX 相兼容的問題了。
1.1.5 Linux 操作系統(tǒng)的誕生
在 1981 年,IBM 公司推出了享譽全球的微型計算機IBM PC。在1981-1991 年間,MS-DOS 操作系統(tǒng)一直是微型計算機操作系統(tǒng)的主宰。此時計算機硬件價格雖然逐年下降,但軟件價格仍然居高不下。當(dāng)時Apple 的MACs 操作系統(tǒng)可以說是性能最好的,但是其天價使得沒人能夠輕易靠近。
當(dāng)時的另一個計算機技術(shù)陣營就是UNIX 世界。但是UNIX 操作系統(tǒng)就不僅是價格昂貴的問題了。為了尋求高利潤率,UNIX 經(jīng)銷商們把價格抬得極高,PC 小用戶根本不能靠近它。曾經(jīng)一度收到Bell Labs許可而能在大學(xué)中用于教學(xué)的UNIX 源代碼也一直被小心地守衛(wèi)著不許公開。對于廣大的PC 用戶,軟件行業(yè)的大型供應(yīng)商們始終沒有給出有效的解決這個問題的手段。
正在此時,出現(xiàn)了MINIX 操作系統(tǒng),并且有一本描述其設(shè)計實現(xiàn)原理的書同時發(fā)行。由于AST 的這本書寫的非常詳細,并且敘述得有條有理,于是幾乎全世界的計算機愛好者都開始看這本書,以期能理解操作系統(tǒng)的工作原理。其中也包括Linux 系統(tǒng)的創(chuàng)始者Linus Benedict Torvalds。
當(dāng)時(1991 年),Linus Benedict Torvalds 是赫爾辛基大學(xué)計算機科學(xué)系的二年級學(xué)生,也是一個自學(xué)的計算機hacker。這個21 歲的芬蘭年輕人喜歡鼓搗他的計算機,測試計算機的性能和限制。但當(dāng)時他所缺乏的就是一個專業(yè)級的操作系統(tǒng)。
在同一年間,GNU 計劃已經(jīng)開發(fā)出了許多工具軟件。其中最受期盼的GNU C 編譯器已經(jīng)出現(xiàn),但還沒有開發(fā)出免費的GNU 操作系統(tǒng)。即使是教學(xué)使用的MINIX 操作系統(tǒng)也開始有了版權(quán),需要購買才能得到源代碼。雖然GNU 的操作系統(tǒng)HURD 一直在開發(fā)之中,但在當(dāng)時看來不能在幾年內(nèi)完成。
為了能更好地學(xué)習(xí)計算機知識(或許也只是為了興趣?),Linus 使用圣誕節(jié)的壓歲錢和貸款購買了一臺386 兼容電腦,并從美國郵購了一套MINIX 系統(tǒng)軟件。就在等待MINIX 軟件期間,Linus 認真學(xué)習(xí)了有關(guān)Intel 80386 的硬件知識。為了能通過Modem 撥號連接到學(xué)校的主機上,他使用匯編語言并利用80386 CPU 的多任務(wù)特性編制出一個終端仿真程序。此后為了將自己一臺老式電腦上的軟件復(fù)制到新電腦上,他還為軟盤驅(qū)動器、鍵盤等硬件設(shè)備編制出相應(yīng)的驅(qū)動程序。
通過編程實踐,并在學(xué)習(xí)過程中認識到MINIX 系統(tǒng)的諸多限制(MINIX 雖然很好,但只是一個用于教學(xué)目的簡單操作系統(tǒng),而不是一個強有力的實用操作系統(tǒng)),而且通過上述實踐Linus 已經(jīng)有了一些類似于操作系統(tǒng)硬件設(shè)備驅(qū)動程序的代碼,于是他開始有了編制一個新操作系統(tǒng)的想法。此時GNU 計劃已經(jīng)開發(fā)出許多工具軟件,其中最受期盼的GNU C 編譯器已經(jīng)出現(xiàn)。雖然GNU的免費操作系統(tǒng)HURD正在開發(fā)中。但Linus 已經(jīng)等不急了。
從 1991 年4 月份起,他通過修改終端仿真程序和硬件驅(qū)動程序,開始編制起自己的操作系統(tǒng)來。剛開始,他的目的很簡單,只是為了學(xué)習(xí)Intel 386 體系結(jié)構(gòu)保護模式運行方式下的編程技術(shù)。但后來Linux的發(fā)展卻完全改變了初衷。根據(jù)Linus 在comp.os.minix 新聞組上發(fā)布的消息,我們可以知道他逐步從學(xué)習(xí)MINIX 系統(tǒng)階段發(fā)展到開發(fā)自己的Linux 系統(tǒng)的過程。
Linus 第1 次向comp.os.minix 投遞消息是在1991 年3 月29 日。所發(fā)帖子的題目是“gcc on minix-386 doesn't optimize”,是有關(guān)gcc 編譯器在MINIX-386 系統(tǒng)上運行優(yōu)化的問題(MINIX-386 是一個由Bruce Evans 改進的利用Intel 386 特性的32 位MINIX 系統(tǒng))。由此可知,Linus 在1991 年初期就已經(jīng)開始深入研究了MINIX 系統(tǒng),并在這段時間有了改進MINIX 操作系統(tǒng)的思想。在進一步學(xué)習(xí)MINIX 系統(tǒng)之后,這個想法逐步演變成想重新設(shè)計一個基于Intel 80386 體系結(jié)構(gòu)的新操作系統(tǒng)的構(gòu)思。
他在回答有人提出MINIX 上的一個問題時,所說的第一句話就是“閱讀源代碼”(“RTFSC (Read the F**ing Source Code :-)”)。他認為答案就在源程序中。這也說明了對于學(xué)習(xí)系統(tǒng)軟件來說,我們不光需要懂得系統(tǒng)的工作基本原理,還需要結(jié)合實際系統(tǒng),學(xué)習(xí)實際系統(tǒng)的實現(xiàn)方法。因為理論畢竟是理論,其中省略了許多枝節(jié),而這些枝節(jié)問題雖然沒有太多的理論含量,但卻是一個系統(tǒng)必要的組成部分,就象麻雀身上的一根羽毛。
從 1991 年4 月份開始,Linus 幾乎花費了全部時間研究MINIX-386 系統(tǒng)(Hacking the kernel),并且嘗試著移植GNU 的軟件到該系統(tǒng)上(GNU gcc、bash、gdb 等)。并于4 月13 日在comp.os.minix 上發(fā)布說自己已經(jīng)成功地將bash 移植到了MINIX 上,而且已經(jīng)愛不釋手、不能離開這個shell 軟件了。
第一個與Linux 有關(guān)的消息是在1991 年7 月3 日在comp.os.minix 上發(fā)布的(當(dāng)然,那時還不存在Linux 這個名稱,當(dāng)時Linus 腦子里想的名稱可能是FREAX ?,F(xiàn)REAX 的英文含義是怪誕的、怪物、異想天開等)。其中透露了他正在進行Linux 系統(tǒng)的開發(fā),并且已經(jīng)想到要實現(xiàn)與POSIX 兼容的問題了。
在 Linus 另一個發(fā)布的消息中(1991 年8 月25 日 comp.os.minix),他向所有MINIX 用戶詢問“What would you like to see in minix?”(“你最想在MINIX 系統(tǒng)中見到什么?”),在該消息中他首次透露出正在開發(fā)一個(免費的)386(486)操作系統(tǒng),并且說只是興趣而已,代碼不會很大,也不會象GNU 的那樣專業(yè)。
希望大家反饋一些對于MINIX 系統(tǒng)中喜歡哪些特色不喜歡什么等信息,并且說明由于實際和其它一些原因,新開發(fā)的系統(tǒng)剛開始與MINIX 很象(并且使用了MINIX 的文件系統(tǒng))。并且已經(jīng)成功地將bash(1.08版)和gcc(1.40 版)移植到了新系統(tǒng)上,而且在過幾個月就可以實用了。
最后,Linus 申明他開發(fā)的操作系統(tǒng)沒有使用一行MINIX 的源代碼;而且由于使用了386 的任務(wù)切換特性,所以該操作系統(tǒng)不好移植(沒有可移植性),并且只能使用AT 硬盤。對于Linux 的移植性問題,Linus 當(dāng)時并沒有考慮。但是目前Linux 幾乎可以運行在任何一種硬件體系結(jié)構(gòu)上。
到了 1991 年的10 月5 日,Linus 在comp.os.minix 新聞組上發(fā)布消息,正式向外宣布Linux 內(nèi)核系統(tǒng)的誕生(Free minix-like kernel sources for 386-AT)。這段消息可以稱為Linux 的誕生宣言,并且一直廣為流傳。因此10 月5 日對Linux 社區(qū)來說是一個特殊的日子,許多后來Linux 的新版本發(fā)布時都選擇了這個日子。所以RedHat 公司選擇這個日子發(fā)布它的新系統(tǒng)也不是偶然的。
1.1.6 Linux 操作系統(tǒng)版本的變遷
Linux 操作系統(tǒng)從誕生到1.0 版正式出現(xiàn),共發(fā)布了表1–1 中所示的一些主要版本。
表 1–1 內(nèi)核的主要版本
版本號
|
發(fā)布日期
|
說明
|
0.00
|
(1991.2-4)
|
兩個進程,分別在屏幕上顯示’AAA’和’BBB’。
|
0.01
|
(1991.8)
|
第一個正式向外公布的 Linux 內(nèi)核版本。多線程文件系統(tǒng)、分段
和分頁內(nèi)存管理。
|
0.02
|
(1991.10.5)
|
該版本以及 0.03 版是內(nèi)部版本,目前已經(jīng)無法找到特點同上。
|
0.10
|
(1991.10)
|
由 Ted Ts’o 發(fā)布的 Linux 內(nèi)核版本。增加了內(nèi)存分配庫函數(shù)。
|
0.11
|
(1991.12.8)
|
基本可以正常運行的內(nèi)核版本。至此硬盤和軟驅(qū)驅(qū)動。
|
0.12
|
(1992.1.15)
|
主要增加了數(shù)學(xué)協(xié)處理器的軟件模擬程序,增加了作業(yè)控制、虛
擬控制臺、文件符號鏈接和虛擬內(nèi)存對換功能。
|
0.95(0.13)
|
(1992.3.8)
|
加入虛擬文件系統(tǒng)支持,增加了登錄功能。改善了軟盤驅(qū)動程序
和文件系統(tǒng)的性能。改變了硬盤編號方式。支持 CDROM。
|
0.96
|
(1992.5.12)
|
開始加入網(wǎng)絡(luò)支持。改善了串行驅(qū)動、高速緩沖、內(nèi)存管理的性
能,支持動態(tài)鏈接庫,并能運行 X-Windows 程序。
|
0.97
|
(1992.8.1)
|
增加了對新的 SCSI 驅(qū)動程序的支持。
|
0.98
|
(1992.9.29)
|
改善了對 TCP/IP(0.8.1)網(wǎng)絡(luò)的支持,糾正了 extfs 的錯誤。
|
0.99
|
(1992.12.13)
|
重新設(shè)計進程對內(nèi)存的使用分配,每個進程有 4G 線性空間。
|
1.0
|
(1994.3.14)
|
第一個正式版。
|
將 Linux 系統(tǒng) 0.13 版內(nèi)核直接改稱 0.95 版,Linus 的意思是讓大家不要覺得離 1.0 版還很遙遠。同時,從 0.95 版開始,對內(nèi)核的許多改進之處(補丁程序的提供)均以其他人為主了,而 Linus 的主要任務(wù) 開始變成對內(nèi)核的維護和決定是否采用某個補丁程序。到現(xiàn)在為止,最新的內(nèi)核版本是 2003 年 12 月 18 日公布的 2.6.2 版。其中包括大約 15000 個文件,而且使用 gz 壓縮后源代碼軟件包也有 40MB 左右!到現(xiàn)在為止,最新版見表 1–2 所示。
表 1–2 新內(nèi)核源代碼字節(jié)數(shù)
內(nèi)核版本號
|
發(fā)布日期
|
源代碼大小(經(jīng) gz 壓縮后)
|
2.4.22
|
2004.2.4
|
35MB
|
2.6.5
|
2004.4.4
|
41MB
|
1.1.7 Linux 名稱的由來
Linux 操作系統(tǒng)剛開始時并沒有被稱作 Linux,Linus 給他的操作系統(tǒng)取名為 FREAX,其英文含義是 怪誕的、怪物、異想天開等意思。在他將新的操作系統(tǒng)上載到 ftp.funet.fi 服務(wù)器上時,管理員 Ari Lemke 很不喜歡這個名稱。他認為既然是 Linus 的操作系統(tǒng)就取其諧音 Linux 作為該操作系統(tǒng)的目錄吧,于是 Linux 這個名稱就開始流傳下來。
在 Linus 的自傳《Just for Fun》一書中,Linus 解釋說1:
“坦白地說,我從來沒有想到過要用 Linux 這個名稱發(fā)布這個操作系統(tǒng),因為這個名字有些太自負 了。而我為最終發(fā)布版準(zhǔn)備的是什么名字呢?Freax。實際上,內(nèi)核代碼中某些早期的 Makefile - 用于描 述如何編譯源代碼的文件 - 文件中就已經(jīng)包含有“Freax”這個名字了,大約存在了半年左右。但其實這 也沒什么關(guān)系,在當(dāng)時還不需要一個名字,因為我還沒有向任何人發(fā)布過內(nèi)核代碼。”
“而 Ari Lemke,他堅持要用自己的方式將內(nèi)核代碼放到 ftp 站點上,并且非常不喜歡 Freax 這個名 字。他堅持要用現(xiàn)在這個名字(Linux),我承認當(dāng)時我并沒有跟他多爭論。但這都是他取的名字。所以我 可以光明正大地說我并不自負,或者部分坦白地說我并沒有本位主義思想。但我想好吧,這也是個好名 字,而且以后為這事我總能說服別人,就象我現(xiàn)在做的這樣。”
1.1.8 早期 Linux 系統(tǒng)開發(fā)的主要貢獻者
從 Linux 早期源代碼中可以看出,Linux 系統(tǒng)的早期主要開發(fā)人員除了 Linus 本人以外,最著名的人 員之一就是 Theodore Ts'o (Ted Ts'o)。他于 1990 年畢業(yè)于 MIT 計算機科學(xué)專業(yè)。在大學(xué)時代他就積極參 加學(xué)校中舉辦的各種學(xué)生活動。他喜歡烹飪、騎自行車,當(dāng)然還有就是 Hacking on Linux。后來他開始 喜歡起業(yè)余無線電報運動。目前他在 IBM 工作從事系統(tǒng)編程及其它重要事務(wù)。他還是國際網(wǎng)絡(luò)設(shè)計、操 作、銷售和研究者開放團體 IETF 成員。
Linux 在世界范圍內(nèi)的流行也有他很大的功勞。早在 Linux 操作系統(tǒng)剛問世時,他就懷著極大的熱 情為 linux 的發(fā)展提供了 Maillist,幾乎是在 Linux 剛開始發(fā)布時起,他就一直在為 Linux 做出貢獻。他 也是最早向 Linux 內(nèi)核添加程序的人(Linux 內(nèi)核 0.10 版中的虛擬盤驅(qū)動程序 ramdisk.c 和內(nèi)核內(nèi)存分配 程序 kmalloc.c)。直到目前為止他仍然從事著與 Linux 有關(guān)的工作。在北美洲地區(qū)他最早設(shè)立了 Linux 的ftp 站點(tsx-11.mit.edu),而且該站點至今仍然為廣大 Linux 用戶提供服務(wù)。他對 Linux 作出的最大貢獻 之一是提出并實現(xiàn)了 ext2 文件系統(tǒng)。該文件系統(tǒng)現(xiàn)已成為 Linux 世界中事實上的文件系統(tǒng)標(biāo)準(zhǔn)。最近他 又推出了 ext3 文件系統(tǒng)。該系統(tǒng)大大提高了文件系統(tǒng)的穩(wěn)定性和訪問效率。作為對他的推崇,第 97 期(2002 年 5 月)的 Linux Journal 期刊將他作為了封面人物,并對他進行了采訪。目前,他為 IBM Linux 技術(shù)中心工作,并從事著有關(guān) Linux 標(biāo)準(zhǔn)庫 LSB(Linux Standard Base)等方面的工作。
Linux 社區(qū)中另一位著名人物是 Alan Cox。他原工作于英國威爾士斯旺西大學(xué)(Swansea University College)。剛開始他特別喜歡玩電腦游戲,尤其是 MUD(Multi-User Dungeon or Dimension,多用戶網(wǎng)絡(luò) 游戲)。在 90 年代早期 games.mud 新聞組的 posts 中你可以找到他發(fā)表的大量帖子。他甚至為此還寫了 一篇 MUD 的發(fā)展史(rec.games.mud 新聞組,1992 年 3 月 9 日,A history of MUD)。
由于 MUD 游戲與網(wǎng)絡(luò)密切相關(guān),慢慢地他開始對計算機網(wǎng)絡(luò)著迷起來。為了玩游戲并提高電腦運 行游戲的速度以及網(wǎng)絡(luò)傳輸速度,他需要選擇一個最為滿意的操作平臺。于是他開始接觸各種類型的操 作系統(tǒng)。由于沒錢,即使是 MINIX 系統(tǒng)他也買不起。當(dāng) Linux 0.11 和 386BSD 發(fā)布時,他考慮良久總算 購置了一臺 386SX 電腦。由于 386BSD 需要數(shù)學(xué)協(xié)處理器支持,而采用 Intel 386SX CPU 的電腦是不帶 數(shù)學(xué)協(xié)處理器的,所以他安裝了 Linux 系統(tǒng)。于是他開始學(xué)習(xí)帶有免費源代碼的 Linux,并開始對 Linux 系統(tǒng)產(chǎn)生了興趣,尤其是有關(guān)網(wǎng)絡(luò)方面的實現(xiàn)。在關(guān)于 Linux 單用戶運行模式問題的討論中,他甚至贊嘆 Linux 實現(xiàn)得巧妙(beautifully)。
Linux 0.95 版發(fā)布之后,他開始為 Linux 系統(tǒng)編寫補丁程序(修改程序)(記得他最早的兩個補丁程 序,都沒有被 Linus 采納),并成為 Linux 系統(tǒng)上 TCP/IP 網(wǎng)絡(luò)代碼的最早使用人之一。后來他逐漸加入了 Linux 的開發(fā)隊伍,并成為維護 Linux 內(nèi)核源代碼的主要負責(zé)人之一,也可以說成為 Linux 社團中繼 Linus 之后最為重要的人物。以后 Microsoft 公司曾經(jīng)邀請他加盟,但他卻干脆地拒絕了。從 2001 年開始, 他負責(zé)維護 Linux 內(nèi)核 2.4.x 的代碼。而 Linus 主要負責(zé)開發(fā)最新開發(fā)版內(nèi)核的研制(奇數(shù)版,比如 2.5.x版)。
《內(nèi)核黑客手冊》(The Linux Kernel Hackers' Guide)一書的作者 Michael K. Johnson 也是最早接觸 Linux 操作系統(tǒng)的人之一(從 0.97 版)。他還是著名 Linux 文檔計劃(Linux Document Project - LDP)的發(fā) 起者之一。曾經(jīng)在 Linux Journel 工作,現(xiàn)在 RedHat 公司工作。
Linux 系統(tǒng)并不是僅有這些中堅力量就能發(fā)展成今天這個樣子的,還有許多計算機高手對 Linux 做 出了極大的貢獻,這里就不一一列舉了。主要貢獻者的具體名單可參見 Linux 內(nèi)核中的 CREDITS 文件, 其中以字母順序列出了對 Linux 做出較大貢獻的近 400 人的名單列表,包括他們的 email 地址和通信地 址、主頁以及主要貢獻事跡等信息。
通過上述說明,我們可以對上述 Linux 的五大支柱歸納如下:
UNIX 操作系統(tǒng) -- UNIX 于 1969 年誕生在 Bell 實驗室。Linux 就是 UNIX 的一種克隆系統(tǒng)。UNIX的重要性就不用多說了。
MINIX 操作系統(tǒng) -- MINIX 操作系統(tǒng)也是 UNIX 的一種克隆系統(tǒng),它于 1987 年由著名計算機教授 Andrew S. Tanenbaum 開發(fā)完成。由于 MINIX 系統(tǒng)的出現(xiàn)并且提供源代碼(只能免費用于大學(xué)內(nèi))在全世 界的大學(xué)中刮起了學(xué)習(xí) UNIX 系統(tǒng)旋風(fēng)。Linux 剛開始就是參照 MINIX 系統(tǒng)于 1991 年才開始開發(fā)。
GNU 計劃-- 開發(fā) Linux 操作系統(tǒng),以及 Linux 上所用大多數(shù)軟件基本上都出自 GNU 計劃。Linux只是操作系統(tǒng)的一個內(nèi)核,沒有 GNU 軟件環(huán)境(比如說 bash shell),則 Linux 將寸步難行。
POSIX 標(biāo)準(zhǔn) -- 該標(biāo)準(zhǔn)在推動 Linux 操作系統(tǒng)以后朝著正規(guī)路上發(fā)展起著重要的作用。是 Linux 前 進的燈塔。INTERNET -- 如果沒有 Intenet 網(wǎng),沒有遍布全世界的無數(shù)計算機黑客的無私奉獻,那么 Linux 最多 只能發(fā)展到 0.13(0.95)版的水平。
1.2 內(nèi)容綜述
本文將主要對 Linux 的早期內(nèi)核 0.11 版進行詳細描述和注釋。Linux-0.11 版本是在 1991 年 12 月 8 日發(fā)布的。在發(fā)布時包括以下文件:
bootimage.Z - 具有美國鍵盤代碼的壓縮啟動映像文件;
rootimage.Z - 以 1200kB 壓縮的根文件系統(tǒng)映像文件;
linux-0.11.tar.Z - 內(nèi)核源代碼文件。大小為 94KB,展開后也僅有 325KB;
as86.tar.Z - Bruce Evans'二進制執(zhí)行文件。是 16 位的匯編程序和裝入程序;
INSTALL-0.11 - 更新過的安裝信息文件。
目前除了原來的 rootimage.Z 文件,其它四個文件均能找到。不過作者已經(jīng)利用 Internet 上的資源為Linux 0.11 重新制作出了一個完全可以使用的 rootimage-0.11 根文件系統(tǒng)。并重新為其編譯出能在 0.11 環(huán)境下使用的 gcc 1.40 編譯器,配置出可用的實驗開發(fā)環(huán)境。目前,這些文件均可以從 oldlinux.org 網(wǎng)站 上下載。
本文主要詳細分析 linux-0.11 內(nèi)核中的所有源代碼程序,對每個源程序文件都進行了詳細注釋,包 括對 Makefile 文件的注釋。分析過程主要是按照計算機啟動過程進行的。因此分析的連貫性到初始化結(jié) 束內(nèi)核開始調(diào)用 shell 程序為止。其余的各個程序均針對其自身進行分析,沒有連貫性,因此可以根據(jù)自 己的需要進行閱讀。但在分析時還是提供了一些應(yīng)用實例。
所有的程序在分析過程中如果遇到作者認為是較難理解的語句時,將給出相關(guān)知識的詳細介紹。比 如,在閱讀代碼頭一次遇到 C 語言內(nèi)嵌匯編碼時,將對 GNU C 語言的內(nèi)嵌匯編語言進行較為詳細的介 紹;在遇到對中斷控制器進行輸入/輸出操作時,將對 Intel 中斷控制器(8259A)芯片給出詳細的說明, 并列出使用的命令和方法。這樣做有助于加深對代碼的理解,又能更好的了解所用硬件的使用方法,作 者認為這種解讀方法要比單獨列出一章內(nèi)容來總體介紹硬件或其它知識要效率高得多。
拿 Linux 0.11 版內(nèi)核來“開刀”是為了提高我們認識 Linux 運行機理的效率。Linux-0.11 版整個內(nèi)核 源代碼只有 325K 字節(jié)左右,其中包括的內(nèi)容基本上都是 Linux 的精髓。而目前最新的 2.5.XX 版內(nèi)核非 常大,將近有 188 兆字節(jié),即使你花一生的經(jīng)歷來閱讀也未必能全部都看完。也許你要問“既然要從簡 入手,為什么不分析更小的 Linux 0.01 版內(nèi)核源代碼呢?它只有 240K 字節(jié)左右”主要原因是因為 0.01 版的內(nèi)核代碼有太多的不足之處,甚至還沒有包括對軟盤的驅(qū)動程序,也沒有很好地涉及數(shù)學(xué)協(xié)處理器 的使用以及對登陸程序的說明。并且其引導(dǎo)啟動程序的結(jié)構(gòu)也與目前的版本不太一樣,而 0.11 版的引導(dǎo) 啟動程序結(jié)構(gòu)則與現(xiàn)在的基本上是一樣的。另外一個原因是可以找到 0.11 版早期的已經(jīng)編譯制作好的內(nèi) 核映像文件(bootimage),可以用來進行引導(dǎo)演示。如果再配上簡單的根文件系統(tǒng)映像文件(rootimage), 那么它就可以進行正常的運行了。
拿 Linux 0.11 版進行學(xué)習(xí)也有不足之處。比如該內(nèi)核版本中尚不包括有關(guān)專門的進程等待隊列、 TCP/IP 網(wǎng)絡(luò)等方面的一些當(dāng)前非常重要的代碼,對內(nèi)存的分配和使用與現(xiàn)今的內(nèi)核也有所區(qū)別。但好在 Linux 中的網(wǎng)絡(luò)代碼基本上是自成一體的,與內(nèi)核機制關(guān)系不是非常大,因此可以在了解了 Linux 工作 的基本原理之后再去分析這些代碼。
本文對 Linux 內(nèi)核中所有的代碼都進行了說明。為了保持結(jié)構(gòu)的完整性,對代碼的說明是以內(nèi)核中 源代碼的組成結(jié)構(gòu)來進行的,基本上是以每個源代碼中的目錄為一章內(nèi)容進行介紹。介紹的源程序文件 的次序可參見前面的文件列表索引。整個 Linux 內(nèi)核源代碼的目錄結(jié)構(gòu)如下列表 1.1 所示。所有目錄結(jié) 構(gòu)均是以 linux 為當(dāng)前目錄。
列表 1-1 Linux/目錄

本書內(nèi)容可以分為三個部分。第 1 章至第 4 章是描述內(nèi)核引導(dǎo)啟動和 32 位運行方式的準(zhǔn)備階段,作為學(xué)習(xí)內(nèi)核的初學(xué)者應(yīng)該全部進行閱讀。第二部分從第 5 章到第 10 章是內(nèi)核代碼的主要部分。其中第 5 章內(nèi)容可以作為閱讀本部分后續(xù)章節(jié)的索引來進行。第 11 章到第 13 章是第三部分內(nèi)容,可以作為閱讀 第二部分代碼的參考信息。
第 2 章概要地描述了 Linux 操作系統(tǒng)的體系結(jié)構(gòu)、內(nèi)核源代碼文件放置的組織結(jié)構(gòu)以及每個文件大 致功能。還介紹了 Linux 對物理內(nèi)存的使用分配方式、內(nèi)核的幾種堆棧及其使用方式和虛擬線性地址的 使用分配。最后開始注釋內(nèi)核程序包中 Linux/目錄下的所看到的第一個文件,也即內(nèi)核代碼的總體 Makefile 文件的內(nèi)容。該文件是所有內(nèi)核源程序的編譯管理配置文件,供編譯管理工具軟件 make 使用。
第 3 章將詳細注釋 boot/目錄下的三個匯編程序,其中包括磁盤引導(dǎo)程序 bootsect.s、獲取 BIOS 中參 數(shù)的 setup.s 匯編程序和 32 位運行啟動代碼程序 head.s。這三個匯編程序完成了把內(nèi)核從塊設(shè)備上引導(dǎo) 加載到內(nèi)存的工作,并對系統(tǒng)配置參數(shù)進行探測,完成了進入 32 位保護模式運行之前的所有工作。為內(nèi) 核系統(tǒng)執(zhí)行進一步的初始化工作做好了準(zhǔn)備。
第 4 章主要介紹 init/目錄中內(nèi)核系統(tǒng)的初始化程序 main.c。它是內(nèi)核完成所有初始化工作并進入正 常運行的關(guān)鍵地方。在完成了系統(tǒng)所有的初始化工作后,創(chuàng)建了用于 shell 的進程。在介紹該程序時將需 要查看其所調(diào)用的其它程序,因此對后續(xù)章節(jié)的閱讀可以按照這里調(diào)用的順序進行。由于內(nèi)存管理程序 的函數(shù)在內(nèi)核中被廣泛使用,因此該章內(nèi)容應(yīng)該最先選讀。當(dāng)你能真正看懂直到 main.c 程序為止的所有 程序時,你應(yīng)該已經(jīng)對 Linux 內(nèi)核有了一定的了解,可以說已經(jīng)有一半入門了?,但你還需要對文件系 統(tǒng)、系統(tǒng)調(diào)用、各種驅(qū)動程序等進行更深一步的閱讀。
第 5 章主要介紹 kenel/目錄中的所有程序。其中最重要的部分是進程調(diào)度函數(shù) schedule()、sleep_on()函數(shù)和有關(guān)系統(tǒng)調(diào)用的程序。此時你應(yīng)該已經(jīng)對其中的一些重要程序有所了解。
第 6 章對 kernel/dev_blk/目錄中的塊設(shè)備程序進行了注釋說明。該章主要含有硬盤、軟盤等塊設(shè)備 的驅(qū)動程序,主要用來與文件系統(tǒng)和高速緩沖區(qū)打交道,含有較多與硬件相關(guān)的內(nèi)容。因此,在閱讀這 章內(nèi)容時需參考一些硬件資料。最好能首先瀏覽一下文件系統(tǒng)的章節(jié)。
第 7 章對 kernel/dev_chr/目錄中的字符設(shè)備驅(qū)動程序進行注釋說明。這一章中主要涉及串行線路驅(qū) 動程序、鍵盤驅(qū)動程序和顯示器驅(qū)動程序。這些驅(qū)動程序構(gòu)成了 0.11 內(nèi)核支持的串行終端和控制臺終端 設(shè)備。因此本章也含有較多與硬件有關(guān)的內(nèi)容。在閱讀時需要參考一下相關(guān)硬件的書籍。
第 8 章介紹 kernel/math/目錄中的數(shù)學(xué)協(xié)處理器的仿真程序。由于本書所注釋的內(nèi)核版本,還沒有真 正開始支持協(xié)處理器,因此本章的內(nèi)容較少,也比較簡單。只需有一般性的了解即可。
第 9 章介紹內(nèi)核源代碼 fs/目錄中的文件系統(tǒng)程序,在看這章內(nèi)容時建議你能夠暫停一下而去閱讀 Andrew S. Tanenbaum 的《操作系統(tǒng)設(shè)計與實現(xiàn)》一書中有關(guān) MINIX 文件系統(tǒng)的章節(jié),因為最初的 Linux 系統(tǒng)是只支持 MINIX 一種文件系統(tǒng),Linux 0.11 版也不例外。
第 10 章解說 mm/目錄中的內(nèi)存管理程序。要透徹地理解這方面的內(nèi)容,需要對 Intel 80X86 微處理器的保護模式運行方式有足夠的理解,因此本章在適當(dāng)的地方包含有較為完整的有關(guān) 80X86 保護模式運行方式的說明,這些知識基本上都可以參考 Intel 80386 程序員編程手冊(Intel 80386 Programmer's Reference Manual)。但在此章中,以源代碼中的運用實例為對象進行解說,應(yīng)該可以更好地理解它的工 作原理。
現(xiàn)有的 Linux 內(nèi)核分析書籍都缺乏對內(nèi)核頭文件的描述,因此對于一個初學(xué)者來講,在閱讀內(nèi)核程 序時會碰到許多障礙。本書的第 11 章對 include/目錄中的所有頭文件進行了詳細說明,基本上對每一個 定義、每一個常量或數(shù)據(jù)結(jié)構(gòu)都進行了詳細注釋。為了便于在閱讀時參考查閱,本書在附錄中還對一些 經(jīng)常要用到的重要的數(shù)據(jù)結(jié)構(gòu)和變量進行了歸納注釋,但這些內(nèi)容實際上都能在這一章中找到。雖然該 章內(nèi)容主要是為閱讀其它章節(jié)中的程序作參考使用的,但是若想徹底理解內(nèi)核的運行機制,仍然需要了 解這些頭文件中的許多細節(jié)。
第 12 章介紹了 Linux 0.11 版內(nèi)核源代碼 lib/目錄中的所有文件。這些庫函數(shù)文件主要向編譯系統(tǒng)等 系統(tǒng)程序提供了接口函數(shù),對以后理解系統(tǒng)軟件會有較大的幫助。由于這個版本較低,所以這里的內(nèi)容 并不是很多,可以很快地看完。這也是我們為什么選擇 0.11 版的原因之一。
第 13 章介紹 tools/目錄下的 build.c 程序。這個程序并不會包括在編譯生成的內(nèi)核映像(image)文件中, 它僅用于將內(nèi)核中的磁盤引導(dǎo)程序塊與其它主要內(nèi)核模塊連接成一個完整的內(nèi)核映像(kernel image)文件。
第 14 章介紹了學(xué)習(xí)內(nèi)核源代碼時的實驗環(huán)境以及實驗方法。主要介紹了在 Bochs 仿真系統(tǒng)下使用和 編譯 Linux 內(nèi)核的方法以及磁盤鏡象文件的制作方法。還說明了如何修改 Linux 0.11 源代碼的語法使其 能在 RedHat 9 系統(tǒng)下順利編譯出正確的內(nèi)核來。
最后是附錄和索引。附錄中給出了 Linux 內(nèi)核中的一些常數(shù)定義和基本數(shù)據(jù)結(jié)構(gòu)定義,以及保護模 式運行機制的簡明描述。
為了便于查閱,在本書的附錄中還單獨列出了內(nèi)核中要用到的有關(guān) PC 機硬件方面的信息。在參考 文獻中,我們僅給出了在閱讀源代碼時可以參考的書籍、文章等信息,并沒有包羅萬象地給出一大堆的 繁雜凌亂的文獻列表。比如在引用 Linux 文檔項目 LDP(Linux Document Project)中的文件時,我們會 明確地列出具體需要參考哪一篇 HOWTO 文章,而并不是僅僅給出 LDP 的網(wǎng)站地址了事。
Linus 在最初開發(fā) Linux 操作系統(tǒng)內(nèi)核時,主要參考了 3 本書。一本是 M. J. Bach 著的《UNIX 操作 系統(tǒng)設(shè)計》,該書描述了 UNIX System V 內(nèi)核的工作原理和數(shù)據(jù)結(jié)構(gòu)。Linus 使用了該書中很多函數(shù)的算 法,Linux 內(nèi)核源代碼中很多重要函數(shù)的名稱都取自該書。因此,在閱讀本書時,這是一本必不可少的 內(nèi)核工作原理方面的參考書籍。另一本是 John H. Crawford 等編著的《Programming the 80386》,是講解80x86 下保護模式編程方法的好書。還有一本就是 Andrew S.Tanenbaum 著的《MINIX 操作系統(tǒng)設(shè)計與實 現(xiàn)》一書的第 1 版。Linus 主要使用了該書中描述的 MINIX 文件系統(tǒng) 1.0 版,而且在早期的 Linux 內(nèi)核 中也僅支持該文件系統(tǒng),所以在閱讀本書有關(guān)文件系統(tǒng)一章內(nèi)容時,文件系統(tǒng)的工作原理方面的知識完 全可以從 Tanenbaum 的書中獲得。
在對每個程序進行解說時,我們首先簡單說明程序的主要用途和目的、輸入輸出參數(shù)以及與其它程 序的關(guān)系,然后列出程序的完整代碼并在其中對代碼進行詳細注釋,注釋時對原程序代碼或文字不作任 何方面的改動或刪除,因為 C 語言是一種英語類語言,程序中原有的少量英文注釋對常數(shù)符號、變量名 等也提供了不少有用的信息。在代碼之后是對程序更為深入的解剖,并對代碼中出現(xiàn)的一些語言或硬件 方面的相關(guān)知識進行說明。如果在看完這些信息后回頭再瀏覽一遍程序,你會有更深一層的體會。
對于閱讀本書所需要的一些基本概念知識的介紹都散布在各個章節(jié)相應(yīng)的地方,這樣做主要是為了 能夠方便的找到,而且在結(jié)合源代碼閱讀時,對一些基本概念能有更深的理解。
最后要說明的是當(dāng)你已經(jīng)完全理解了本文所解說的一切時,并不代表你已經(jīng)成為一個 Linux 行家了,你只是剛剛踏上 Linux 的征途,具有了一定的成為一個 Linux GURU 的初步知識。這時你應(yīng)該去閱讀更多的源代碼,最好是循序漸進地從 1.0 版本開始直到最新的正在開發(fā)中的奇數(shù)編號的版本。在撰寫這本 書時最新的 Linux 內(nèi)核是 2.5.44 版。當(dāng)你能快速理解這些開發(fā)中的最新版本甚至能提出自己的建議和補 丁(patch)程序時,我也甘拜下風(fēng)了?。
1.3 本章小結(jié)
首先闡述了 Linux 誕生和發(fā)展不可缺少的五個支柱:UNIX 最初的開放原代碼版本為 Linux 提供了 實現(xiàn)的基本原理和算法、Rechard Stallman 的 GNU 計劃為 Linux 系統(tǒng)提供了豐富且免費的各種實用工具、 POSIX 標(biāo)準(zhǔn)的出現(xiàn)為 Linux 提供了實現(xiàn)與標(biāo)準(zhǔn)兼容系統(tǒng)的參考指南、A.S.T 的 MINIX 操作系統(tǒng)為 Linux 的誕生起到了不可忽缺的參考、Internet 是 Linux 成長和壯大的必要環(huán)境。最后本章概述了書中的基本內(nèi)容。