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

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