< >
專為Linux kernel新手程式設計師與希望深化核心開發能力的工程師所撰寫!是一本兼具系統性與實務導向的程式設計指南。內容循序漸進,從基礎概念出發,引領讀者深入Linux kernel的設計思維與運作核心。本書以6.1長期支援(LTS,Long-Term Support)的Linux kernel為基礎,該版本具備高度穩定性,並廣泛應用於實務環境中。此外,Civil Infrastructure Project已承諾將6.1超長期支援(SLTS,Super LTS)kernel維護至2033年8月,使本書在未來多年內仍具高度實務與參考價值。你將從學習如何由原始碼編譯(build)kernel開始,逐步學習如何運用kernel強大的可載入核心模組(LKM,Loadable Kernel Module)架構,撰寫並管理你的第一個kernel模組。在奠定模組開發基礎後,將進一步帶你深入核心內部關鍵主題,包括Linux kernel架構、記憶體管理與CPU(task)排程等重要機制。最後,本書將聚焦於kernel開發中極為關鍵的——平行性(concurrency),深入說明各種同步與上鎖(locking)技術的設計理念與實務應用,包含mutex、spinlock、atomic/refcount運算子、rw-spinlock,以及per-CPU與RCU等lock-free技術,協助你撰寫更安全、穩定且可擴充的kernel程式碼。閱讀完本書後,你將能以更宏觀且結構化的視角理解Linux kernel與kernel模組的運作方式,並具備實際應用於真實專案與產品中的能力。內容包括:■ 從原始碼設定並編譯6.1 LTS Linux kernel■ 為6.x kernel設計高品質、可維護的模組化程式碼(LKM架構)■ 探索現代Linux kernel架構設計■ 掌握kernel內記憶體管理的關鍵細節■ 理解並使用各種動態kernel記憶體alloc/dealloc API■ 深入解析kernel內CPU排程機制,包含cgroups v2■ 洞悉kernel平行性(concurrency)問題與常見陷阱■ 正確運用關鍵的kernel同步原語(synchronization primitives)
Kaiwan長期深耕Linux系統程式設計,技術橫跨Bash腳本、C語言使用者空間程式開發,以及作業系統層級的Linux kernel內部機制開發與除錯,並參與多項商業與開源專案。他曾為Linux主線核心提交裝置驅動程式,亦在GitHub上發起多個開源專案。目前專注於Linux kernel強化與安全領域。二十多年來,他持續培訓工程師,教授Linux作業系統原理與安全、穩定程式設計實務,致力於培養具備紮實核心能力的開發者。
前言 chapter 1 Linux 核心程式設計 -快速入門核心工作區設定技術要求chapter 2 從原始碼構建 6.x Linux 核心 -第一部分2-1 技術要求2-2 核心建構的準備工作2-3 從原始碼建構 kernel 的步驟2-4 步驟1:取得 Linux kernel 原始碼樹2-5 步驟2:提取 kernel 原始碼樹2-6 步驟3:配置 Linux kernel2-7 客製化 kernel 選單、Kconfig,並新增選單項目chapter 3 從原始碼建置 6.x Linux 核心 -第二部分3-1 技術要求3-2 步驟4:編譯 kernel 映像檔和模組3-3 步驟5:安裝核心模組3-4 步驟6:產生 initramfs 映像和bootloader 設定3-5 了解 initramfs 框架3-6 步驟7:自訂 GRUB 開機載入程式3-7 驗證新核心的設定3-8 為 Raspberry Pi 編譯核心3-9 核心編譯的雜項技巧chapter 4 編寫第一個核心模組 -第一部分4-1 技術要求4-2 了解核心架構 - 第一部分4-3 探索 LKM4-4 編寫第一個核心模組4-5 核心模組的常見操作4-6 了解核心日誌記錄和 printk4-7 了解核心模組 Makefile 的基本知識chapter 5 編寫第一個核心模組 -第二部分5-1 技術要求5-2 給你的核心模組「更好的」Makefile 範本5-3 跨平台編譯核心模組5-4 蒐集最少的系統資訊5-5 Kernel 模組的授權5-6 模擬 kernel 模組的「類似函式庫」功能5-7 將參數傳遞給 kernel 模組5-8 kernel 中不允許使用浮點數5-9 在系統開機時自動載入模組5-10 kernel 模組和資訊安全 - 概述5-11 Kernel 開發者的程式碼風格指南5-12 為 mainline kernel 做出貢獻chapter 6 Kernel 內部基礎 -行程和執行緒6-1 技術要求6-2 了解行程和 interrupt context6-3 了解行程虛擬位址空間的基礎知識6-4 組織行程、執行緒及其堆疊 - 使用者空間和 kernel 空間6-5 了解和存取 kernel task 結構6-6 透過「current」使用 task 結構6-7 遍歷 kernel 的 task 串列chapter 7 記憶體管理內部 -要素7-1 技術要求7-2 了解 VM 拆分7-3 檢查行程 VAS7-4 檢查 kernel VAS7-5 隨機化記憶體布局 - KASLR7-6 了解實體記憶體組成chapter 8 模組作者的核心記憶體分配 -第一部分8-1 技術要求8-2 kernel 記憶體配置器簡介8-3 了解和使用 kernel 分頁配置器(或 BSA)8-4 了解和使用 Kernel Slab 配置器8-5 kmalloc API 的大小限制8-6 Slab 配置器 - 一些補充細節8-7 使用 slab 配置器的注意事項chapter 9 模組作者的核心記憶體分配 -第二部分9-1 技術要求9-2 建立自訂 slab 快取9-3 快速說明 kernel 記憶體問題除錯9-4 了解與使用 kernel 的 vmalloc() API9-5 Kernel 中的記憶體配置 - 何時使用哪個 API?9-6 記憶體回收:kernel 的重要家務工作9-7 生存之道:OOM 終結者chapter 10 CPU 排程器 -第一部分10-1 技術要求10-2 學習 CPU 排程內部機制 - 第一部分:基礎背景10-3 視覺化流程(Visualizing the flow)10-4 學習 CPU 排程內部機制 - 第二部分10-5 查詢指定執行緒的排程政策與優先權10-6 學習 CPU 排程內部機制 - 第三部分chapter 11 CPU 排程器 -第二部分11-1 技術要求11-2 理解、查詢與設定 CPU 親和性遮罩(affinity mask)11-3 查詢與設定執行緒的排程政策與優先權11-4 cgroups 簡介11-5 讓 Linux 成為 RTOS:簡介11-6 與排程相關的其他主題chapter 12 核心同步 -第一部分12-1 技術要求12-2 臨界區間、互斥執行與原子性12-3 Linux kernel 中的平行性問題12-4 互斥鎖或自旋鎖?何時使用何種鎖12-5 使用互斥鎖12-6 使用 spinlock12-7 上鎖與中斷12-8 上鎖:常見錯誤和指導原則12-9 解答chapter 13 核心同步 -第二部分13-1 技術要求13-2 使用 atomic_t 與 refcount_t 介面13-3 使用 RMW atomic 運算子13-4 使用讀寫者自旋鎖13-5 了解 CPU 快取基礎、快取效應和假共享13-6 使用 per-CPU 和 RCU 達成 Lock-free 程式設計13-7 Kernel 內的 Lock 除錯13-8 記憶體屏障簡介索引
本書範例程式,請見書內說明線上下載
Linux核心除錯實務 駭客的Linux基礎入門必修課(第二版) Linux隨身指南:必備指令 第四版
購買紙本書