發表於2024-12-23
【暢銷書】版權輸齣到美國、韓國和中國颱灣,實現瞭中國計算機圖書嚮美國輸齣的零的突破。英文版被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 本章小結
結束語
“新設計團隊”簡介
為什麼寫這本書
很早就有一個想法,做中國人自己的、有所突破、有所創新的操作係統、計算機語言及編譯平颱。
我帶領的“新設計團隊”(主要由中國科學院研究生院畢業的學生組成)在實際開發自己的操作係統的過程中,最先遇到的問題就是如何培養學生真正看懂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多張圖,圖中錶現的運行時結構和狀態與操作係統實際運行的真實狀態完全吻閤。對每一條綫、每一個色塊、每一個位置、每一個地址及每一個數字,我們都經過瞭認真反復地推演和求證,並最終在計算機上進行瞭核對和驗證。看瞭這些繪製精美的圖後,讀者的頭腦中就不再是一行行、一段段枯燥的、令人眩暈的源代碼,而是立體呈現的一件件清晰的“事”,以及這些“事”在內存中直截瞭當、清晰鮮活的
Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版) 下載 mobi epub pdf txt 電子書 格式
Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版) 下載 mobi pdf epub txt 電子書 格式 2024
Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版) 下載 mobi epub pdf 電子書不錯啊
評分“一圖勝韆言”,圖文結閤的方式很不錯。多色套印,重點一目瞭然。
評分很一般,看不下去
評分圖書正版,紙質很好,內容很豐富,可以學到不少東西
評分我的評價為京豆而來。
評分不錯,質量沒毛病,運輸沒損壞
評分今天早晨收到的書,物流很給力,書質量也好!
評分講的很細。但是不推薦沒有基礎的人讀,感覺讀起來會吃力。
評分很不錯的書,很詳細的講解瞭linux早期版本的實現細節和背後的原理。推薦學習linux的看,一個整體的理解很必要。
Linux內核設計的藝術:圖解Linux操作係統架構設計與實現原理(第2版) mobi epub pdf txt 電子書 格式下載 2024