內容簡介
為了徹底理解是什麼使得Linux能正常運行以及其為何能在各種不同的系統中運行良好,你需要深入研究核心最本質的部分。核心處理CPU與外界間的所有互動,並且決定哪些程式將以什麼順序共享處理器時間。它如此有效地管理有限的記憶體,以至成百上千的進程能高效地共享系統。它熟練地統籌數據傳輸,這樣CPU 不用為等待速度相對較慢的硬碟而消耗比正常耗時更長的時間。
《深入理解Linux核心,第三版》指導你對核心中使用的最重要的數據結構、算法和程式設計訣竅進行一次遍歷。通過對表面特性的探究,作者給那些想知道自己機器工作原理的人提供了頗有價值的見解。書中討論了Intel特有的重要性質。相關的代碼片段被逐行剖析。然而,本書涵蓋的不僅僅是代碼的功能,它解釋了Linux以自己的方式工作的理論基礎。
本書新版涵蓋2.6版本,其在核心的幾乎每個子系統中都有重要的變化,尤其是在記憶體管理和塊設備領域。本書側重於以下主題:
●記憶體管理,包括檔案快取、進程交換和直接記憶體存取(DMA)
●虛擬檔案系統層和第二、第三擴展檔案系統
●進程創建和調度
●信號、中斷和設備驅動程式的主要接口
●定時
●核心中的同步
●進程間通信(IPC)
●程式的執行
《深入理解Linux核心》將使你了解Linux的所有內部工作,它不僅僅是一個理論上的練習。你將學習到哪些情況下Linux性能最佳,並且你將看到,在大量的不同環境裡進行進程調度、檔案存取和記憶體管理時它如何滿足提供良好的系統回響的需要。這本書將幫助你充分利用Linux系統。
作者簡介
博韋,計算機科學專業博士,義大利羅馬大學Tor vergata分校全職教授。
切薩蒂 數學和計算機科學博士,羅馬大學Tor vergata分校工程學院計算機科學系助理研究員。
圖書目錄
前言
第一章 緒論
第二章 記憶體定址
第三章 進程
第四章 中斷和異常
第五章 核心同步
第六章 定時測量
第七章 進程調度
第八章 記憶體管理
第九章 進程地址空間
第十章 系統調用
第十一章 信號
第十二章 虛擬檔案系統
第十三章 i/o體系結構和設備驅動程式
第十四章 塊設備驅動程式
第十五章 頁調高速快取
第十六章 訪問檔案
第十七章 回收頁框
第十八章 ext2和ext3檔案系統
第十九章 進程通信
.第二十章 程式的執行
附錄一 系統啟動
附錄二 模組
參考文獻
原始碼索引
前言
在1997 年春季的那一學期,我們講授了基於Linux 2.0 作業系統這門課程。其主導思想是鼓勵學生閱讀原始碼。為了達到這一目的,我們按小組分配項目,這些項目對核心進行修改並對所修改的版本進行測試。對於諸如任務切換和任務調度這樣一些Linux 的主要特點,我們也為學生寫下了課程筆記。.
除了這些工作,還有來自O'Reilly 編輯Andy Oram 的很多支持,這就促成了《深入理解Linux 核心》這本書的第一版,那時是2000 年底,該版涵蓋了Linux 2.2 以及對Linux 2.4 的一些展望。這本書的成功鼓勵我們繼續沿這一思路走下去,在2002 年底,我們完成了涵蓋Linux 2.4 的第二版。現在你看到的第三版則涵蓋了Linux 2.6。
與以往所經歷的一樣,我們這次又閱讀了數千行的代碼,並努力搞清其含義。在做了所有這些工作以後,可以說我們的努力是完全值得的。我們學到很多你無法從書本中找到的東西,因此我們希望自己已經成功地在後面的內容中涵蓋了這些信息。
本書的讀者對象
如果你對Linux 如何工作、其性能又為什麼會如此之高懷有強烈的好奇心,你將會從這裡找到答案。閱讀本書之後,你會通過上千行代碼找到自己的方式來區別重要數據結構和次要數據結構的不同,簡而言之,你將成為一名真正的Linux 高手。
可以把我們的工作看作是暢遊Linux 核心的嚮導:我們討論了在核心中使用的很多重要的數據結構、算法和編程技巧。在很多例子中,我們逐行討論了有關代碼片段。當然,你手頭應當備有Linux 原始碼,你還應當樂於花一些功夫去解讀那些為簡潔起見而未完整描述的函式。
另一方面,如果你想更多地了解現代作業系統中的主要設計問題,那么本書將提供頗有價值的見解。本書不是專門針對系統管理員或編程人員的,而是主要針對那些想探究機器內部到底是如何工作的人們的!與任何好嚮導一樣,我們試圖透過現象看其本質。我們還提供了背景材料,例如主要特點的歷史及使用它們的理由。
材料的組織
開始寫這本書時,我們面臨重大的抉擇:是應該涉及特定的硬體平台,還是跳過與硬體相關的細節而集中於純粹與硬體無關的核心部分?
有關Linux核心內幕的其他書選擇後一種方式;因為下述理由,我們決定採用前一種方式:
高效率的核心充分利用硬體可利用的特點,諸如定址技術、高速快取(cache)、處理器異常(exception)、專用指令、處理器控制暫存器等等。如果我們想使你相信,核心在執行一個特殊的任務時確實工作得相當好,那我們必須首先告訴你核心工作在一個什麼樣的硬體平台上。
即使Unix 核心大部分原始碼是獨立於處理器的,並且用C 語言編寫,但也有少數重要的部分是用彙編語言編寫的。因此,為了充分理解核心,就需要學習一些與硬體打交道的彙編語言片段。
當涉及硬體特徵時,我們的策略非常簡單:對全部由硬體驅動的特徵給予簡單描述,而對需要軟體支持的特徵給予詳細描述。事實上,我們感興趣的是核心的設計而不是計算機的體系結構。
我們下一步就是選擇所描述的計算機系統。儘管Linux 目前已運行在很多種類的個人計算機(PC)和工作站上,但我們決定把主要精力放在非常流行且便宜的IBM PC 兼容機上,其中微處理器是Intel 80x86及PC中所支持的一些晶片。在以後的章節中,術語“Intel 80x86微處理器”將表示Intel 80386、80486、Pentium、Pentium Pro、Pentium II、Pentium III、Pentium 4 微處理器或兼容模型。在少數情況下,對於特殊的模型會給出明確的說明。
在研究Linux 各組件時,我們還必須對所遵循的順序做出選擇。我們嘗試的是一種自底向上的方式:從硬體相關的主題開始,以完全與硬體無關的主題結束。事實上,在本書的初始部分我們將多次引用Intel 80x86 微處理器,而其他部分相對來說與硬體無關。不過,第十三章和第十四章是一種例外。實際上,遵循自底向上的方法並不像看起來那樣簡單,這是因為存儲器管理、進程管理和檔案系統這幾部分相互滲透;少數向前引用(即引用還待解釋的主題)是不可避免的。
每章以所涵蓋內容的理論概述開始,然後按自底向上的方式組織材料。我們以描述每章內容所需要的數據結構開始,然後,我們通常從描述最低級功能移到描述較高級功能,最後說明用戶應用程式所發出的系統調用是如何得到支持的。
描述級別
支持各種體系結構的Linux 原始碼包含在14000 多個C 語言和彙編語言的檔案中,這些檔案存放在大約1000 個子目錄中。原始碼大約由六百萬行代碼組成,占230MB 以上的磁碟空間。當然,這本書只能涵蓋原始碼非常少的一部分。考慮一下你所讀的書的全部原始碼只占不到3MB的磁碟空間,就能想像出Linux 原始碼有多么龐大了。因此,即使不對原始碼進行解釋,只列出所有的代碼,75 本書也寫不完!
因此,我們必須對要闡述的內容做出選擇,我們的決策大致情況如下:
我們相當全面地描述了進程管理和記憶體管理。