奔跑吧Linux內(nèi)核(第2版)卷2:調(diào)試與案例分析
定 價:109.9 元
- 作者:笨叔
- 出版時間:2021/3/1
- ISBN:9787115552525
- 出 版 社:人民郵電出版社
- 中圖法分類:TP316.85
- 頁碼:360
- 紙張:
- 版次:02
- 開本:16開
本書基于Linux 5.0內(nèi)核的源代碼講述Linux內(nèi)核的調(diào)試技巧和案例。本書共6章。主要內(nèi)容包括并發(fā)與同步,中斷管理,內(nèi)核調(diào)試和性能優(yōu)化,基于x86_64的宕機難題解決方案,基于ARM64的宕機題解決方案,安全漏洞的產(chǎn)生原理與修復(fù)方案等。
本書適合從事Linux系統(tǒng)開發(fā)人員、嵌入式系統(tǒng)開發(fā)人員及Android開發(fā)人員閱讀,也可供計算機相關(guān)專業(yè)的師生閱讀。
1.基于Linux 5.0內(nèi)核和ARM64/x86_64架構(gòu),全面修訂;
2.新增實戰(zhàn)案例分析,幫助讀者提升實戰(zhàn)能力;
3.新增了內(nèi)核調(diào)試和優(yōu)化技巧,通過分析宕機案例和安全漏洞,總結(jié)調(diào)試技巧;
4.新增了ARM64架構(gòu)等方面的內(nèi)容;
5.新增了大量插圖和表格。
相對于Linux 4.0內(nèi)核,Linux 5.0內(nèi)核中加入了很多新特性,并且很多內(nèi)核的實現(xiàn)已經(jīng)發(fā)生了很大變化。本書旨在介紹Linux內(nèi)核中核心模塊的實現(xiàn),主要內(nèi)容包括ARM64架構(gòu),ARM64在Linux內(nèi)核中的實現(xiàn),內(nèi)存管理的理論知識和案例,以及進(jìn)程管理的基礎(chǔ)知識與案例等。
本書特色:
·基于Linux 5.0內(nèi)核的源代碼進(jìn)行案例分析;
·新增了ARM64架構(gòu)等方面的內(nèi)容。
·涵蓋實戰(zhàn)案例,可操作性強。
笨叔,Linux內(nèi)核愛好者,出版過《奔跑吧Linux內(nèi)核》《奔跑吧 Linux內(nèi)核 入門篇》。創(chuàng)建了奔跑吧Linux社區(qū)。
目 錄
第 1章 并發(fā)與同步 1
1.1 原子操作 3
1.1.1 原子操作 3
1.1.2 atomic_add()函數(shù)分析 6
1.1.3 比較并交換指令 7
1.2 內(nèi)存屏障 11
1.2.1 經(jīng)典內(nèi)存屏障接口函數(shù) 11
1.2.2 內(nèi)存屏障擴展接口函數(shù) 13
1.3 經(jīng)典自旋鎖 14
1.3.1 自旋鎖的實現(xiàn) 15
1.3.2 自旋鎖的變體 18
1.3.3 spin_lock()和raw_spin_lock()
函數(shù) 19
1.4 MCS鎖 20
1.4.1 快速申請通道 21
1.4.2 中速申請通道 22
1.4.3 慢速申請通道 23
1.4.4 釋放鎖 26
1.5 排隊自旋鎖 27
1.5.1 快速申請通道 29
1.5.2 中速申請通道 30
1.5.3 慢速申請通道 32
1.5.4 釋放鎖 36
1.5.5 案例分析:為什么這里
pending域要清零 36
1.5.6 小結(jié) 38
1.6 信號量 39
1.6.1 信號量簡介 39
1.6.2 小結(jié) 43
1.7 互斥鎖 43
1.7.1 mutex數(shù)據(jù)結(jié)構(gòu) 43
1.7.2 互斥鎖的快速通道 44
1.7.3 互斥鎖的慢速通道 46
1.7.4 樂觀自旋等待機制 47
1.7.5 mutex_unlock()函數(shù)分析 50
1.7.6 案例分析 51
1.7.7 小結(jié) 52
1.8 讀寫鎖 52
1.9 讀寫信號量 53
1.9.1 rw_semaphore數(shù)據(jù)結(jié)構(gòu) 53
1.9.2 申請讀者類型信號量 55
1.9.3 釋放讀者類型信號量 58
1.9.4 申請寫者類型信號量 58
1.9.5 釋放寫者類型信號量 64
1.9.6 小結(jié) 64
1.10 RCU 64
1.10.1 關(guān)于RCU的一個簡單例子 65
1.10.2 經(jīng)典RCU和Tree RCU 68
1.11 案例分析:內(nèi)存管理中的鎖 69
1.11.1 mm->mmap_sem 70
1.11.2 mm->page_table_lock 71
1.11.3 PG_Locked 72
1.11.4 anon_vma->rwsem 72
1.11.5 zone->lru_lock 74
1.11.6 RCU 75
1.11.7 RCU停滯檢測 78
第 2章 中斷管理 81
2.1 中斷控制器 82
2.1.1 中斷狀態(tài)和中斷觸發(fā)方式 82
2.1.2 ARM GIC-V2中斷控制器 83
2.1.3 關(guān)于ARM Vexpress V2P
開發(fā)板的例子 85
2.1.4 關(guān)于QEMU虛擬機平臺的
例子 86
2.2 硬件中斷號和Linux中斷號的映射 87
2.3 注冊中斷 98
2.4 ARM64底層中斷處理 105
2.4.1 異常向量表 105
2.4.2 IRQ處理 107
2.4.3 ? 108
2.4.4 保存中斷上下文 110
2.4.5 恢復(fù)中斷上下文 112
2.5 高層中斷處理 114
2.5.1 匯編跳轉(zhuǎn) 114
2.5.2 handle_arch_irq處理 115
2.5.3 小結(jié) 123
2.6 軟中斷和tasklet 125
2.6.1 軟中斷 125
2.6.2 tasklet 129
2.6.3 local_bh_disable()和
local_bh_enable()函數(shù)分析 134
2.6.4 小結(jié) 135
2.7 工作隊列 136
2.7.1 工作隊列的相關(guān)數(shù)據(jù)結(jié)構(gòu) 137
2.7.2 工作隊列初始化 141
2.7.3 創(chuàng)建工作隊列 143
2.7.4 添加和調(diào)度一個work 149
2.7.5 處理一個work 153
2.7.6 取消一個work 157
2.7.7 和調(diào)度器的交互 159
2.7.8 小結(jié) 161
第3章 內(nèi)核調(diào)試與性能優(yōu)化 164
3.1 打造ARM64實驗平臺 165
3.1.1 使用O0優(yōu)化等級編譯
內(nèi)核 165
3.1.2 QEMU虛擬機+Debian
實驗平臺 166
3.1.3 單步調(diào)試ARM64 Linux
內(nèi)核 171
3.1.4 以圖形化方式單步調(diào)試
內(nèi)核 172
3.1.5 單步調(diào)試head.S文件 176
3.2 ftrace 181
3.2.1 irqs跟蹤器 182
3.2.2 function跟蹤器 184
3.2.3 動態(tài)ftrace 185
3.2.4 事件跟蹤 186
3.2.5 添加跟蹤點 188
3.2.6 trace-cmd和kernelshark 191
3.2.7 跟蹤標(biāo)記 192
3.2.8 小結(jié) 195
3.3 內(nèi)存檢測 196
3.3.1 slub_debug 197
3.3.2 KASAN內(nèi)存檢測 202
3.4 死鎖檢測 204
3.5 內(nèi)核調(diào)試方法 210
3.5.1 printk 210
3.5.2 動態(tài)輸出 212
3.5.3 oops分析 213
3.5.4 BUG_ON()和WARN_ON()宏
分析 217
3.6 使用perf優(yōu)化性能 217
3.6.1 安裝perf工具 218
3.6.2 perf list命令 218
3.6.3 perf record/report命令 219
3.6.4 perf stat命令 220
3.6.5 perf top命令 221
3.7 SystemTap 222
3.8 eBPF和BCC 224
3.8.1 BCC工具集 224
3.8.2 編寫B(tài)CC腳本 225
第4章 基于x86_64解決宕機難題 229
4.1 Kdump和Crash工具 230
4.2 x86_64架構(gòu)基礎(chǔ)知識 230
4.2.1 通用寄存器 230
4.2.2 函數(shù)參數(shù)調(diào)用規(guī)則 231
4.2.3 棧的結(jié)構(gòu) 232
4.2.4 尋址方式 232
4.3 在CentOS 7.6中安裝和配置Kdump
和Crash 233
4.4 crash命令 235
4.5 案例1:一個簡單的宕機案例 244
4.6 案例2:訪問被刪除的鏈表 250
4.7 案例3:一個真實的驅(qū)動崩潰案例 254
4.8 死鎖檢查機制 259
4.9 案例4:一個簡單的死鎖案例 261
4.10 案例5:分析和推導(dǎo)參數(shù)的值
變量 263
4.11 案例6:一個復(fù)雜的宕機案例 270
4.11.1 問題描述 271
4.11.2 分析ps進(jìn)程 276
4.11.3 分析test進(jìn)程 281
4.11.4 計算一個進(jìn)程被阻塞了多長
時間 283
第5章 基于ARM64解決宕機難題 285
5.1 搭建Kdump實驗環(huán)境 285
5.2 案例1:一個簡單的宕機案例 287
5.3 案例2:恢復(fù)函數(shù)調(diào)用棧 288
5.4 案例3:分析和推導(dǎo)參數(shù)的值 291
5.5 案例4:一個復(fù)雜的宕機案例 294
5.5.1 分析ps進(jìn)程 296
5.5.2 分析test進(jìn)程 299
第6章 安全漏洞分析 303
6.1 側(cè)信道攻擊 303
6.2 CPU熔斷漏洞分析 306
6.2.1 亂序執(zhí)行、異常處理和地址
空間 306
6.2.2 修復(fù)方案:KPTI技術(shù) 307
6.3 CPU“幽靈”漏洞 317
6.3.1 分支預(yù)測 317
6.3.2 攻擊原理 320
6.3.3 修復(fù)方案 321
附錄A 使用DS-5調(diào)試ARM64 Linux
內(nèi)核 325
附錄B ARM64中的獨占訪問指令 341
附錄C 圖解MESI狀態(tài)轉(zhuǎn)換 345
附錄D 高速緩存與內(nèi)存屏障 350