1. 程式人生 > >Linux核心設計與實現 原書第3版中文版pdf

Linux核心設計與實現 原書第3版中文版pdf

               

下載地址:網盤下載

內容簡介

編輯《Linux核心設計與實現(原書第3版)》基於Linux 2.6.34核心詳細介紹了Linux核心系統,覆蓋了從核心核心系統的應用到核心設計與實現等各方面的內容。《Linux核心設計與實現(原書第3版)》主要內容包括:程序管理程序排程、時間管理和定時器系統呼叫介面、記憶體定址記憶體管理和頁快取、VFS、核心同步以及除錯技術等。同時《Linux核心設計與實現(原書第3版)》也涵蓋了Linux 2.6核心中頗具特色的內容,包括CFS排程程式搶佔式核心、塊I/O層以及I/O排程程式等。《Linux核心設計與實現(原書第3版)》採用理論與實踐相結合的路線,能夠帶領讀者快速走進
Linux核心
世界,真正開發核心程式碼。《Linux核心設計與實現(原書第3版)》適合作為高等院校作業系統課程的教材或參考書,也可供相關技術人員參考。如果你是一名linux核心愛好者,本書的內容可以幫助你大顯身手。如果你是一名普通程式設計師,本書的內容將會拓寬你的程式設計思路。如果你初次接觸linux核心,本書則可以幫助你對核心各個核心子系統有一個整體把握。本版新增內容·增加一章專門描述核心資料結構·詳細描述中斷處理程式·擴充虛擬記憶體和記憶體分配的內容·除錯linux核心的技巧·核心同步和鎖機制的深度描述·提交核心補丁以及參與linux核心社群的建設性建議

編輯推薦

編輯《Linux核心設計與實現(原書第3版)》編輯推薦:暢銷圖書新版《Linux核心設計與實現》第3版翻譯版、影印版同步上市,《Linux核心設計與實現(原書第3版)》詳細描述
Linux核心
的主要子系統和特點,《Linux核心設計與實現(原書第3版)》涵蓋Linux核心從理論到實踐的方方面面。

媒體推薦

編輯能夠把linux核心的內容在300多頁內敘述一遍,本身就是一件高難度的事情。但《Linux核心設計與實現》確實做到了。《Linux核心設計與實現》很少涉及具體實現,而是把握思想,講解演算法,讀者可以學習到linux核心的知識,而不用糾纏於具體細節。—豆瓣讀者Googol,《Linux核心設計與實現》很適合系統學習了OS理論之後直接看程式碼詳解又覺得暫且還不夠功力的讀者,它可以帶你由理論學習階段逐漸過渡到實踐階段。這本書對Linux核心內容的範圍和深度把握得恰到好處。——豆瓣讀者 納蘭經若

作者簡介

編輯(美)拉芙(Robert Love)拉芙(Robert Love)是一位資深的開源社群達人,很早就開始使用Linux。目前他是Google公司高階軟體工程師,是開發Android移動平臺核心的團隊成員;他曾在Novell公司任職Linux桌面系統的首席架構師;他之前也曾是MontaVista和Ximain公司的核心開發工程師。他參與的核心專案包括搶佔式核心、程序排程器、核心事件層、通知機制、VM改進,以及裝置驅動程式。他是《Linux journal》雜誌的編輯。另外他還著有《Linux System Programming》和《Linux in a Nutshell》。

目錄

