《Linux內核模塊開發(fā)技術指南》旨在幫助讀者快速理解Linux內核,并掌握內核模塊開發(fā)及性能調優(yōu)的能力。
本書以Linux 5.10版本內核為藍本,通過對內核工作原理的闡釋與諸多核心模塊的動手實現(xiàn),詳細介紹了內核模塊相關基礎、并發(fā)與互斥、系統(tǒng)調用、內核監(jiān)控與調試、字符和塊設備驅動、外部中斷、塊I/O調度、文件系統(tǒng)、進程調度、網絡數據包過濾、安全模塊等內容。
本書不僅適合初學者學習Linux內核開發(fā)的基礎知識,也適合有一定基礎的開發(fā)者深入學習高級主題和前沿技術。
第1章 第一個內核模塊Hello,Linux Kernel 001
1.1 內核模塊的程序構成 001
1.1.1 最簡單的內核模塊 002
1.1.2 許可證協(xié)議 004
1.1.3 模塊參數 004
1.1.4 模塊導出符號 006
1.1.5 模塊作者 007
1.1.6 描述信息 008
1.2 打印級別 008
1.3 再談Hello,Linux Kenel 009
1.4 常用數據結構 011
1.4.1 鏈表 011
1.4.2 哈希鏈表 011
1.4.3 紅黑樹 012
1.4.4 XArray 013
第2章 proc文件 018
2.1 創(chuàng)建proc文件 018
2.2 文件讀寫 022
2.2.1 數據傳遞接口 022
2.2.2 實現(xiàn)數據讀寫 022
2.3 創(chuàng)建目錄 024
2.4 通過偏移量讀寫文件 025
2.5 打開的文件 027
2.6 移動讀寫位置 029
2.7 目錄項和文件節(jié)點 032
2.8 I/O控制操作 039
2.9 小結 042
第3章 內核模塊開發(fā)基礎 043
3.1 內核補丁 043
3.1.1 補丁頭 043
3.1.2 補丁塊 044
3.1.3 創(chuàng)建補丁文件 044
3.1.4 安裝補丁文件 045
3.1.5 撤銷補丁文件 046
3.2 常用的內存分配和釋放接口 046
3.2.1 kmalloc和kfree 047
3.2.2 vmalloc和vfree 048
3.2.3 分配連續(xù)的內存頁 048
3.2.4 kmem_cache系列函數 048
3.2.5 物理地址和虛擬地址 050
3.2.6 幾種內存分配接口的關系 053
3.3 內存映射 054
3.3.1 mmap系統(tǒng)調用 055
3.3.2 proc文件的mmap操作 056
3.4 獲取未映射內存區(qū)域 059
3.5 散布讀 060
3.6 內核線程 064
3.6.1 進程的狀態(tài) 064
3.6.2 創(chuàng)建內核線程 067
3.6.3 二號進程 069
3.7 工作隊列 070
3.8 等待隊列 071
3.9 實現(xiàn)wait_event和wake_up 078
3.10 多路復用 082
3.10.1 select系統(tǒng)調用 082
3.10.2 proc文件的poll操作 084
3.11 定時器 086
3.11.1 毫秒級定時器 086
3.11.2 高精度定時器 089
3.12 延時任務 093
第4章 并發(fā)與互斥 095
4.1 信號量 096
4.2 互斥體 098
4.3 完成量 099
4.4 原子操作 102
4.4.1 整型原子操作 103
4.4.2 位原子操作 105
4.5 自旋鎖 105
4.6 讀寫鎖 108
4.7 RCU 111
4.7.1 原理 111
4.7.2 接口及示例 112
4.8 PER_CPU 114
4.8.1 原理 114
4.8.2 相關接口 115
4.8.3 示例程序 116
4.9 死鎖檢測 117
第5章 系統(tǒng)調用 120
5.1 執(zhí)行系統(tǒng)調用 120
5.1.1 系統(tǒng)調用的執(zhí)行過程 120
5.1.2 系統(tǒng)調用的三種執(zhí)行方式 121
5.2 C與匯編 123
5.2.1 C語言和匯編語言函數的參數傳遞 123
5.2.2 內聯(lián)匯編 127
5.3 增加系統(tǒng)調用 132
5.4 Linux系統(tǒng)調用的實現(xiàn)方式 136
5.5 通過軟件中斷實現(xiàn)系統(tǒng)調用 138
5.5.1 通過0x80軟件中斷執(zhí)行系統(tǒng)調用 138
5.5.2 自己動手實現(xiàn)系統(tǒng)調用 140
第6章 監(jiān)控與調試 141
6.1 kprobe 141
6.1.1 結構體和相關接口 141
6.1.2 示例程序 142
6.2 kretprobe 145
6.2.1 結構體和相關接口 146
6.2.2 示例程序 147
6.3 uprobe 149
6.3.1 結構體和相關接口 149
6.3.2 示例程序 151
6.4 perf 154
6.5 bpftrace 160
6.6 kdump 163
6.6.1 產生vmcore文件 163
6.6.2 查看vmcore文件 163
6.6.3 crash工具 164
6.6.4 crash分析示例 167
6.7 kgdb 170
第7章 字符設備驅動 175
7.1 最簡單的字符設備驅動 175
7.1.1 相關接口 175
7.1.2 示例程序 178
7.2 通過字符設備驅動訪問串口 181
7.2.1 串行通信 181
7.2.2 相關寄存器 181
7.2.3 串口接收/發(fā)送配置 183
7.2.4 示例程序 183
7.3 通過ioctl操作配置串口參數 188
7.3.1 相關寄存器 188
7.3.2 示例程序 188
第8章 外部中斷 191
8.1 基本概念 191
8.2 通過中斷讀取串口數據 192
8.2.1 相關寄存器 192
8.2.2 相關接口 193
8.2.3 示例程序 194
8.3 中斷底半部 197
8.3.1 工作隊列 197
8.3.2 tasklet 198
8.3.3 軟中斷 200
8.4 常用接口 203
第9章 文件操作 206
9.1 虛擬文件系統(tǒng)(VFS) 206
9.1.1 read系統(tǒng)調用的執(zhí)行過程 207
9.1.2 VFS管理的對象 208
9.2 write_iter操作 208
9.3 flush操作 211
9.4 flock操作 215
9.5 lock操作 218
9.6 splice_read和splice_write 221
9.6.1 splice系統(tǒng)調用 221
9.6.2 相關結構體和接口 222
9.6.3 示例程序 227
9.7 copy_file_range操作 229
9.7.1 copy_file_range系統(tǒng)調用 229
9.7.2 示例程序 230
9.7.3 remap_file_range 233
第10章 塊設備驅動 235
10.1 塊設備 235
10.2 相關概念 236
10.2.1 通用磁盤結構體gendisk 236
10.2.2 塊設備對象block_device 239
10.2.3 I/O處理基本單元bio 240
10.3 第一個塊設備驅動 244
10.4 塊I/O請求隊列 247
10.4.1 塊I/O請求 247
10.4.2 請求隊列 249
10.4.3 相關接口 251
10.5 在塊設備驅動中使用請求隊列 254
第11章 塊I/O調度 257
11.1 塊I/O調度流程 257
11.2 塊I/O調度相關結構體 258
11.3 寫一個塊I/O調度器 265
11.4 Mq-Deadline調度器 269
第12章 文件系統(tǒng) 271
12.1 注冊文件系統(tǒng) 271
12.1.1 超級塊 271
12.1.2 相關接口 273
12.1.3 示例程序 273
12.2 創(chuàng)建超級塊 275
12.3 創(chuàng)建根目錄 278
12.4 本級目錄和上級目錄 281
12.5 增加一個文件 285
12.6 增加文件的讀寫操作 288
12.7 動態(tài)創(chuàng)建文件 289
12.8 文件的刪除操作 294
12.9 寫一個磁盤文件系統(tǒng) 295
12.9.1 磁盤文件系統(tǒng) 295
12.9.2 注冊并創(chuàng)建超級塊 297
12.9.3 目錄下文件的遍歷 304
12.9.4 在根目錄下創(chuàng)建文件 308
12.9.5 讀取文件數據 310
12.9.6 向文件寫入數據 313
第13章 文件數據的管理 319
13.1 地址空間 319
13.1.1 數據結構 319
13.1.2 地址空間操作函數 320
13.1.3 文件數據的緩存 323
13.2 在文件系統(tǒng)中使用地址空間 324
13.2.1 相關接口 324
13.2.2 示例程序 327
13.3 小結 332
第14章 進程調度 333
14.1 基本概念 333
14.1.1 進程調度器 333
14.1.2 調度實體 338
14.1.3 調度域 338
14.1.4 進程控制塊 341
14.1.5 運行隊列 344
14.1.6 進程調度流程 346
14.2 動手實現(xiàn)進程調度器 347
14.3 公平調度器分析 353
14.3.1 權重和虛擬運行時間 353
14.3.2 負載的計算 355
14.3.3 進程的遷移 357
14.3.4 為新進程/被喚醒進程選擇合適的CPU 360
第15章 網絡數據包過濾 362
15.1 Netfilter原理 362
15.2 實現(xiàn)最簡單的Netfilter模塊 363
15.3 sk_buff 369
15.3.1 結構體介紹 369
15.3.2 常用接口 373
15.3.3 示例程序 377
15.4 IP數據處理的五條鏈 384
15.4.1 PREROUTING鏈 384
15.4.2 INPUT鏈 385
15.4.3 FORWARD鏈 386
15.4.4 OUTPUT鏈 386
15.4.5 POSTROUTING鏈 387
15.5 連接跟蹤機制 387
15.6 NF Queue 391
15.6.1 將數據包傳遞給應用程序 391
15.6.2 創(chuàng)建并監(jiān)聽NF Queue套接字 392
15.6.3 示例程序 400
15.7 Iptables 412
15.8 ARP數據包過濾 412
第16章 Linux安全模塊 415
16.1 LSM的實現(xiàn)原理 415
16.2 編寫一個簡單的LSM模塊 417
16.2.1 打內核補丁 417
16.2.2 編寫LSM模塊 419
16.2.3 控制目錄的創(chuàng)建 422
16.3 理解LSM框架 425
16.4 目錄訪問控制 427
16.5 inode節(jié)點訪問控制 430
16.6 文件訪問控制 432
16.7 小結 434