Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版)

Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版) pdf epub mobi txt 電子書 下載 2025

新設計團隊 著
圖書標籤:
  • Linux內核
  • 操作係統
  • 架構設計
  • 內核設計
  • 係統編程
  • C語言
  • 計算機科學
  • 技術
  • 圖解
  • 實現原理
想要找書就要到 靜流書站
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 機械工業齣版社
ISBN:9787111421764
版次:2
商品編碼:11243705
品牌:機工齣版
包裝:平裝
開本:16開
齣版時間:2013-05-01
用紙:膠版紙
頁數:468
正文語種:中文

具體描述

編輯推薦

  【暢銷書】版權輸齣到美國、韓國和中國颱灣,實現瞭中國計算機圖書嚮美國輸齣的零的突破。英文版被MIT等100多所大學圖書館和美國國會圖書館收藏

  對於操作係統而言,穩定且可靠地運行是最重要的。現行技術方案是將用戶進程與用戶進程之間、用戶進程與操作係統之間進行分離,操作係統可以管理用戶進程,但是用戶進程之間不能互相乾預,更不能“侵入”操作係統內核。然而這一切是如何實現的呢?用戶程序和操作係統都是程序,使用的是同一個CPU、同一套指令集、同一個內存條,為什麼會有這麼大的區彆呢?

  絕妙之處在於操作係統的設計指導思想:主奴機製!

  操作係統的設計者依托硬件,在主奴機製設計思想的指導下,把操作係統內核與用戶進程間的關係設計為“主子”與“奴纔”的關係。該指導思想貫穿整個操作係統設計的始終,涉及操作係統的方方麵麵。以內存管理為例,操作係統內核可以訪問所有的內存空間,包括用戶進程的內存空間,而用戶進程則不能訪問其他用戶進程的內存空間,更不可能訪問操作係統內核的內存空間。更有甚者,用戶進程甚至不知道自身的代碼以及所訪問的內存究竟在物理內存中的什麼位置……可以說,操作係統就是圍繞著“主奴機製”這個設計指導思想實現的。

  本書不僅在主奴機製等宏觀的設計指導思想方麵有獨到的見解,而且對操作係統源代碼的實現原理和編程技巧等微觀內容的講解與分析也細緻入微。例如:

  為什麼操作係統的內核代碼不是加載在0x00000的位置?

  為什麼 jmpi 0, 8中的“8”不能簡單地當做阿拉伯數字“8”看待?

  為什麼用C語言寫的操作係統卻不是從main函數開始執行?

  ……

  所有這些在同類書中可能都不曾提及的問題在本書中都有精彩的論述。

  第1版與第2版的區彆

  結閤廣大讀者的反饋意見和新設計團隊對操作係統新的認識,第2版在第1版的基礎上進行瞭大幅度的優化和重寫,使得本書的內容更易於讀者理解。主要改動如下:

  第1版的第2章在第2版中被拆分為第2、3、4章,這樣的拆分對操作係統啓動部分的係統初始化、激活進程0、創建進程1、進程2的層次劃分更清晰,各章內容的篇幅也更為均衡,閱讀體驗會更好。

  根據讀者的反饋,第2版中增加瞭一些示意圖,更便於讀者理解。

  根據讀者的要求,在源代碼中增加瞭大量的注釋,對操作係統的架構描述更直觀,對源代碼的講解更細緻。

內容簡介

  長期以來,新設計團隊一直在為設計一個自主的、有所突破和創新的操作係統而努力。為瞭讓新的成員能更快、更容易地理解操作係統的精髓,從更高的角度去鑒賞和發現操作係統設計中的精妙與不足,團隊成員以Linux 0.11內核為例,對操作係統的設計思想和實現原理進行瞭深刻地剖析,取得瞭十分好的效果,很好地培養和鍛煉瞭團隊成員對操作係統的駕馭能力。為瞭實現讓國人也能設計齣自己的操作係統的目標,本書作者團隊無私地將他們的獨特研究方式與研究成果奉獻瞭齣來,希望所有想要去深刻理解Linux內核和操作係統設計思想朋友能從中受益。

  本書的特點在於,既不是空泛地講理論,也不是單純地從語法的角度去逐行地分析源代碼,而是以操作係統在實際運行中的幾個經典事件為主綫,將理論和實際結閤在一起,精準地再現瞭操作係統在實際運行中究竟是如何運轉的。宏觀上,大傢可以領略Linux 0.11內核的設計指導思想,可以瞭解到各個環節是如何牽製並保持平衡的,以及軟件和硬件之間是如何互相依賴、互相促進的;微觀上,大傢可以看到每一個細節的實現方式和其中的精妙之處。


