本書對(duì) Linux 作系統(tǒng)早期內(nèi)核(V0.12)全部源代碼文件進(jìn)行了詳 細(xì)、全面的注釋和說明,旨在幫助讀者用較短的時(shí)間對(duì) Linux 的工作機(jī)理 獲得全面而深刻的理解,為進(jìn)一步學(xué)習(xí)和研究現(xiàn)代 Linux 系統(tǒng)打下堅(jiān)實(shí)的 基礎(chǔ)。雖然分析的版本較低,但該內(nèi)核已能夠正常編譯運(yùn)行,并且其中已 包括了 Linux 工作原理的精髓。書中首先概要地介紹了 Linux 內(nèi)核發(fā)展歷 史,說明了各內(nèi)核版本之間的主要區(qū)別和改進(jìn),給出了選擇 0.12 版內(nèi)核源 代碼作為研究對(duì)象的原因。然后給出了閱讀內(nèi)核源代碼所需的相關(guān)基礎(chǔ)知 識(shí),概要介紹了運(yùn)行 Linux 系統(tǒng)的 PC 硬件組成結(jié)構(gòu)、編寫內(nèi)核使用的匯編 語言和 C 語言擴(kuò)展部分,并且重點(diǎn)說明了 80x86 處理器在保護(hù)模式下運(yùn)行 的編程方法。接著介紹了內(nèi)核代碼概況,給出了內(nèi)核源代碼目錄樹結(jié)構(gòu), 并依據(jù)該組織結(jié)構(gòu)對(duì)所有內(nèi)核程序和文件進(jìn)行了詳細(xì)描述和說明。為了加 深讀者對(duì)內(nèi)核工作原理的理解,書中最后一章給出了多個(gè)相關(guān)運(yùn)行調(diào)試實(shí) 驗(yàn)。書中所有相關(guān)資料和信息均可從網(wǎng)站 www.oldlinux.org 下載。 本書適合作為高校計(jì)算機(jī)專業(yè)學(xué)生學(xué)習(xí)作系統(tǒng)課程的輔助和實(shí)踐教 材,也適合 Linux 愛好者作為學(xué)習(xí)內(nèi)核工作原理的自學(xué)參考書籍,還可作 為一般技術(shù)人員開發(fā)嵌入式系統(tǒng)時(shí)的參考書。
本書是一本有關(guān) Linux cao作系統(tǒng)內(nèi)核基本工作原理的入門讀物。 本書的主要目標(biāo) 本書的主要目標(biāo)是用盡量少的篇幅,對(duì)完整的 Linux 內(nèi)核源代碼進(jìn)行解剖,使讀者對(duì)cao作 系統(tǒng)的基本功能和實(shí)際實(shí)現(xiàn)方式獲得全方位的理解。 本書讀者應(yīng)是知曉 Linux 系統(tǒng)的一般使用方法或具有一定的編程基礎(chǔ),但比較缺乏閱讀目 前最新內(nèi)核源代碼的基礎(chǔ)知識(shí),又急切希望能夠進(jìn)一步理解 UNIX 類cao作系統(tǒng)內(nèi)核工作原理和 實(shí)際代碼實(shí)現(xiàn)的愛好者。這部分讀者的水平應(yīng)該介于初級(jí)與中級(jí)水平之間。目前,這部分讀者 人數(shù)在 Linux 愛好者中所占的比例是很高的,而面向這部分讀者以比較易懂和有效的手段講解 內(nèi)核的書籍資料不多。 現(xiàn)有書籍不足之處 目前已有的描述 Linux 內(nèi)核的書籍,均盡量選用較新 Linux 內(nèi)核版本(例如 Fedora 8 使用 的 2.6.24 穩(wěn)定版等)進(jìn)行描述,但由于目前 Linux 內(nèi)核整個(gè)源代碼的大小已經(jīng)非常大(例如 2.2.20 版就已具有 268 萬行代碼。,因此這些書籍僅能對(duì) Linux 內(nèi)核源代碼進(jìn)行選擇性或原理性的說 明,許多系統(tǒng)實(shí)現(xiàn)細(xì)節(jié)被忽略。因此并不能使讀者對(duì)實(shí)際 Linux 內(nèi)核產(chǎn)生清晰而完整的理解。 Scott Maxwell 的《Linux 內(nèi)核源代碼分析》基本上是面對(duì) Linux 中、高級(jí)水平的讀者,需 要較為全面的基礎(chǔ)知識(shí)才能完全理解。而且可能是由于篇幅所限,該書并沒有對(duì)所有 Linux 內(nèi) 核代碼進(jìn)行注釋,略去了很多內(nèi)核實(shí)現(xiàn)細(xì)節(jié),例如內(nèi)核中使用的各個(gè)頭文件(*.h)、生成內(nèi)核 代碼映像文件的工具程序、各個(gè) make 文件的作用和實(shí)現(xiàn)等均沒有涉及。因此對(duì)于處于初、中 級(jí)水平之間的讀者來說閱讀該書有些困難。 John Lions 的《萊昂氏 UNIX 源代碼分析》雖然是一本優(yōu)秀的學(xué)習(xí) UNIX 類cao作系統(tǒng)內(nèi)核源代 碼的著作,但是由于其采用的是 UNIX V6 版,其中系統(tǒng)調(diào)用等部分代碼是用早已廢棄的 PDP-11 系列機(jī)的匯編語言編制的,因此在閱讀和理解與硬件部分相關(guān)的源代碼時(shí)就會(huì)遇到較大的困難。 A. S. Tanenaum 的《cao作系統(tǒng):設(shè)計(jì)與實(shí)現(xiàn)》是有關(guān)cao作系統(tǒng)內(nèi)核實(shí)現(xiàn)的優(yōu)秀書籍,但該 書所敘述的 MINIX 系統(tǒng)是一種基于消息傳遞的內(nèi)核實(shí)現(xiàn)機(jī)制,與 Linux 內(nèi)核的實(shí)現(xiàn)有所區(qū)別。 因此在學(xué)習(xí)該書之后,并不能很順利地即刻著手進(jìn)一步學(xué)習(xí)較新的 Linux 內(nèi)核源代碼實(shí)現(xiàn)。 在使用這些書籍進(jìn)行學(xué)習(xí)時(shí)會(huì)有一種盲人摸象的感覺,不容易真正理解 Linux 內(nèi)核系 統(tǒng)具體實(shí)現(xiàn)的整體概念,尤其是對(duì)那些 Linux 系統(tǒng)初學(xué)者,或剛學(xué)會(huì)如何使用 Linux 系統(tǒng)的人 在使用那些書學(xué)習(xí)內(nèi)核原理時(shí),內(nèi)核的整體運(yùn)作結(jié)構(gòu)并不能清晰地在腦海中形成。這在本人多 年的 Linux 內(nèi)核學(xué)習(xí)過程中也深有體會(huì)。在 1991 年 10 月,Linux 的創(chuàng)始人 Linus Torvalds 在開 發(fā)出 Linux 0.03 版后寫的一篇文章中也提到了同樣的問題。在這篇題為《Linux--a Free unix-386 Kernel》 一 的文章中,他說:開發(fā) Linux 是為了那些cao作系統(tǒng)愛好者和計(jì)算機(jī)科學(xué)系的學(xué)生使 用、學(xué)習(xí)和娛樂。自由軟件基金會(huì)的 GNU Hurd 系統(tǒng)如果開發(fā)出來就已經(jīng)顯得太龐大而不適 合學(xué)習(xí)和理解。而現(xiàn)今流行的 Linux 系統(tǒng)要比當(dāng)年 GNU 的 Hurd 系統(tǒng)更為龐大和復(fù)雜,因此 同樣也已經(jīng)不適合作為cao作系統(tǒng)初學(xué)者的入門學(xué)習(xí)起點(diǎn)。這也是作者基于 Linux 早期內(nèi)核版本 寫作本書的動(dòng)機(jī)之一。 閱讀早期內(nèi)核的其他好處 目前,已經(jīng)出現(xiàn)不少基于 Linux 早期內(nèi)核而開發(fā)的專門用于嵌入式系統(tǒng)的內(nèi)核版本,如 DJJ 的 x86 cao作系統(tǒng)、?CLinux 等(在 www.linux.org 上有專門目錄),也有許多人認(rèn)識(shí)到通過早期 Linux 內(nèi)核源代碼學(xué)習(xí)的好處,目前國內(nèi)也已經(jīng)有人正在組織人力注釋出版類似本書的書籍。 大家認(rèn)為,通過閱讀 Linux 早期內(nèi)核版本的源代碼,的確是學(xué)習(xí) Linux 系統(tǒng)的一種行之有效的 途徑,并且對(duì)研究和應(yīng)用 Linux 嵌入式系統(tǒng)也有很大的幫助。 在對(duì)早期內(nèi)核源代碼的注釋過程中,作者發(fā)現(xiàn),早期內(nèi)核源代碼幾乎就是目前所使用的較新內(nèi) 核的一個(gè)精簡(jiǎn)版本。其中已經(jīng)包括了目前新版本中幾乎所有的基本功能原理的內(nèi)容。正如《系統(tǒng)軟 件:系統(tǒng)編程導(dǎo)論》一書的作者Leland L. eck 在介紹系統(tǒng)程序以及cao作系統(tǒng)設(shè)計(jì)時(shí),引入了一種 極其簡(jiǎn)化的簡(jiǎn)單指令計(jì)算機(jī)(SIC)系統(tǒng)來說明所有系統(tǒng)程序的設(shè)計(jì)和實(shí)現(xiàn)原理,從而既避免了實(shí) 際計(jì)算機(jī)系統(tǒng)的復(fù)雜性,又能透徹地說明問題。這里選擇 Linux 的早期內(nèi)核版本作為學(xué)習(xí)對(duì)象,其 指導(dǎo)思想與 Leland 是一致的。這對(duì) Linux 內(nèi)核學(xué)習(xí)的入門者來說,是最理想的選擇之一。 對(duì)于那些已經(jīng)比較熟悉內(nèi)核工作原理的人,為了能讓自己在實(shí)際工作中對(duì)系統(tǒng)的實(shí)際運(yùn)轉(zhuǎn) 機(jī)制不產(chǎn)生一種空中樓閣的感覺,因此也有必要閱讀內(nèi)核源代碼。 當(dāng)然,使用早期內(nèi)核作為學(xué)習(xí)的對(duì)象也有不足之處。所選用的 Linux 早期內(nèi)核版本不支持 虛擬文件系統(tǒng)(VFS)和網(wǎng)絡(luò)系統(tǒng),也不包含對(duì)現(xiàn)有內(nèi)核中復(fù)雜子系統(tǒng)的說明,而僅支持 a.out 執(zhí)行文件。但本書是 Linux 內(nèi)核工作機(jī)理實(shí)現(xiàn)的入門教材,因此這也正是選擇早期內(nèi)核版本的 優(yōu)點(diǎn)之一。通過學(xué)習(xí)本書,可以為進(jìn)一步學(xué)習(xí)這些高級(jí)內(nèi)容打下堅(jiān)實(shí)的基礎(chǔ)。 閱讀完整源代碼的重要性和必要性 正如 Linux 系統(tǒng)的創(chuàng)始人在一篇新聞組投稿上所說的,要理解一個(gè)軟件系統(tǒng)的真正運(yùn)行機(jī)制, 一定要閱讀其源代碼。系統(tǒng)本身是一個(gè)完整的整體,具有很多看似不重要的細(xì)節(jié),但是若忽略這些 細(xì)節(jié),就會(huì)對(duì)整個(gè)系統(tǒng)的理解帶來困難,并且不能真正了解一個(gè)實(shí)際系統(tǒng)的實(shí)現(xiàn)方法和手段。 雖然閱讀一些cao作系統(tǒng)原理經(jīng)典書籍如 M. J. ach 的《UNIX cao作系統(tǒng)設(shè)計(jì)》,能夠?qū)?UNIX 類cao作系統(tǒng)的工作原理有一些了解,但實(shí)際上對(duì)cao作系統(tǒng)的真正組成和內(nèi)部關(guān)系實(shí)現(xiàn)的理解仍 不是很清晰。正如 Tanenaum 所說的,許多cao作系統(tǒng)教材都是重理論而輕實(shí)踐,多數(shù)書籍 和課程為調(diào)度算法耗費(fèi)大量的時(shí)間和篇幅而完全忽略 I/O。其實(shí),前者通常不足一頁代碼,而 后者往往要占到整個(gè)系統(tǒng)三分之一的代碼總量。內(nèi)核中大量的重要細(xì)節(jié)均未提到。因此并不能 讓讀者理解一個(gè)真正的cao作系統(tǒng)實(shí)現(xiàn)的奧妙所在。只有在詳細(xì)閱讀過完整的內(nèi)核源代碼之后, 才會(huì)對(duì)系統(tǒng)有一種豁然開朗的感覺,對(duì)整個(gè)系統(tǒng)的運(yùn)作過程有深刻的理解。以后再選擇最新的 或較新內(nèi)核源代碼進(jìn)行學(xué)習(xí)時(shí),也不會(huì)遇到大問題,基本上都能順利地理解新代碼的內(nèi)容。 如何選擇要閱讀的內(nèi)核代碼版本 那么,如何選擇既能達(dá)到上述要求,又不被太多的內(nèi)容而搞亂頭腦,學(xué)習(xí)效率又高的內(nèi)核?作 者通過對(duì)大量?jī)?nèi)核版本進(jìn)行比較和選擇后,最終選擇了與目前 Linux 內(nèi)核基本功能較為相近,又非 常短小的 0.12 版內(nèi)核作為入門學(xué)習(xí)的最佳版本。下圖是對(duì)一些主要 Linux 內(nèi)核版本行數(shù)的統(tǒng)計(jì)。 目前的 Linux 內(nèi)核源代碼量都在幾百萬行的數(shù)量上,2.6.0 版內(nèi)核代碼行數(shù)約為 592 萬行, 極其龐大,對(duì)這些版本進(jìn)行完全注釋和說明幾乎是不可能的。而 0.12 版內(nèi)核不超過 2 萬行代 碼量,因此完全可以在一本書中解釋和注釋清楚。麻雀雖小,五臟俱全。為了對(duì)所研究的系 統(tǒng)有感性的了解,并能利用實(shí)驗(yàn)來加深對(duì)原理的理解,作者還專門重建了基于該內(nèi)核的可運(yùn) 行的 Linux 0.12 系統(tǒng)。由于其中含有 GNU gcc 編譯環(huán)境,因此使用該系統(tǒng)也能做一些簡(jiǎn)單的 開發(fā)工作。 另外,使用該版本可以避免涉及較新內(nèi)核版本中已經(jīng)變得越來越復(fù)雜的各子系統(tǒng)(如 VFS、 ext2 或 ext3 文件系統(tǒng)、網(wǎng)絡(luò)子系統(tǒng)、新的復(fù)雜的內(nèi)存管理機(jī)制等)。 閱讀本書需具備的基礎(chǔ)知識(shí) 在閱讀本書時(shí),讀者必須具備一些基本的 C 語言知識(shí)和 Intel CPU 匯編語言知識(shí)。有關(guān) C 語言最佳的參考資料仍然是 rian W. Kernighan 和 Dennis M. Ritchie 編寫的 The C Programming Language 一書。而匯編語言的資料則可以參考任意一本講解與 Intel CPU 相關(guān)的匯編語言教材。 另外,還需要一些嵌入式匯編語言的資料。有關(guān)嵌入式匯編的權(quán)威信息都包含在 GNU gcc 編譯 器手冊(cè)中。也可以從 Internet 上搜索到一些有關(guān)嵌入式匯編的比較有價(jià)值的短文。本書中也包 含了一些關(guān)于嵌入式匯編的基本語法說明。 除此之外,還希望讀者具備以下一些基礎(chǔ)知識(shí)或者有相關(guān)的參考書籍在身邊。其一是有關(guān) 80x86 處理器結(jié)構(gòu)和編程的知識(shí)或資料。例如,可以從網(wǎng)上下載的 80x86 編程手冊(cè)(80386 Programmers Reference Manual);其二是有關(guān) 80x86 硬件體系結(jié)構(gòu)和接口編程的知識(shí)或資料(有 關(guān)這方面的資料很多);其三還應(yīng)具備使用 Linux 系統(tǒng)的簡(jiǎn)單技能。 另外,由于 Linux 系統(tǒng)內(nèi)核的實(shí)現(xiàn)最早是根據(jù) M. J. ach 的《UNIX cao作系統(tǒng)設(shè)計(jì)》一書的 基本原理開發(fā)的,源代碼中許多變量或函數(shù)的名稱都來自該書,因此在閱讀本書時(shí)若能適當(dāng)參 考該書,會(huì)更易于理解內(nèi)核源代碼。 Linus 在最初開發(fā) Linux cao作系統(tǒng)時(shí),參照了 MINIX cao作系統(tǒng)。例如,最初的 Linux 內(nèi)核 版本完全照搬了 MINIX 1.0 文件系統(tǒng)。因此,在閱讀本書時(shí),Tanenaum 的《cao作系統(tǒng):設(shè)計(jì) 與實(shí)現(xiàn)》也具有較大的參考價(jià)值。但 Tanenaum 的書描述的是一種基于消息傳遞在內(nèi)核各模塊 之間進(jìn)行通信(信息交換)的工作機(jī)制,這與 Linux 內(nèi)核不一樣,因此可以僅參考其中有關(guān)一 般cao作系統(tǒng)工作原理章節(jié)和文件系統(tǒng)實(shí)現(xiàn)的內(nèi)容。 使用早期版本是否過時(shí) 表面看來,本書對(duì) Linux 早期內(nèi)核版本注釋的內(nèi)容猶如 Linux 剛公布時(shí) Tanenaum 就認(rèn)為 其已經(jīng)過時(shí)(Linux is osolete)的想法一樣,但通過學(xué)習(xí)本書內(nèi)容,你就會(huì)發(fā)現(xiàn),利用本書學(xué) 習(xí) Linux 內(nèi)核,由于內(nèi)核源代碼量短小而精干,因此會(huì)有極高的學(xué)習(xí)效率,能夠做到事半功倍, 快速入門。并且對(duì)進(jìn)一步選擇新內(nèi)核部分源代碼的學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。在學(xué)習(xí)完本書之后, 你將對(duì)系統(tǒng)的運(yùn)作原理有一個(gè)非常完整而實(shí)際的概念。這種完整概念能使人很容易地進(jìn)一步選 擇和學(xué)習(xí)新內(nèi)核源代碼中的任何部分,而不需要再去啃讀代碼量巨大的新內(nèi)核中完整的源代碼。 Ext2 文件系統(tǒng)與 MINIX 文件系統(tǒng) 目前,Linux 系統(tǒng)上所使用的 Ext2(或最新的 Ext3)文件系統(tǒng)是在內(nèi)核 1.x 之后開發(fā)的。 其功能詳盡并且性能也非常穩(wěn)定,是目前 Linux cao作系統(tǒng)上默認(rèn)的標(biāo)準(zhǔn)文件系統(tǒng)。但是,作為 對(duì) Linux cao作系統(tǒng)完整工作原理入門學(xué)習(xí)所使用的部分,原則上是越精簡(jiǎn)越好。為了對(duì)一個(gè)cao 作系統(tǒng)有完整的理解,并且不受其中各子系統(tǒng)中復(fù)雜和過多的細(xì)節(jié)的干擾,在選擇學(xué)習(xí)剖析用 的內(nèi)核版本時(shí),只要系統(tǒng)的部分代碼內(nèi)容能說明實(shí)際工作原理,就越簡(jiǎn)單越好。 Linux 內(nèi)核 0.12 版僅包含最為簡(jiǎn)單的 MINIX 1.0 文件系統(tǒng),對(duì)于理解一個(gè)cao作系統(tǒng)中文件系 統(tǒng)的實(shí)際組成和工作原理已經(jīng)足夠。這也是選擇 Linux 早期內(nèi)核版本進(jìn)行學(xué)習(xí)的主要原因之一。 在完整閱讀本書之后,相信讀者定會(huì)發(fā)出這樣的感嘆:對(duì)于 Linux 內(nèi)核系統(tǒng),我現(xiàn)在終 于入門了!此時(shí),您應(yīng)該有十分的把握去進(jìn)一步學(xué)習(xí)最新 Linux 內(nèi)核中各部分的工作原理和 過程了。 同濟(jì)大學(xué) 趙炯 博士