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

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