作者簡介

  新設計團隊,一直在為設計一個自主的、有所突破和創新的操作係統而努力。為瞭讓新的成員能更快、更容易地理解操作係統的精髓,從更高的角度去鑒賞和發現操作係統設計中的精妙與不足,團隊成員以Linux 0.11內核為例,對操作係統的設計思想和實現原理進行瞭深刻地剖析,取得瞭十分好的效果,很好地培養和鍛煉瞭團隊成員對操作係統的駕馭能力。為瞭實現讓國人也能設計齣自己的操作係統的目標,本書作者團隊無私地將他們的獨特研究方式與研究成果奉獻瞭齣來,希望所有想要深刻理解Linux內核和操作係統設計思想的朋友能從中受益。
  《Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版)》的特點在於,既不是空泛地講理論,也不是單純地從語法的角度去逐行地分析源代碼,而是以操作係統在實際運行中的幾個經典事件為主綫,將理論和實際結閤在一起,精準地再現瞭操作係統在實際運行中究竟是如何運轉的。宏觀上,大傢可以領略Linux 0.11內核的設計指導思想,可以瞭解到各個環節是如何牽製並保持平衡的,以及軟件和硬件之間是如何互相依賴、互相促進的;微觀上,大傢可以看到每一個細節的實現方式和其中的精妙之處。

內頁插圖

目錄

前  言
第1章·從開機加電到執行
main函數之前的過程
1.1 啓動BIOS,準備實模式下的中斷嚮量錶和中斷服務程序
1.1.1 BIOS的啓動原理
1.1.2 BIOS 在內存中加載中斷嚮量錶和中斷服務程序
1.2 加載操作係統內核程序並為保護模式做準備
1.2.1 加載第一部分內核代碼--引導程序(bootsect)
1.2.2 加載第二部分內核代碼--setup
1.2.3 加載第三部分內核代碼--system模塊
1.3 開始嚮32位模式轉變,為main函數的調用做準備
1.3.1 關中斷並將system移動到內存地址起始位置0x0000
1.3.2 設置中斷描述符錶和全局描述符錶
1.3.3 打開A20,實現32位尋址
1.3.4 為保護模式下執行head.s做準備
1.3.5 head.s開始執行
1.4 本章小結


第2章·設備環境初始化及激活進程
2.1 設置根設備、硬盤
2.2 規劃物理內存格局,設置緩衝區、虛擬盤、主內存
2.3 設置虛擬盤空間並初始化
2.4 內存管理結構mem_map初始化
2.5 異常處理類中斷服務程序掛接
2.6 初始化塊設備請求項結構
2.7 與建立人機交互界麵相關的外設的中斷服務程序掛接
2.7.1 對串行口進行設置
2.7.2 對顯示器進行設置
2.7.3 對鍵盤進行設置
2.8 開機啓動時間設置
2.9 初始化進程
2.9.1 初始化進程
2.9.2 設置時鍾中斷
2.9.3 設置係統調用總入口
2.10 初始化緩衝區管理結構
2.11 初始化硬盤
2.12 初始化軟盤
2.13 開啓中斷
2.14 進程0由0特權級翻轉到3特權級,成為真正的進程
2.15 本章小結


第3章·進程1的創建及執行
3.1 進程1的創建
3.1.1 進程0創建進程
3.1.2 在task[64]中為進程1申請一個空閑位置並獲取進程號
3.1.3 調用copy_process函數
3.1.4 設置進程1的分頁管理
3.1.5 進程1共享進程0的文件
3.1.6 設置進程1在GDT中的錶項
3.1.7 進程1處於就緒態
3.2 內核第一次做進程調度
3.3 輪轉到進程1執行
3.3.1 進程1為安裝硬盤文件係統做準備
3.3.2 進程1格式化虛擬盤並更換根設備為虛擬盤
3.3.3 進程1在根設備上加載根文件係統
3.4 本章小結


第4章·進程2的創建及執行
4.1 打開終端設備文件及復製文件句柄
4.1.1 打開標準輸入設備文件
4.1.2 打開標準輸齣、標準錯誤輸齣設備文件
4.2 進程1創建進程2並切換到進程2執行
4.3 加載shell程序
4.3.1 關閉標準輸入設備文件,打開rc文件
4.3.2 檢測shell文件
4.3.3 為shell程序的執行做準備
4.3.4 執行shell程序
4.4 係統實現怠速
4.4.1 創建update進程
4.4.2 切換到shell進程執行
4.4.3 重建shell
4.5 本章小結


第5章·文件操作
5.1 安裝文件係統
5.1.1 獲取外設的超級塊
5.1.2 確定根文件係統的掛接點
5.1.3 將超級塊與根文件係統掛接
5.2 打開文件
5.2.1 將進程的*filp[20]與file_table[64]掛接
5.2.2 獲取文件i節點
5.2.3 將文件i節點與file_table[64]掛接
5.3 讀文件
5.3.1 確定數據塊在外設中的位置
5.3.2 將數據塊讀入緩衝塊
5.3.3 將緩衝塊中的數據復製到進程空間
5.4 新建文件
5.4.1 查找文件
5.4.2 新建文件i節點
5.4.3 新建文件目錄項
5.5 寫文件
5.5.1 確定文件的寫入位置
5.5.2 申請緩衝塊
5.5.3 將指定的數據從進程空間復製到緩衝塊
5.5.4 數據同步到外設的兩種方法
5.6 修改文件
5.6.1 重定位文件的當前操作指針
5.6.2 修改文件
5.7 關閉文件
5.7.1 當前進程的filp與file_table[64]脫鈎
5.7.2 文件i節點被釋放
5.8 刪除文件
5.8.1 對文件的刪除條件進行檢查
5.8.2 進行具體的刪除工作
5.9 本章小結


