這是一本基于龍芯平臺,結合Linux-5.4.x 版本的內核源代碼來解析Linux 內核的書籍。本書首先介紹了有關龍芯處理器和Linux 內核的基礎知識,然后重點講解了內核啟動、異常與中斷、內存管理、進程管理、顯卡驅動、網卡驅動和電源管理這7 大板塊的內容。本書甚少涉及代碼的細枝末節(jié),而是重點關注代碼實現(xiàn)的主干流程,并且創(chuàng)造性地引入了樹形視圖和鏈式視圖這兩種比流程圖更好用的代碼解析方法。
本書適合Linux 系統(tǒng)相關的開發(fā)人員,特別是基于龍芯處理器做內核開發(fā)的技術人員學習參考。
Linux內核中龍芯3號的Maintainer十年磨一劍
基于MIPS/龍芯架構的Linux-5.x版本內核
立足龍芯而包羅萬象
創(chuàng)造性地使用“樹形視圖”和“鏈式視圖”來解析源代碼
胡偉武/龍芯中科技術有限公司董事長
金海/CCF副理事長,華中科技大學教授
作序推薦
陳華才
博士,高級工程師,F(xiàn)任江蘇航天龍夢信息技術有限公司副總工程師,負責龍芯3號處理器的內核開發(fā)。作為Linux內核中MIPS/ 龍芯3 號的Maintainer,向Linux 內核官方提交了大量的代碼。陳華才畢業(yè)于華中科技大學計算機學院,攻讀博士學位期間,先后在中國電力科學院、英特爾開源技術中心實習,參與高可靠冗余系統(tǒng)、Xen 虛擬機監(jiān)控器和Linux 內核的研發(fā)。2012年進入中國科學院計算技術研究所博士后流動站,同時被派往江蘇夢蘭集團企業(yè)博士后工作站從事博士后研究工作,其間獲得“江蘇省科技創(chuàng)新團隊”和“常熟市科技創(chuàng)新創(chuàng)業(yè)領軍人才”等人才計劃資助。
第01 章 基礎知識
1.1 龍芯處理器簡介 002
1.1.1 龍芯3 號功能特征 004
1.1.2 龍芯3 號處理器核 008
1.1.3 龍芯電腦基本結構 015
1.2 Linux 內核簡介 018
1.2.1 Linux 內核發(fā)展簡史 019
1.2.2 Linux 內核的開發(fā)模式 021
1.2.3 關于長期維護穩(wěn)定版 025
1.2.4 龍芯的內核版本選型 025
1.3 如何高效閱讀代碼 027
1.3.1 找準入口點 028
1.3.2 理清主脈絡 029
1.3.3 顧名思義看功能 040
1.3.4 理解補丁文件 042
1.4 如何開發(fā)健壯內核 045
1.4.1 內核代碼風格 046
1.4.2 合理生成補丁 048
1.4.3 謹慎對待創(chuàng)新 049
第02 章 內核啟動解析
2.1 內核源代碼目錄結構 054
2.2 內核啟動過程:主核視角 055
2.2.1 第一入口:kernel_entry 056
2.2.2 第二入口:start_kernel() 063
2.2.3 重要函數:setup_arch() 070
2.2.4 重要函數:trap_init() 083
2.2.5 重要函數:init_IRQ() 087
2.2.6 重要函數:time_init() 092
2.2.7 1 號進程:kernel_init() 096
2.3 內核啟動過程:輔核視角 104
2.3.1 第一入口:smp_bootstrap 105
2.3.2 第二入口:start_secondary() 107
2.4 本章小結 110
第03 章 異常與中斷解析
3.1 寄存器操作 113
3.2 異常處理解析 114
3.2.1 復位異常和NMI 115
3.2.2 緩存錯誤異常 116
3.2.3 TLB/XTLB 異常 117
3.2.4 其他通用異常 126
3.3 中斷處理解析 137
3.3.1 中斷處理的入口 137
3.3.2 中斷處理的分派 140
3.4 軟中斷、小任務與工作隊列 151
3.4.1 軟中斷softirq 151
3.4.2 小任務tasklet 154
3.4.3 工作隊列workqueue 156
3.5 本章小結 159
第04 章 內存管理解析
4.1 內存管理相關概念 161
4.1.1 龍芯3 號的高速緩存 161
4.1.2 龍芯3 號的TLB 168
4.1.3 龍芯的虛擬地址空間 170
4.2 物理內存頁幀管理 171
4.2.1 物理地址空間 177
4.2.2 伙伴系統(tǒng)算法 183
4.3 內核內存對象管理 201
4.3.1 數據結構與API 202
4.3.2 核心函數解析 209
4.4 分頁映射內存管理 217
4.4.1 持久內核映射 221
4.4.2 臨時內核映射 226
4.4.3 非連續(xù)內存管理 229
4.5 進程地址空間管理 241
4.5.1 數據結構與API 241
4.5.2 內存映射 250
4.5.3 堆區(qū)管理 257
4.5.4 缺頁異常處理 258
4.6 內存管理其他話題 266
4.6.1 反向映射 267
4.6.2 內存回收 271
4.6.3 巨頁機制 274
4.7 本章小結 275
第05 章 進程管理解析
5.1 進程描述符 278
5.1.1 運行狀態(tài)相關 285
5.1.2 標識調度相關 289
5.1.3 其他重要部分 295
5.2 進程創(chuàng)建 296
5.2.1 復制新進程 296
5.2.2 執(zhí)行新程序 308
5.3 進程銷毀 314
5.3.1 退出程序執(zhí)行 314
5.3.2 清理進程資源 317
5.4 進程調度 327
5.4.1 基本概念 328
5.4.2 發(fā)展歷史 330
5.4.3 公平調度策略 334
5.4.4 調度核心解析 347
5.4.5 進程切換解析 360
5.5 其他話題 364
5.5.1 CPU 負載 364
5.5.2 調度域與調度組 370
5.5.3 NUMA 均衡調度 374
5.6 本章小結 380
第06 章 顯卡驅動解析
6.1 顯卡概述 382
6.1.1 發(fā)展簡史及有關概念 382
6.1.2 現(xiàn)代顯卡的硬件結構 385
6.2 Linux 圖形系統(tǒng)架構 388
6.2.1 X-Window 和Wayland 388
6.2.2 直接渲染、間接渲染和顯卡驅動 391
6.3 Linux 內核顯卡驅動 392
6.3.1 寄存器讀寫 393
6.3.2 常用數據結構 394
6.3.3 顯卡初始化 411
6.3.4 命令流處理 435
6.3.5 存儲區(qū)域間數據交換 439
6.3.6 GPU 重置(Reset) 443
6.4 本章小結 446
第07 章 網卡驅動解析
7.1 網絡子系統(tǒng)概述 448
7.2 Linux 以太網卡驅動 449
7.2.1 常用數據結構 449
7.2.2 網卡初始化 452
7.2.3 網卡的開與關 456
7.2.4 數據發(fā)送與接收 457
7.2.5 故障檢測與修復(看門狗) 466
7.3 本章小結 468
第08 章 電源管理解析
8.1 電源管理概述 470
8.2 運行時電源管理 473
8.2.1 動態(tài)變頻 474
8.2.2 自動調核 488
8.3 系統(tǒng)級睡眠管理 507
8.3.1 睡眠到內存(待機) 509
8.3.2 睡眠到磁盤(休眠) 520
8.4 本章小結 527
附錄A 并發(fā)與同步原語
A.1 內存屏障 529
A.2 每CPU 變量 533
A.3 原子操作 535
A.4 開關搶占 539
A.5 自旋鎖 540
A.6 順序鎖 544
A.7 信號量 546
A.8 互斥量 548
A.9 RCU 機制 549
A.10 其他原語 556
附錄B Linux 內核大事記
B.1 史前時代 560
B.2 奇偶時代 560
B.3 快速演進時代 562
B.4 極速演進時代 564
后記
參考文獻