奔跑吧 Linux 內核 (捲2):調試與案例分析, 2/e

笨叔

  • 奔跑吧 Linux 內核 (捲2):調試與案例分析, 2/e-preview-1
  • 奔跑吧 Linux 內核 (捲2):調試與案例分析, 2/e-preview-2
奔跑吧 Linux 內核 (捲2):調試與案例分析, 2/e-preview-1

買這商品的人也買了...

商品描述

本書基於Linux 5.0內核的源代碼講述Linux內核的調試技巧和案例。本書共6章。主要內容包括並發與同步,中斷管理,內核調試和性能優化,基於x86_64的宕機難題解決方案,基於ARM64的宕機題解決方案,安全漏洞的產生原理與修復方案等。

本書適合從事Linux系統開發人員、嵌入式系統開發人員及Android開發人員閱讀,也可供電腦相關專業的師生閱讀。

作者簡介

笨叔,Linux內核愛好者,出版過《奔跑吧Linux內核》《奔跑吧Linux內核入門篇》。
創建了奔跑吧Linux社區。

目錄大綱

目錄

第1章並發與同步1
1.1原子操作3
1.1.1原子操作3
1.1.2 atomic_add()函數分析6
1.1.3比較並交換指令7
1.2內存屏障11
1 .2.1經典內存屏障接口函數11
1.2.2內存屏障擴展接口函數13
1.3經典自旋鎖14
1.3.1自旋鎖的實現15
1.3.2自旋鎖的變體18
1.3.3 spin_lock()和raw_spin_lock()函數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小結38
1.6信號量39
1.6.1信號量簡介39
1.6.2小結43
1.7互斥鎖43
1.7.1 mutex數據結構43
1.7.2互斥鎖的快速通道44
1.7.3互斥鎖的慢速通道46
1. 7.4樂觀自旋等待機制47
1.7.5 mutex_unlock()函數分析50
1.7.6案例分析51
1.7.7小結52
1.8讀寫鎖52
1.9讀寫信號量53
1.9.1 rw_semaphore數據結構53
1.9.2申請讀者類型信號量55
1.9.3釋放讀者類型信號量58
1.9.4申請寫者類型信號量58
1.9.5釋放寫者類型信號量64
1.9.6小結64
1.10 RCU 64
1.10.1關於RCU的一個簡單例子65
1.10.2經典RCU和Tree RCU 68
1.11案例分析:內存管理中的鎖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中斷狀態和中斷觸發方式82
2.1.2 ARM GIC-V2中斷控制器83
2.1.3關於ARM Vexpress V2P開發板的例子85
2.1.4關於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恢復中斷上下文112
2.5高層中斷處理114
2.5.1彙編跳轉114
2.5.2 handle_arch_irq處理115
2.5.3小結123
2.6軟中斷和tasklet 125
2.6.1軟中斷125
2. 6.2 tasklet 129
2.6.3 local_bh_disable()和local_bh_enable()函數分析134
2.6.4小結135
2.7工作隊列136
2.7.1工作隊列的相關數據結構137
2.7.2工作隊列初始化141
2.7.3創建工作隊列143
2.7.4添加和調度一個work 149
2.7.5處理一個work 153
2.7.6取消一個work 157
2.7.7和調度器的交互159
2.7.8小結161

第3章內核調試與性能優化164
3 .1打造ARM64實驗平台165
3.1.1使用O0優化等級編譯內核165
3.1.2 QEMU虛擬機+Debian實驗平台166
3.1.3單步調試ARM64 Linux內核171
3.1.4以圖形化方式單步調試內核172
3.1.5單步調試head.S文件176
3.2 ftrace 181
3.2.1 irqs跟踪器182
3.2.2 function跟踪器184
3.2.3動態ftrace 185
3.2.4事件跟踪186
3.2.5添加跟踪點188
3.2.6 trace-cmd和kernelshark 191
3.2.7跟踪標記192
3.2.8小結195
3.3內存檢測196
3.3.1 slub_debug 197
3.3.2 KASAN內存檢測202
3. 4死鎖檢測204
3.5內核調試方法210
3.5.1 printk 210
3.5.2動態輸出212
3.5.3 oops分析213
3.5.4 BUG_ON()和WARN_ON()宏分析217
3.6使用perf優化性能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編寫BCC腳本225

第4章基於x86_64解決宕機難題229
4.1 Kdump和Crash工具230
4.2 x86_64架構基礎知識230
4.2.1通用寄存器230
4.2.2函數參數調用規則231
4.2.3棧的結構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:一個真實的驅動崩潰案例254
4.8死鎖檢查機制259
4.9案例4:一個簡單的死鎖案例261
4.10案例5:分析和推導參數的值變量263
4.11案例6:一個複雜的宕機案例270
4.11.1問題描述271
4.11.2分析ps進程276
4.11.3分析test進程281
4.11.4計算一個進程被阻塞了多長時間283

第5章基於ARM64解決宕機難題285
5.1搭建Kdump實驗環境285
5.2案例1:一個簡單的宕機案例287
5.3案例2:恢復函數調用棧288
5.4案例3:分析和推導參數的值291
5.5案例4:一個複雜的宕機案例294
5.5.1分析ps進程296
5.5.2分析test進程299

第6章安全漏洞分析303
6.1側信道攻擊303
6.2 CPU熔斷漏洞分析306
6.2.1亂序執行、異常處理和地址空間306
6.2.2修復方案:KPTI技術307
6.3 CPU“幽靈”漏洞317
6.3.1分支預測317
6.3.2攻擊原理320
6.3.3修復方案321

附錄A使用DS-5調試ARM64 Linux內核325
附錄B ARM64中的獨占訪問指令341
附錄C圖解MESI狀態轉換345
附錄D高速緩存與內存屏障350