第6章·用戶進程與內存管理
6.1 綫性地址的保護
6.1.1 進程綫性地址空間的格局
6.1.2 段基址、段限長、GDT、LDT、特權級
6.2 分頁
6.2.1 綫性地址映射到物理地址
6.2.2 進程執行時分頁
6.2.3 進程共享頁麵
6.2.4 內核分頁
6.3 一個用戶進程從創建到退齣的完整過程
6.3.1 創建str1進程
6.3.2 str1進程加載的準備工作
6.3.3 str1進程的運行、加載
6.3.4 str1進程的退齣
6.4 多個用戶進程同時運行
6.4.1 進程調度
6.4.2 頁寫保護
6.5 本章小結


第7章·緩衝區和多進程操作文件
7.1 緩衝區的作用
7.2 緩衝區的總體結構
7.3 b_dev、b_blocknr及request的作用
7.3.1 保證進程與緩衝塊數據交互的正確性
7.3.2 讓數據在緩衝區中停留的時間盡可能長
7.4 uptodate和dirt的作用
7.4.1 b_uptodate的作用
7.4.2 b_dirt的作用
7.4.3 i_uptodate、i_dirt和s_dirt的作用
7.5 count、 lock、wait、request的作用
7.5.1 b_count的作用
7.5.2 i_count的作用
7.5.3 b_lock、*b_wait的作用
7.5.4 i_lock、i_wait、s_lock、*s_wait的作用
7.5.5 補充request的作用
7.6 實例1:關於緩衝塊的進程等待隊列
7.7 總體來看緩衝塊和請求項
7.8 實例2:多進程操作文件的綜閤實例
7.9 本章小結


第8章·進程間通信
8.1 管道機製
8.1.1 管道的創建過程
8.1.2 管道的操作
8.2 信號機製
8.2.1 信號的使用
8.2.2 信號對進程執行狀態的影響
8.3 本章小結


第9章·操作係統的設計指導思想
9.1 運行一個最簡單的程序,看操作係統為程序運行做瞭哪些工作
9.2 操作係統的設計指導思想--主奴機製
9.2.1 主奴機製中的進程及進程創建機製
9.2.2 操作係統的設計如何體現主奴機製
9.3 實現主奴機製的三種關鍵技術
9.3.1 保護和分頁
9.3.2 特權級
9.3.3 中斷
9.4 建立主奴機製的決定性因素--先機
9.5 軟件和硬件的關係
9.5.1 非用戶進程--進程0、進程1、shell進程
9.5.2 文件與數據存儲
9.6 父子進程共享頁麵
9.7 操作係統的全局中斷與進程的局部中斷--信號
9.8 本章小結
結束語
“新設計團隊”簡介

精彩書摘

  2.10初始化緩衝區管理結構  緩衝區是內存與外設(如硬盤,以後以硬盤為例)進行數據交互的媒介。內存與硬盤最大的區彆在於,硬盤的作用僅僅是對數據信息以很低的成本做大量數據的斷電保存,並不參與運算(因為CPU無法到硬盤上進行尋址),而內存除瞭需要對數據進行保存以外,更重要的是要與CPU、總綫配閤進行數據運算。緩衝區則介於兩者之間,它既對數據信息進行保存,也能夠參與一些像查找、組織之類的間接、輔助性運算。有瞭緩衝區這個媒介以後,對外設而言,它僅需要考慮與緩衝區進行數據交互是否符閤要求,而不需要考慮內存如何使用這些交互的數據;對內存而言,它也僅需要考慮與緩衝區交互的條件是否成熟,而不需要關心此時外設對緩衝區的交互情況。兩者的組織、管理和協調將由操作係統統一操作。  操作係統通過hash_table[NR_HASH]、buffer_head雙嚮環鏈錶組成的復雜的哈希錶管理緩衝區。  操作係統通過調用buffer_init()函數對緩衝區進行設置,執行代碼如下:  在buffer_init()函數裏,從內核的末端及緩衝區的末端同時開始,方嚮相對增長、配對地做齣buffer_head、緩衝塊,直到不足一對buffer_head、緩衝塊。在第2章開始時設定的內存格局下,有3000多對buffer_head、緩衝塊,buffer_head在低地址端,緩衝塊在高地址端。  將buffer_head的成員設備號b_dev、引用次數b_count、“更新”標誌b_uptodate、“髒”標誌b_dirt、“鎖定”標誌b_lock設置為0。如圖2—24所示,將b_data指針指嚮對應的緩衝塊。利用buffer_head的b_prevz_free、b_next_free,將所有的buffer_head形成雙嚮鏈錶。使flee_list指嚮第一個buffer_head,並利用free_list將buffer_head形成雙嚮鏈錶鏈接成雙嚮環鏈錶,如圖2—25所示。  注意圖2—26頂部所示的內存的變化。在緊靠係統內核的部分,多齣瞭一塊用黑色錶示的內存區域,那裏麵存儲的就是緩衝區管理結構。由於它管理著3000多個緩衝塊,因此它占用的內存空間的大小,與內核幾乎差不多。圖2—26中也對空閑錶的雙嚮鏈錶結構給齣瞭形象的說明。  ……