編輯譯者序序言前言作者簡介1.1 Unix的歷史11.2 追尋Linus足跡:Linux簡介21.3 作業系統和核心簡介31.4 Linux核心和傳統Unix核心的比較51.5 Linux核心版本71.6 Linux核心開發者社群81.7 小結8第2章 從核心出發102.1 獲取核心原始碼102.1.1 使用Git102.1.1 安裝核心原始碼102.1.3 使用補丁112.2 核心原始碼樹112.3 編譯核心122.3.1 配置核心122.3.2 減少編譯的垃圾資訊142.3.3 衍生多個編譯作業 142.3.4 安裝新核心142.4 核心開發的特點152.4.1 無libc庫抑或無標準標頭檔案152.4.2 GNU C162.4.3 沒有記憶體保護機制182.4.4 不要輕易在核心中使用浮點數182.4.5 容積小而固定的棧182.4.6 同步和併發182.4.7 可移植性的重要性192.5 小結19第3章 程序管理203.1 程序203.2 程序描述符及任務結構 213.2.1 分配程序描述符223.2.2 程序描述符的存放233.2.3 程序狀態233.2.4 設定當前程序狀態253.2.5 程序上下文253.2.6 程序家族樹253.3 程序建立263.3.1 寫時拷貝273.3.2 fork()273.3.3 vfork()283.4 執行緒在Linux中的實現283.4.1 建立執行緒293.4.2 核心執行緒303.5 程序終結313.5.1 刪除程序描述符323.5.2 孤兒程序造成的進退維谷323.6 小結34第4章 程序排程354.1 多工354.2 Linux 的程序排程364.3 策略364.3.1 I/O消耗型和處理器消耗型的程序364.3.2 程序優先順序374.3.3 時間片384.3.4 排程策略的活動384.4 Linux排程演算法394.4.1 排程器類394.4.2 Unix 系統中的程序排程404.4.3 公平排程414.5 Linux排程的實現424.5.1 時間記賬424.5.2 程序選擇444.5.3 排程器入口484.5.4 睡眠和喚醒494.6 搶佔和上下文切換514.6.1 使用者搶佔534.6.2 核心搶佔534.7 實時排程策略544.8 與排程相關的系統呼叫544.8.1 與排程策略和優先順序相關的系統呼叫554.8.2 與處理器繫結有關的系統呼叫554.8.3 放棄處理器時間564.9 小結56第5章 系統呼叫575.1 與核心通訊575.2 API、POSIX和C庫575.3 系統呼叫585.3.1 系統呼叫號595.3.2 系統呼叫的效能595.4 系統呼叫處理程式605.4.1 指定恰當的系統呼叫605.4.2 引數傳遞605.5 系統呼叫的實現615.5.1 實現系統呼叫615.5.2 引數驗證625.6 系統呼叫上下文645.6.1 繫結一個系統呼叫的最後步驟655.6.2 從使用者空間訪問系統呼叫675.6.3 為什麼不通過系統呼叫的方式實現685.7 小結68第6章 核心資料結構696.1 連結串列696.1.1 單向連結串列雙向連結串列696.1.2 環形連結串列706.1.3 沿連結串列移動716.1.4 Linux 核心中的實現716.1.5 操作連結串列736.1.6 遍歷連結串列756.2 佇列786.2.1 kfifo796.2.2 建立佇列796.2.3 推入佇列資料796.2.4 摘取佇列資料806.2.5 獲取佇列長度806.2.6 重置和撤銷佇列806.2.7 佇列使用舉例 816.3 對映 816.3.1 初始化一個idr826.3.2 分配一個新的UID826.3.3 查詢UID836.3.4 刪除UID846.3.5 撤銷idr846.4 二叉樹846.4.1 二叉搜尋樹846.5 資料結構以及選擇 876.6 演算法複雜度886.6.1 演算法886.6.2 大o 符號886.6.3 大θ符號896.6.4 時間複雜度896.7 小結 90第7章 中斷和中斷處理917.1 中斷917.2 中斷處理程式927.3 上半部與下半部的對比937.4 註冊中斷處理程式937.4.1 中斷處理程式標誌947.4.2 一箇中斷例子957.4.3 釋放中斷處理程式957.5 編寫中斷處理程式967.5.1 共享的中斷處理程式977.5.2 中斷處理程式例項977.6 中斷上下文997.7 中斷處理機制的實現1007.8 /proc/interrupts1027.9 中斷控制1037.9.1 禁止和啟用中斷1037.9.2 禁止指定中斷線1057.9.3 中斷系統的狀態1057.10 小結106第8章 下半部和推後執行的工作1078.1 下半部1078.1.1 為什麼要用下半部1088.1.2 下半部的環境1088.2 軟中斷1108.2.1 軟中斷的實現1118.2.2 使用軟中斷1138.3 tasklet1148.3.1 tasklet的實現1148.3.2 使用tasklet1168.3.3 老的BH機制1198.4 工作佇列1208.4.1 工作佇列的實現1218.4.2 使用工作佇列1248.4.3 老的任務佇列機制1268.5 下半部機制的選擇1278.6 在下半部之間加鎖1288.7 禁止下半部1288.8 小結129第9章 核心同步介紹1319.1 臨界區競爭條件1319.1.1 為什麼我們需要保護1329.1.2 單個變數1339.2 加鎖1349.2.1 造成併發執行的原因1359.2.2 瞭解要保護些什麼1369.3 死鎖1379.4 爭用和擴充套件性1389.5 小結140第10章 核心同步方法14110.1 原子操作14110.1.1 原子整數操作14210.1.2 64位原子操作14410.1.3 原子位操作14510.2 自旋鎖14710.2.1 自旋鎖方法14810.2.2 其他針對自旋鎖的操作14910.2.3 自旋鎖和下半部15010.3 讀-寫自旋鎖15010.4 訊號量15210.4.1 計數訊號量和二值訊號量15310.4.2 建立和初始化訊號量15410.4.3 使用訊號量15410.5 讀-寫訊號量15510.6 互斥體15610.6.1 訊號量和互斥體15810.6.2 自旋鎖和互斥體15810.7 完成變數15810.8 BLK:大核心鎖15910.9 順序鎖16010.10 禁止搶佔16110.11 順序和屏障16210.12 小結165第11章 定時器和時間管理16611.1 核心中的時間概念16611.2 節拍率:HZ16711.2.1 理想的HZ值16811.2.2 高HZ的優勢16911.2.3 高HZ的劣勢16911.3 jiffies17011.3.1 jiffies的內部表示17111.3.2 jiffies 的迴繞17211.3.3 使用者空間和HZ17311.4 硬時鐘和定時器17411.4.1 實時時鐘17411.4.2 系統定時器17411.5 時鐘中斷處理程式17411.6 實際時間17611.7 定時器17811.7.1 使用定時器17811.7.2 定時器競爭條件18011.7.3 實現定時器18011.8 延遲執行18111.8.1 忙等待18111.8.2 短延遲18211.8.3 schedule_timeout()18311.9 小結185第12章 記憶體管理18612.1 頁18612.2 區18712.3 獲得頁18912.3.1 獲得填充為0的頁19012.3.2 釋放頁19112.4.1 gfp_mask標誌19212.4.2 kfree()19512.6 slab層19712.6.1 slab層的設計19812.6.2 slab分配器的介面20012.7 在棧上的靜態分配20312.7.1 單頁核心棧20312.7.2 在棧上光明正大地工作20312.8 高階記憶體的對映20412.8.1 永久對映20412.8.2 臨時對映20412.9 每個CPU的分配20512.10 新的每個CPU介面20612.10.1 編譯時的每個CPU資料20612.10.2 執行時的每個CPU資料20712.11 使用每個CPU資料的原因20812.12 分配函式的選擇20912.13 小結20913.1 通用檔案系統介面21013.2 檔案系統抽象層21113.3 Unix檔案系統21213.4 VFS 物件及其資料結構21313.5 超級塊物件21413.6 超級塊操作21513.7 索引節點物件21713.8 索引節點操作21913.9 目錄項物件22213.9.1 目錄項狀態22213.9.2 目錄項快取22313.10 目錄項操作22413.11 檔案物件22513.12 檔案操作22613.13 和檔案系統相關的資料結構23013.14 和程序相關的資料結構23213.15 小結233第14章 塊I/O層23414.1 剖析一個塊裝置23414.2 緩衝區和緩衝區頭23514.3 bio結構體23714.3.1 I/O向量23814.3.2 新老方法對比23914.4 請求佇列24014.5 I/O排程程式24014.5.1 I/O排程程式的工作24114.5.2 Linus 電梯24114.5.3 最終期限I/O排程程式24214.5.4 預測I/O排程程式24414.5.5 完全公正的排隊I/O排程程式24414.5.6 空操作的I/O排程程式24514.5.7 I/O排程程式的選擇24514.6 小結246第15章 程序地址空間24715.1 地址空間24715.2 記憶體描述符24815.2.1 分配記憶體描述符24915.2.2 撤銷記憶體描述符25015.2.3 mm_struct 與核心執行緒25015.3 虛擬記憶體區域25115.3.1 VMA標誌25115.3.2 VMA 操作25315.3.3 記憶體區域的樹型結構和記憶體區域的連結串列結構25415.3.4 實際使用中的記憶體區域25415.4 操作記憶體區域25515.4.1 find_vma()25615.4.2 find_vma_prev()25715.4.3 find_vma_intersection()25715.5 mmap()和do_mmap():建立地址區間25815.6 mummap()和do_mummap():刪除地址區間25915.7 頁表26015.8 小結261第16章 頁快取記憶體和頁回寫26216.1 快取手段26216.1.1 寫快取26216.1.2 快取回收26316.2 Linux 頁快取記憶體26416.2.1 address_space物件26416.2.2 address_space 操作26616.2.3 基樹26716.2.4 以前的頁散列表26816.3 緩衝區快取記憶體26816.4 flusher執行緒26816.4.1 膝上型計算機模式27016.4.2 歷史上的bdflush、kupdated 和pdflush27016.4.3 避免擁塞的方法:使用多執行緒27116.5 小結271第17章 裝置與模組27317.1 裝置型別27317.2 模組27417.2.1 Hello,World27417.2.2 構建模組27517.2.3 安裝模組27717.2.4 產生模組依賴性27717.2.5 載入模組27817.2.6 管理配置選項27917.2.7 模組引數28017.2.8 匯出符號表28217.3 裝置模型28317.3.1 kobject28317.3.2 ktype28417.3.3 kset28517.3.4 kobject、ktype和kset的相互關係28517.3.5 管理和操作kobject28617.3.6 引用計數28717.4 sysfs28817.4.1 sysfs中新增和刪除kobject 29017.4.2 向sysfs中新增檔案29117.4.3 核心事件層29317.5 小結294第18章 除錯29518.1 準備開始29518.2 核心中的bug29618.3 通過列印來除錯29618.3.1 健壯性29618.3.2 日誌等級29718.3.3 記錄緩衝區29818.3.4 syslogd和klogd29818.3.5 從printf()到printk()的轉換29818.4 oops29818.4.1 ksymoops30018.4.2 kallsyms30018.5 核心除錯配置選項30118.6 引發bug並列印資訊30118.7 神奇的系統請求鍵30218.8 核心偵錯程式的傳奇30318.8.1 gdb30318.8.2 kgdb30418.9 探測系統30418.9.1 用UID作為選擇條件30418.9.2 使用條件變數30518.9.3 使用統計量30518.9.4 重複頻率限制30518.10 用二分查詢法找出引發罪惡的變更30618.11 使用Git進行二分搜尋30718.12 當所有的努力都失敗時:社群30818.13 小結308第19章 可移植性30919.1 可移植作業系統30919.2 Linux移植史31019.3 字長和資料型別31119.3.1 不透明型別31319.3.2 指定資料型別31419.3.3 長度明確的型別31419.3.4 char型的符號問題31519.4 資料對齊31519.4.1 避免對齊引發的問題31619.4.2 非標準型別的對齊31619.4.3 結構體填補31619.5 位元組順序31819.6 時間31919.7 頁長度32019.8 處理器排序32019.9 SMP、核心搶佔、高階記憶體32119.10 小結321第20章 補丁、開發和社群32220.1 社群32220.2 Linux編碼風格32220.2.1 縮排32320.2.2 switch 語句32320.2.3 空格32420.2.4 花括號32520.2.5 每行程式碼的長度32620.2.6 命名規範32620.2.7 函式32620.2.8 註釋32620.2.9 typedef32720.2.10 多用現成的東西32820.2.11 在原始碼中減少使用ifdef32820.2.12 結構初始化32820.2.13 程式碼的事後修正32920.3 管理系統32920.4 提交錯誤報告32920.5 補丁33020.5.1 建立補丁33020.5.2 用Git建立補丁33120.5.3 提交補丁33120.6 小結332

下載地址:網盤下載