前言/序言

  為什麼寫這本書
  很早就有一個想法,做中國人自己的、有所突破、有所創新的操作係統、計算機語言及編譯平颱。
  我帶領的“新設計團隊”(主要由中國科學院研究生院畢業的學生組成)在實際開發自己的操作係統的過程中,最先遇到的問題就是如何培養學生真正看懂Linux操作係統的源代碼的能力。開源的Linux操作係統的源代碼很容易找到,但很快就會發現,培養學生看懂Linux操作係統的源代碼是一件非常睏難的事。
  操作係統的代碼量通常都是非常龐大的,動輒幾百萬行,即使瀏覽一遍也要很長時間。比龐大的代碼量更讓學習者絕望的是操作係統有著極其錯綜復雜的關係。看上去,代碼的執行序時隱時現,很難抓住脈絡。代碼之間相互牽扯,相互勾連,幾乎無法理齣頭緒,更談不上理解代碼背後的原理、意圖和思想。
  對於學生而言,選擇從源代碼的什麼地方開始分析,本身就是一個難題。通常,學生有兩種選擇:一種是從main函數,也就是從C語言代碼的總入口開始,沿著源代碼的調用路綫一行一行地看下去,學生很快就會發現源代碼的調用路綫莫名其妙地斷瞭,但直覺和常識告訴他操作係統肯定不會在這個地方停止,一定還在繼續運行,卻不知道後續的代碼在哪裏,這種方法很快就走進瞭死鬍同;另一種則是從某一模塊入手,如文件係統,但這樣會無形中切斷操作係統源碼之間復雜的關係,如文件係統與進程管理的關係,文件係統與內存管理的關係,等等。學生如果孤立地去理解一個模塊,往往隻能記住一些名詞和簡單概念,難以真正理解操作係統的全貌。用學生的話講,他們理解的操作係統變成瞭“文科”的操作係統。
  由於操作係統是底層係統程序,對應用程序行之有效的調試和跟蹤等手段對操作係統的源代碼而言,幾乎無效。學生就算把每一行源代碼都看懂瞭,對源代碼已經爛熟於心,知道這一行是一個for循環,那一行是一個調用……但仍然不知道整個代碼究竟在做什麼以及起到什麼作用,更不知道設計者的意圖究竟是什麼。
  學生在操作係統課程上學習過進程管理、內存管理、文件係統等基礎知識,但是對這些空洞的理論在一個實際的操作係統中是如何實現的卻不得而知。他們在源代碼中很難看齣進程和內存之間有什麼關聯,內核程序和用戶程序有什麼區彆,為什麼要有這些區彆;也很難從源代碼中看清楚,我們實際經常用到的操作,比如打開文件,操作係統在其中都做瞭哪些具體的工作。想在與常見的應用程序的編程方法有巨大差異的、晦澀難懂的、浩瀚如海的操作係統底層源代碼中找到這些問題的答案,似乎比登天還難。
  對熟悉操作係統源代碼的學生而言,他們也知道像分頁機製這樣的知識點,知道若乾級的分頁及恒等映射,但是未必能夠真正理解隱藏在機製背後的深刻意義。
  這些都是學生在學習Linux操作係統源代碼時遇到的實際問題。中國科學院研究生院的學生應該是年輕人中的佼佼者,他們遇到的問題可能其他讀者也會遇到。我萌發瞭一個想法,雖然學生的問題早已解決,但是否可以把他們曾經在學習、研發操作係統的過程中遇到的問題和心得體會拿齣來供廣大讀者分享。
  當時,針對學生的實際問題,我的解決方法是以一個真實的操作係統為例,讓學生理解源代碼並把操作係統在內存中的運行時狀態畫齣圖來。實踐證明,這個方法簡單有效。
  現在我們把這個解決方案體現在這本書中。這就是以一個真實的操作係統的實際運行為主綫;以圖形、圖像為核心,突齣描述操作係統在實際運行過程中內存的運行時結構;強調學生站在操作係統設計者的視角,用體係的思想方法,整體把握操作係統的行為、作用、目的和意義。
  第1版與第2版的區彆
  第2版較第1版有較大的改動。
  從總體結構上,將第1版的第2章拆分為第2版的第2章、第3章、第4章。這樣的拆分對操作係統啓動部分的係統初始化、激活進程0、創建進程1、創建進程2的層次劃分更清晰。各章內容的分量也比較均衡,閱讀感受會更好。
  根據讀者的反饋意見,第2版增加瞭一些示意圖,在源代碼中增加瞭大量的注釋,對操作係統的架構錶述得更直觀,對源代碼講解得更細緻。這些是第2版改動最大、下功夫最多的地方。希望我們的努力能給讀者帶來更多的幫助。
  本書內容及特色
  在全書的講解過程中,我們不僅詳細分析瞭源代碼、分析瞭操作係統的執行序,還特彆分析瞭操作係統都做瞭哪些“事”,並且對於“事”與“事”之間的關係和來龍去脈,這些“事”意味著什麼,為什麼要做這些“事”,這些“事”背後的設計思想是什麼……都做瞭非常詳細且深入的分析。
  更重要的是,對於所有重要的階段,我們幾乎都用圖解的方式把操作係統在內存中的實際運行狀態精確地錶示瞭齣來。我們用600 dpi的分辨率精心繪製瞭300多張圖,圖中錶現的運行時結構和狀態與操作係統實際運行的真實狀態完全吻閤。對每一條綫、每一個色塊、每一個位置、每一個地址及每一個數字,我們都經過瞭認真反復地推演和求證,並最終在計算機上進行瞭核對和驗證。看瞭這些繪製精美的圖後,讀者的頭腦中就不再是一行行、一段段枯燥的、令人眩暈的源代碼,而是立體呈現的一件件清晰的“事”,以及這些“事”在內存中直截瞭當、清晰鮮活的畫麵。用這樣的方法講解操作係統是本書的一大特色。理解這些圖要比理解源代碼和文字容易得多。毫不誇張地說,隻要你能理解這些圖,你就理解瞭操作係統的80%。這時你可以自豪地說,你比大多數用彆的方法學過操作係統的人的水平都要高齣一大截。
  作者和機械工業齣版社的編輯做瞭大量的檢索工作。就我們檢索的範圍而言,這樣的創作方法及具有這樣特色的操作係統專著在世界範圍都是第一次。
  本書分三部分來講解Linux操作係統:第一部分(第1~4章)分析瞭從開機加電到操作係統啓動完成並進入怠速狀態的整個過程;第二部分(第5~8章)講述瞭操作係統進入係統怠速後,在執行用戶程序的過程中,操作係統和用戶進程的實際運行過程和狀態;第三部分(第9章)闡述整個Linux操作係統的設計指導思想,是從微觀到宏觀的迴歸。
  第一部分中,我們詳細講解瞭開機加電啓動BIOS,通過BIOS加載操作係統程序,對主機的初始化,打開保護模式和分頁,調用main函數,創建進程0、進程1、進程2以及shell進程,並且具備用文件的形式與外設交互。
  第二部分中,我們設計瞭幾個盡可能簡單又有代錶性的應用程序,並以這些程序的執行為引導,詳細講解瞭安裝文件係統、文件操作、用戶進程與內存管理、多個進程對文件的操作以及進程間通信。
  我們將操作係統的原理自然而然地融入瞭講解真實操作係統的實際運行過程中。在讀者看來,操作係統原理不再是空對空的、“文科”概念的計算機理論,而是既有完整且體係的理論,又有真實、具體、實際的代碼和案例,理論與實際緊密結閤。
  第三部分是全書水平最高的部分,詳細闡述瞭主奴機製以及實現主奴機製的三項關鍵技術:保護和分頁、特權級、中斷,分析瞭保障主奴機製實現的決定性因素—先機,還詳細講解瞭緩衝區、共享頁麵、信號、管道的設計指導思想。我們嘗試從操作係統設計者的視角講解操作係統的設計指導思想。希望幫助讀者用體係的思想理解、把握、駕馭整個操作係統以及背後的設計思想和設計意圖。
  在本書中,我們詳細講解瞭大傢在學習操作係統的過程中可能會遇到的每一個難點,如main函數中的pause()調用,雖然已經找不到後續代碼,但該調用結束後,程序仍然執行的原因是:中斷已經打開,進程調度就開始瞭,而此時可以調度的進程隻有進程1,所以後續的代碼應該從進程1處繼續執行……
  我們還對讀者不容易理解和掌握的操作係統特有的底層代碼的一些編程技巧做瞭詳細的講解,如用模擬call的方法,通過ret指令“調用”main函數……
  總之,我們所做的一切努力就是想真正解決讀者遇到的實際問題和難題,給予讀者有效的幫助。我們盼望即使是剛剛考入大學的學生也有興趣和信心把這本書讀下去;我們同樣希望即使是對操作係統源代碼很熟悉的讀者,這本書也能給他們一些不同的視角、方法和體係性思考。
  為什麼本書選用Linux 0.11內核
  這本書選用的是Linux 0.11操作係統源代碼。對為什麼選用Linux 0.11而不是最新版本,趙炯先生有過非常精彩的論述。我們認為趙先生的論述是非常到位的。
  我們不妨看一下Linux最新的版本2.6,代碼量大約在韆萬行這個量級,去掉其中的驅動部分,代碼量仍在百萬行這個量級。一個人一秒鍾看一行,一天看8小時,中間不吃、不喝、不休息,也要看上幾個月,很難想象如何去理解。
  就算我們堅持要選用Linux 2.6,就算我們寫上2000頁(書足足會有十幾厘米厚),所有的篇幅都用來印代碼,也隻能印上不到十分之一的代碼。所以,即使是這麼不切實際的篇幅,也不可能整體講解Linux 2.6。讀者會逐漸明白,對於理解和掌握操作係統而言,真正有價值的是整體、是體係,而不是局部。
  Linux 0.11的內核代碼雖然隻有約兩萬行,但卻是一個實實在在、不摺不扣的現代操作係統。因為它具有現代操作係統最重要的特徵—支持實時多任務,所以必然支持保護和分頁……而且它還是後續版本的真正的始祖,有著內在的、緊密的傳承關係。讀者更容易看清設計者最初的、最根本的設計意圖和設計指導思想。
  Linux 0.11已經問世20多年瞭,被世人廣為研究和學習。換一個角度看,要想對眾人熟悉的事物和領域講齣新意和特色,對作者來說也是一個強有力的挑戰。
  緻謝
  首先,感謝機械工業齣版社華章公司的副總經理溫莉芳女士以及其他領導,是他們的決心和決策成就瞭這本書,並且在幾乎所有方麵給予瞭強有力的支持。特彆令人感動的是他們主動承擔瞭全部的齣版風險,同時給予瞭作者最好的條件,讓我們看到一個大齣版社的氣度和風範。
  其次,特彆感謝機械工業齣版社華章公司的編輯楊福川。楊先生的鑒賞力和他的事業心以及他對工作認真負責的態度為這本書的齣版打開瞭大門。楊先生對讀者的理解以及他的計算機專業素養使得他有能力對這本書給予全方位的指導和幫助,使我們對這本書整體修改瞭多次,使之更貼近讀者,可讀性更好。
  還要感謝我們和楊福川共同的朋友張國強先生和楊縉女士。
  最後,感謝我們的傢人和朋友,是他們堅定的支持纔使得整個團隊能夠拒絕方方麵麵、形形色色的誘惑,放棄普遍追求的短期利益;我們在常人難以想象的艱苦條件下,長時間專注於操作係統、計算機語言、編譯器、計算機體係結構等基礎性學科的研究。因為我們認認真真、踏踏實實、不為名利,隻為做一點實在、深入的工作,積纍瞭十年的經驗,打造瞭一支敢想、敢乾、敢打、敢拼、不懼世界頂級強敵的隊伍。這些是本書的基礎。
  楊力祥
  中國科學院研究生院
  2013年1月





《深度剖析:現代操作係統內核的奧秘》 本書並非聚焦於特定操作係統的技術細節,而是緻力於揭示現代操作係統內核設計的普遍性原則、核心思想以及演進脈絡。我們旨在為讀者構建一個高屋建瓴的視角,理解不同操作係統內核在處理諸如進程管理、內存分配、設備驅動、文件係統、網絡通信等核心任務時所遵循的共性邏輯和創新策略。通過對這些普遍性問題的深入探討,本書將幫助讀者掌握分析和理解任何操作係統內核的能力,而不僅僅是某個特定版本的實現。 第一部分:內核架構的基石——通用設計範式與核心抽象 在深入探討具體技術之前,我們首先需要建立起對操作係統內核架構的整體認知。本部分將從宏觀層麵齣發,解析構成現代內核設計的幾大核心支柱。 內核模式與用戶模式的隔離: 這是操作係統安全與穩定的基石。我們將詳細闡述兩種模式存在的必要性,CPU提供的硬件支持(如Ring Protection),以及內核如何通過係統調用機製與用戶空間進行交互。探討不同內核設計(宏內核、微內核、混閤內核)在此隔離機製上的實現差異和權衡。 進程與綫程的抽象: 進程和綫程是並發執行的基本單元。本書將深入剖析這兩個抽象概念的起源、演進以及它們在不同操作係統內核中的具體實現。我們將探討綫程模型(用戶級綫程、內核級綫程、混閤模型),調度算法的原理、實現及其對係統性能的影響,以及進程間通信(IPC)機製的多種形式和應用場景。 內存管理:虛擬內存與物理內存的橋梁: 內存是計算機係統中最為寶貴的資源之一。本部分將詳細講解虛擬內存的概念,包括頁式管理、段式管理及其結閤。深入剖析內存分頁、分段、頁麵置換算法(如LRU, FIFO, Optimal),以及內存映射(mmap)等核心機製。同時,我們將探討物理內存的分配策略,如夥伴係統(Buddy System)和 Slab 分配器,以及它們如何高效管理內核和用戶空間的物理內存。 設備管理與I/O子係統: 操作係統需要與硬件設備進行交互。我們將解析I/O子係統的一般架構,包括設備驅動程序的角色、接口(如字符設備、塊設備、網絡設備)以及中斷處理機製。深入探討DMA(Direct Memory Access)技術如何繞過CPU實現高效數據傳輸,以及緩衝與緩存技術在I/O性能優化中的作用。 同步與並發控製: 在多任務、多處理器環境中,保證數據的一緻性和避免競態條件至關重要。本部分將係統介紹同步機製,如互斥鎖、信號量、讀寫鎖、自鏇鎖等。深入分析死鎖的産生條件、檢測與避免方法,以及如何在多核環境下實現高效的並發控製。 第二部分:核心子係統的深度剖析——通用設計模式與實現考量 在本部分,我們將進一步深入到操作係統的核心子係統中,剖析它們的通用設計模式、關鍵數據結構以及常見的實現挑戰。 調度器:公平與效率的藝術: 調度器是內核的“大腦”,負責在CPU上分配執行時間。我們將探討不同調度策略的演進,從簡單的FCFS、SJF到更復雜的優先級調度、時間片輪轉,以及現代係統中普遍采用的公平調度算法(如CFS - Completely Fair Scheduler)的原理。分析調度器在多核環境下的挑戰,如負載均衡和緩存親和性。 內存分配器的奧秘: 內核需要頻繁且高效地分配和釋放內存。我們將詳細介紹內核中常見的內存分配器,如夥伴係統(Buddy System)如何管理連續的物理內存塊,以及Slab分配器如何高效管理頻繁分配的小型對象。分析不同分配器在性能、碎片化和內存開銷上的權衡。 文件係統的通用模型與實現: 文件係統是數據持久化的關鍵。我們將解析文件係統的通用抽象層,如 VFS (Virtual File System) 在 Linux 中的作用,它如何提供統一的接口來訪問不同類型的存儲介質。深入探討文件係統的基本構成,如目錄結構、inode、數據塊,以及文件係統的日誌(Journaling)機製如何保證數據的一緻性。 網絡協議棧的實現: 網絡通信是現代操作係統的另一重要組成部分。我們將剖析TCP/IP協議棧的通用架構,重點關注其在內核中的實現。深入理解套接字(Socket)接口,以及TCP、UDP等傳輸層協議在內核中的數據包處理流程,包括擁塞控製、流量控製等關鍵機製。 設備驅動的通用設計原則: 設備驅動是連接硬件與內核的橋梁。我們將探討設備驅動的一般設計模式,包括驅動模型的抽象,以及如何與內核的I/O子係統、中斷處理機製協同工作。分析不同類型設備驅動(如PCI驅動、USB驅動)的特點和實現難點。 第三部分:高級主題與前沿展望——內核設計的演進與未來趨勢 隨著硬件的發展和應用需求的不斷變化,操作係統內核設計也在持續演進。本部分將探討一些高級主題,並對未來的發展趨勢進行展望。 高性能與低延遲的優化技術: 在追求係統性能和響應速度的道路上,內核設計者們不斷探索新的優化技術。我們將討論 NUMA (Non-Uniform Memory Access) 架構對內核設計的影響,以及如何進行內存和CPU的拓撲感知優化。探討無鎖數據結構(Lock-free Data Structures)在減少鎖競爭、提升並發性能方麵的應用。 安全與隔離的新範式: 傳統的安全模型麵臨新的挑戰。本部分將介紹容器化(如Docker, Kubernetes)所依賴的內核特性,如Namespace和Cgroups,以及它們如何在內核層麵實現資源隔離和進程管理。探討虛擬化技術(如KVM)如何通過硬件輔助實現更強的隔離性。 模塊化與可伸縮性: 現代操作係統內核需要具備良好的可伸縮性和靈活性。我們將探討內核模塊的加載與卸載機製,以及動態調整內核參數以適應不同硬件和工作負載。分析微服務架構等思想對操作係統內核設計的影響。 實時操作係統(RTOS)的核心設計考量: 對於對時間要求極高的應用場景,實時操作係統有著特殊的內核設計需求。我們將對比通用操作係統內核與RTOS內核在調度策略(如硬實時調度)、中斷處理、內存管理等方麵的差異,以及RTOS如何保證可預測性和確定性。 內核開發的未來趨勢: 結閤當前的技術發展,我們將對操作係統內核設計的未來進行展望。這可能包括對更精細化內存管理技術、更智能的調度算法、麵嚮異構計算的內核架構,以及與AI、機器學習等前沿技術在內核層麵的融閤進行探討。 本書的目標讀者: 本書適閤於有一定計算機基礎,希望深入理解操作係統內核工作原理的開發者、係統工程師、計算機科學專業的學生以及對操作係統設計充滿好奇的技術愛好者。無論您使用的是何種操作係統,本書都將為您提供一套通用的分析框架和深刻的洞見,幫助您更好地理解和駕馭現代操作係統的核心。我們將避免使用過多的特定操作係統專有術語,而是聚焦於普遍存在的概念、算法和設計模式,讓您的知識體係更具普適性和前瞻性。

用戶評價

評分

我是一名資深的C++開發者,一直對操作係統底層的機製充滿好奇,想知道我們每天使用的應用程序背後,究竟隱藏著怎樣的運作邏輯。市麵上有很多關於Linux的書籍,但大多側重於命令行的使用或者某個特定領域的應用,真正能讓我看到“全局”的書卻不多。《Linux內核設計的藝術》恰恰填補瞭這個空白。它沒有像某些書籍那樣,上來就陷入晦澀的匯編代碼或內核API的羅列,而是從一個宏觀的視角,逐步深入到內核的各個關鍵模塊。我尤其欣賞作者在講解過程中,那種層層剝離、由淺入深的處理方式。他能夠將復雜的概念,比如進程管理、綫程模型、信號處理、中斷機製等,用非常清晰的邏輯和清晰的語言進行闡述,並輔以大量精美的圖示,幫助讀者構建起一個完整的內核架構圖。對於我這種有一定編程基礎的人來說,這本書讓我看到瞭應用程序與內核之間的“橋梁”是如何搭建的,讓我對係統調用的本質、內存的分配與迴收、以及多綫程的同步與互斥有瞭更深刻的理解。

評分

我是一名初級Linux係統工程師,一直想提升自己的技術深度,尤其是在係統性能調優和故障排查方麵。之前嘗試過閱讀一些官方文檔和技術博客,但往往感覺知識點零散,不成體係。直到我翻開瞭《Linux內核設計的藝術》,纔真正打開瞭新世界的大門。這本書的講解風格非常務實,它不是那種空談理論的書,而是緊密結閤瞭實際應用場景。舉例來說,在談到進程調度時,作者不僅介紹瞭 CFS(Completely Fair Scheduler)的核心思想,還詳細分析瞭在不同負載下的調度行為,並給齣瞭實際的調優建議。書中對於 I/O 子係統、文件係統以及網絡協議棧的剖析,也同樣深入且貼閤實際。我最喜歡的部分是,書中在講解某個模塊的實現原理時,會穿插一些典型的應用場景和可能的性能瓶頸,這讓我能夠立刻將學到的知識與我的日常工作聯係起來,並且能夠思考如何利用這些知識去解決實際問題。這種“理論與實踐並重”的敘事方式,對於我這樣的工程師來說,是極具指導意義的,讓我感覺這本書不僅是知識的傳遞,更是技能的提升。

評分

這絕對是一本值得反復閱讀的寶藏!我是一名正在攻讀計算機科學的碩士研究生,在學習操作係統的過程中,總是感覺理論與實踐之間存在一道鴻溝。《Linux內核設計的藝術》這本書,在很大程度上彌閤瞭這一差距。它的講解方式非常係統化,從最基礎的啓動過程,到復雜的調度、內存、進程通信等核心機製,都進行瞭詳盡而清晰的闡述。我最看重的是書中“圖解”的特點,那些精巧的圖示,能夠幫助我快速抓住核心要點,並且在腦海中形成一個動態的、可視化的模型。比如,書中對進程狀態轉換的圖解,以及對文件係統緩存機製的剖析,都讓我印象深刻。而且,這本書並沒有止步於理論的講解,它會巧妙地引導讀者去思考這些設計在實際應用中的錶現,以及可能帶來的影響。這種“寓教於樂”的學習方式,對於我這樣一個需要係統性掌握知識的學生來說,極具吸引力。它讓我不再覺得操作係統是一個枯燥乏味的學科,而是充滿智慧和挑戰的領域。

評分

這本書的價值絕不僅僅在於它對Linux內核原理的講解,更在於它所蘊含的“設計哲學”。我是一名在軟件架構設計領域摸爬滾打多年的從業者,深知一個優秀係統的背後,一定有精妙的設計思想。《Linux內核設計的藝術》這本書,恰恰展現瞭Linux內核設計者們的智慧和匠心。作者在介紹每個模塊的設計時,都會深入剖析其設計的初衷、權衡的取捨以及演進的曆程。比如,在討論內核模塊化設計時,書中分析瞭其帶來的靈活性和可擴展性,但也指齣瞭潛在的復雜性。這種對設計背後原因的深入挖掘,讓我能夠站在更高的維度去理解Linux內核,而不僅僅是停留在對某個具體實現的瞭解。我常常會在閱讀過程中停下來思考,為什麼Linux內核會選擇這樣的方案?有沒有其他更好的選擇?這種批判性的思考,正是提升架構設計能力的關鍵。這本書就像一本關於“係統設計藝術”的百科全書,讓我受益匪淺。

評分

這本書簡直是為我量身定做的!作為一名對Linux係統底層原理充滿好奇的技術愛好者,我一直苦於找不到一本既能深入淺齣又足夠詳實的資料。市麵上很多書要麼過於理論化,要麼過於碎片化,讀起來總是抓不住核心。但《Linux內核設計的藝術》完全不同,它就像一個經驗豐富的嚮導,帶著我一步步探索Linux內核的宏偉藍圖。我尤其欣賞它在架構設計上的闡述,那些復雜的組件是如何協同工作的,每個模塊的職責是什麼,作者都用非常清晰的邏輯和生動的比喻一一揭示。而且,它沒有迴避那些看似艱深的細節,而是通過大量的圖示,將抽象的概念具象化,讓我這個視覺型學習者如獲至寶。比如,當講到內存管理時,書中關於頁錶、TLB、夥伴係統以及 Slab 分配器的圖解,簡直是神來之筆,讓我瞬間就對這些概念有瞭透徹的理解,而不是僅僅停留在死記硬背的層麵。它不僅僅是講解“是什麼”,更著重於“為什麼”和“怎麼做”,這種對設計思想的剖析,對於我這種想要深入理解Linux內核,甚至參與到相關開發中的人來說,價值連城。

評分

物流快

評分

物流快

評分

包裝好,京東物流給力

評分

印刷很好,內容還沒有仔細看過,不過挺難的

評分

到貨很快,下次還會光顧的。。。

評分

感覺不錯 包裝的挺好。

評分

學linux必讀

評分

普通人很難看懂,我指的是不是計算機專業的學生。不過還是可以看齣作者是很用心的在坐

評分

非常好,配圖做的相當周到免去瞭很多麻煩

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 windowsfront.com All Rights Reserved. 靜流書站 版權所有