3dwoo大學簡體電腦書店
奔跑吧Linux內核入門篇(第2版)
( 簡體 字)
作者:笨叔 陳悅類別:1. -> 作業系統 -> Linux
出版社:人民郵電出版社奔跑吧Linux內核入門篇(第2版) 3dWoo書號: 54201
詢問書籍請說出此書號!
有庫存
NT售價: 645
出版日:2/1/2021
頁數:360
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787115555601 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第1章 Linux系統基礎知識 1
1.1 Linux系統的發展歷史 1
1.2 Linux發行版 2
1.2.1 Red Hat Linux 2
1.2.2 Debian Linux 3
1.2.3 SuSE Linux 4
1.2.4 優麒麟Linux 4
1.3 Linux內核介紹 5
1.3.1 Linux內核目錄結構 5
1.3.2 宏內核和微內核 7
1.3.3 Linux內核概貌 8
1.4 如何學習Linux內核 11
1.5 Linux內核實驗入門 12
1.5.1 實驗1-1:在虛擬機中安裝
 優麒麟Linux 20.04系統 12
1.5.2 實驗1-2:給優麒麟Linux
 系統更換“心臟” 15
1.5.3 實驗1-3:使用QEMU虛擬機
 來運行Linux系統 17
1.5.4 實驗1-4:創建基于Ubuntu
 Linux的根文件系統 22
1.5.5 實驗1-5:創建基于QEMU +
 RISC-V的Linux系統 22
第2章 Linux內核基礎知識 24
2.1 Linux常用的編譯工具 24
2.1.1 GCC 24
2.1.2 ARM GCC 25
2.1.3 GCC編譯 26
2.2 Linux內核中常用的C語言
 技巧 27
2.3 Linux內核中常用的數據結構和
 算法 33
2.3.1 鏈表 33
2.3.2 紅黑樹 36
2.3.3 無鎖環形緩沖區 38
2.4 Vim工具的使用 40
2.4.1 Vim 8介紹 40
2.4.2 Vim的基本模式 41
2.4.3 Vim中3種模式的切換 41
2.4.4 Vim光標的移動 42
2.4.5 刪除、復制和粘貼 43
2.4.6 查找和替換 43
2.4.7 與文件相關的命令 44
2.5 git工具的使用 44
2.5.1 安裝git 45
2.5.2 git基本操作 45
2.5.3 分支管理 48
2.6 實驗 50
2.6.1 實驗2-1:GCC編譯 50
2.6.2 實驗2-2:內核鏈表 54
2.6.3 實驗2-3:紅黑樹 54
2.6.4 實驗2-4:使用Vim
 工具 54
2.6.5 實驗2-5:把Vim打造成一個
 強大的IDE編輯工具 55
2.6.6 實驗2-6:建立一個git本地
 倉庫 63
2.6.7 實驗2-7:解決分支合并
 沖突 65
2.6.8 實驗2-8:利用git來管理
 Linux內核開發 67
2.6.9 實驗2-9:利用git來管理
 項目代碼 69
第3章 ARM64架構基礎知識 75
3.1 ARM64架構介紹 76
3.1.1 ARMv8-A架構介紹 76
3.1.2 常見的ARMv8處理器 76
3.1.3 ARM64的基本概念 77
3.1.4 ARMv8處理器的運行
 狀態 78
3.1.5 ARMv8架構支持的數據
 寬度 79
3.1.6 不對齊訪問 79
3.2 ARMv8寄存器 79
3.2.1 通用寄存器 79
3.2.2 處理器狀態寄存器 80
3.2.3 特殊寄存器 82
3.2.4 系統寄存器 84
3.3 A64指令集 85
3.3.1 算術和移位操作指令 85
3.3.2 乘和除操作指令 86
3.3.3 移位操作指令 87
3.3.4 位操作指令 87
3.3.5 條件操作指令 87
3.3.6 內存加載指令 89
3.3.7 多字節內存加載和存儲
 指令 91
3.3.8 非特權訪問級別的加載和
 存儲指令 91
3.3.9 內存屏障指令 92
3.3.10 獨占訪存指令 92
3.3.11 跳轉指令 92
3.3.12 異常處理指令 93
3.3.13 系統寄存器訪問指令 93
3.4 ARM64異常處理 95
3.4.1 異常類型 95
3.4.2 同步異常和異步異常 96
3.4.3 異常的發生和退出 96
3.4.4 異常向量表 97
3.5 ARM64內存管理 99
3.5.1 頁表 100
3.5.2 頁表映射 101
3.6 實驗平臺:樹莓派 102
3.6.1 樹莓派4介紹 103
3.6.2 實驗3-1:在樹莓派上安裝
 優麒麟Linux 20.04
 系統 104
3.6.3 實驗3-2:匯編語言
 練習—查找最大數 105
3.6.4 實驗3-3:匯編語言
 練習—通過C語言
 調用匯編函數 105
3.6.5 實驗3-4:匯編語言
 練習—通過匯編語言
 調用C函數 106
3.6.6 實驗3-5:匯編語言
 練習—GCC內聯匯編 106
3.6.7 實驗3-6:在樹莓派上編寫
 一個裸機程序 106
第4章 內核編譯和調試 107
4.1 內核配置 107
4.1.1 內核配置工具 107
4.1.2 .config文件 108
4.2 實驗4-1:通過QEMU虛擬機
 調試ARMv8的Linux內核 110
4.3 實驗4-2:通過Eclipse + QEMU
 單步調試內核 111
第5章 內核模塊 116
5.1 從一個內核模塊開始 116
5.2 模塊參數 120
5.3 符號共享 122
5.4 實驗 123
5.4.1 實驗5-1:編寫一個簡單的
 內核模塊 123
5.4.2 實驗5-2:向內核模塊傳遞
 參數 124
5.4.3 實驗5-3:在模塊之間導出
 符號 124
第6章 簡單的字符設備驅動 125
6.1 從一個簡單的字符設備開始 126
6.1.1 一個簡單的字符設備 126
6.1.2 實驗6-1:寫一個簡單的
 字符設備驅動 131
6.2 字符設備驅動詳解 131
6.2.1 字符設備驅動的抽象 131
6.2.2 設備號的管理 133
6.2.3 設備節點 133
6.2.4 字符設備操作方法集 134
6.3 misc機制 136
6.3.1 misc機制介紹 136
6.3.2 實驗6-2:使用misc機制
 來創建設備驅動 136
6.4 一個簡單的虛擬設備 138
6.4.1 實驗6-3:為虛擬設備
 編寫驅動 138
6.4.2 實驗6-4:使用KFIFO環形
 緩沖區改進設備驅動 141
6.5 阻塞I/O和非阻塞I/O 143
6.5.1 實驗6-5:把虛擬設備驅動
 改成非阻塞模式 144
6.5.2 實驗6-6:把虛擬設備驅動
 改成阻塞模式 147
6.6 I/O多路復用 151
6.6.1 Linux內核的I/O多路
 復用 151
6.6.2 實驗6-7:向虛擬設備中
 添加I/O多路復用支持 152
6.6.3 實驗6-8:為什么不能喚醒
 讀寫進程 157
6.7 添加異步通知 159
6.7.1 異步通知介紹 159
6.7.2 實驗6-9:向虛擬設備添加
 異步通知 159
6.7.3 實驗6-10:解決驅動的
 宕機難題 163
6.8 本章小結 164
第7章 系統調用 166
7.1 系統調用的概念 166
7.1.1 系統調用和POSIX標準 167
7.1.2 系統調用表 167
7.1.3 用程序訪問系統調用 169
7.1.4 新增系統調用 170
7.2 實驗 170
7.2.1 實驗7-1:在樹莓派上新增
 一個系統調用 170
7.2.2 實驗7-2:在Linux主機上
 新增一個系統調用 170
第8章 進程管理 172
8.1 進程 172
8.1.1 進程的由來 172
8.1.2 進程描述符 174
8.1.3 進程的生命周期 176
8.1.4 進程標識 178
8.1.5 進程間的家族關系 179
8.1.6 獲取當前進程 181
8.2 進程的創建和終止 183
8.2.1 寫時復制技術 185
8.2.2 fork()函數 186
8.2.3 vfork()函數 187
8.2.4 clone()函數 187
8.2.5 內核線程 188
8.2.6 do_fork()函數 189
8.2.7 終止進程 191
8.2.8 僵尸進程和托孤進程 191
8.2.9 進程0和進程1 192
8.3 進程調度 193
8.3.1 進程的分類 193
8.3.2 進程的優先級和權重 193
8.3.3 調度策略 195
8.3.4 時間片 198
8.3.5 經典調度算法 198
8.3.6 Linux O(n)調度算法 200
8.3.7 Linux O(1)調度算法 200
8.3.8 Linux CFS算法 201
8.3.9 進程切換 204
8.3.10 與調度相關的數據結構 210
8.4 多核調度 214
8.4.1 調度域和調度組 215
8.4.2 負載的計算 218
8.4.3 負載均衡算法 221
8.4.4 Per-CPU變量 222
8.5 實驗 223
8.5.1 實驗8-1:fork和clone系統
 調用 223
8.5.2 實驗8-2:內核線程 224
8.5.3 實驗8-3:后臺守護進程 224
8.5.4 實驗8-4:進程權限 224
8.5.5 實驗8-5:設置優先級 224
8.5.6 實驗8-6:Per-CPU變量 225
第9章 內存管理 226
9.1 從硬件角度看內存管理 226
9.1.1 內存管理的“遠古
 時代” 226
9.1.2 地址空間的抽象 228
9.1.3 分段機制 229
9.1.4 分頁機制 230
9.2 從軟件角度看內存管理 234
9.2.1 free命令 234
9.2.2 從應用編程角度看內存
 管理 235
9.2.3 從內存布局圖角度看內存
 管理 236
9.2.4 從進程角度看內存管理 239
9.2.5 從內核角度看內存管理 243
9.3 物理內存管理 244
9.3.1 物理頁面 244
9.3.2 內存管理區 250
9.3.3 分配和釋放頁面 252
9.3.4 關于內存碎片化 258
9.3.5 分配小塊內存 260
9.4 虛擬內存管理 268
9.4.1 進程地址空間 268
9.4.2 內存描述符mm_struct 269
9.4.3 VMA管理 270
9.4.4 VMA屬性 273
9.4.5 VMA查找操作 276
9.4.6 malloc()函數 277
9.4.7 mmap()/munmap()函數 280
9.5 缺頁異常 284
9.5.1 do_page_fault()函數 285
9.5.2 匿名頁面缺頁異常 286
9.5.3 文件映射缺頁中斷 286
9.5.4 寫時復制缺頁異常 287
9.6 內存短缺 287
9.6.1 頁面回收算法 287
9.6.2 OOM Killer機制 289
9.7 內存管理日志信息以及調試
 信息 289
9.7.1 vm_stat計數 289
9.7.2 meminfo分析 291
9.7.3 伙伴系統信息 293
9.7.4 查看內存管理區的信息 294
9.7.5 查看進程相關的內存
 信息 296
9.7.6 查看系統內存信息的
 工具 298
9.8 內存管理實驗 300
9.8.1 實驗9-1:查看系統內存
 信息 301
9.8.2 實驗9-2:獲取系統的物理
 內存信息 301
9.8.3 實驗9-3:分配內存 301
9.8.4 實驗9-4:slab 302
9.8.5 實驗9-5:VMA 302
9.8.6 實驗9-6:mmap 302
9.8.7 實驗9-7:映射用戶
 內存 303
9.8.8 實驗9-8:OOM 303
第10章 同步管理 304
10.1 原子操作與內存屏障 305
10.1.1 原子操作 305
10.1.2 內存屏障 309
10.2 自旋鎖機制 310
10.2.1 自旋鎖的定義 310
10.2.2 Qspinlock的實現 311
10.2.3 自旋鎖的變種 312
10.2.4 自旋鎖和raw_spin_lock 313
10.3 信號量 314
10.4 互斥鎖 315
10.5 讀寫鎖 317
10.5.1 讀寫鎖的定義 317
10.5.2 讀寫信號量 318
10.6 RCU 320
10.7 等待隊列 323
10.7.1 等待隊列頭 323
10.7.2 等待隊列節點 324
10.8 實驗 324
10.8.1 實驗10-1:自旋鎖 324
10.8.2 實驗10-2:互斥鎖 325
10.8.3 實驗10-3:RCU鎖 325
第11章 中斷管理 326
11.1 Linux中斷管理機制 326
11.1.1 ARM中斷控制器 327
11.1.2 關于ARM Vexpress V2P
 開發板的例子 327
11.1.3 關于Virt開發板的例子 329
11.1.4 硬件中斷號和Linux中斷號
 的映射 330
11.1.5 注冊中斷 331
11.2 軟中斷和tasklet 333
11.2.1 軟中斷 334
11.2.2 tasklet 335
11.2.3 local_bh_disable()/local_
 bh_enable() 336
11.2.4 小結 337
11.3 工作隊列機制 337
11.3.1 工作隊列的類型 338
11.3.2 使用工作隊列 340
11.3.3 小結 340
11.4 實驗 341
11.4.1 實驗11-1:tasklet 341
11.4.2 實驗11-2:工作隊列 341
11.4.3 實驗11-3:定時器和
 內核線程 341
第12章 調試和性能優化 343
12.1 printk()輸出函數和動態輸出 343
12.1.1 printk()輸出函數 343
12.1.2 動態輸出 345
12.1.3 實驗12-1:使用printk()
 輸出函數 347
12.1.4 實驗12-2:使用動態
 輸出 347
12.2 proc和debugfs 347
12.2.1 proc文件系統 347
12.2.2 sys文件系統 350
12.2.3 debugfs文件系統 351
12.2.4 實驗12-3:使用procfs 351
12.2.5 實驗12-4:使用sysfs 353
12.2.6 實驗12-5:使用
 debugfs 355
12.3 ftrace 355
12.3.1 irqsoff跟蹤器 357
12.3.2 function跟蹤器 358
12.3.3 動態ftrace 359
12.3.4 事件跟蹤 361
12.3.5 實驗12-6:使用ftrace 363
12.3.6 實驗12-7:添加新的
 跟蹤點 363
12.3.7 實驗12-8:使用示蹤
 標志 366
12.3.8 實驗12-9:使用kernelshark
 分析數據 369
12.4 分析Oops錯誤 371
12.4.1 Oops錯誤介紹 371
12.4.2 實驗12-10 :分析Oops
 錯誤 371
12.5 perf性能分析工具 375
12.5.1 perf list命令 376
12.5.2 利用perf采集數據 377
12.5.3 perf stat 378
12.5.4 perf top 379
12.5.5 實驗12-11:使用perf工具
 進行性能分析 380
12.5.6 實驗12-12:采集perf數據
 以生成火焰圖 381
12.6 內存檢測 381
12.6.1 實驗12-13:使用slub_debug
 檢查內存泄漏 382
12.6.2 實驗12-14:使用kmemleak
 檢查內存泄漏 387
12.6.3 實驗12-15:使用kasan檢查
 內存泄漏 389
12.6.4 實驗12-16:使用valgrind
 檢查內存泄漏 393
12.7 使用kdump解決死機問題 394
12.7.1 kdump介紹 394
12.7.2 實驗12-17:搭建ARM64的
 kdump實驗環境 395
12.7.3 實驗12-18:分析一個簡單的
 宕機案例 398
12.8 性能和測試 401
12.8.1 性能和測試概述 401
12.8.2 eBPF介紹 402
12.8.3 BCC介紹 403
12.8.4 實驗12-19:運行BCC
 工具進行性能測試 404
第13章 開源社區 405
13.1 什么是開源社區 405
13.1.1 開源軟件的發展歷史 405
13.1.2 Linux基金會 406
13.1.3 開源協議 406
13.1.4 Linux內核社區 408
13.1.5 國內開源社區 409
13.2 參與開源社區 409
13.2.1 參與開源項目的
 好處 409
13.2.2 如何參與開源項目 410
13.3 實驗13-1:使用cppcheck檢查
 代碼 411
13.4 實驗13-2:提交第一個Linux
 內核補丁 412
13.5 實驗13-3:管理和提交多個補丁
 組成的補丁集 414
第14章 文件系統 419
14.1 文件系統的基本概念 419
14.1.1 文件 419
14.1.2 目錄 422
14.2 文件系統的基本概念和
 知識 423
14.2.1 文件系統的布局 423
14.2.2 索引數據塊 428
14.2.3 管理空閑塊 430
14.2.4 高速緩存 430
14.3 虛擬文件系統層 431
14.4 文件系統的一致性 436
14.5 一次寫磁盤的全過程 439
14.6 文件系統實驗 440
14.6.1 實驗14-1:查看文件
 系統 440
14.6.2 實驗14-2:刪除文件
 內容 441
14.6.3 實驗14-3:塊設備 441
14.6.4 實驗14-4:動手寫一個簡單
 的文件系統 441
第15章 虛擬化與云計算 442
15.1 虛擬化技術 442
15.1.1 虛擬化技術的發展
 歷史 442
15.1.2 虛擬機管理程序的
 分類 444
15.1.3 內存虛擬化 445
15.1.4 I/O虛擬化 445
15.2 容器技術 446
15.3 云計算 448
15.3.1 云編排 450
15.3.2 OpenStack介紹 451
15.3.3 Kubernetes介紹 451
15.4 實驗 452
15.4.1 實驗15-1:制作Docker
 鏡像并發布 452
15.4.2 實驗15-2:部署Kubernetes
 服務 452
第16章 綜合能力訓練:動手寫一個
 小OS 453
16.1 實驗準備 454
16.1.1 開發流程 454
16.1.2 配置串口線 454
16.1.3 寄存器地址 457
16.2 入門動手篇 457
16.2.1 實驗16-1:輸出
 “Welcome BenOS!” 457
16.2.2 使用GDB + QEMU調試
 BenOS 465
16.2.3 使用J-Link仿真器調試樹
 莓派 466
16.2.4 實驗16-2:切換異常
 等級 473
16.2.5 實驗16-3:實現簡易的
 printk()函數 473
16.2.6 實驗16-4:中斷 473
16.2.7 實驗16-5:創建
 進程 475
16.3 進階挑戰篇 475
16.4 高手完善篇 476
本書基于Linux 5.0和ARM64處理器循序漸進地講述Linux內核的理論與實驗。本書共16章,主要介紹Linux系統基礎知識、Linux內核基礎知識、ARM64架構基礎知識、內核編譯和調試、內核模塊、簡單的字符設備驅動、系統調用、進程管理、內存管理、同步管理、中斷管理、調試和性能優化、開源社區、文件系統、虛擬化與云計算等方面的內容,并通過一個綜合能力訓練來引導讀者動手實現一個小的操作系統。
本書適合Linux開發人員、嵌入式開發人員以及對Linux感興趣的程序員閱讀,也適合作為高等院校計算機相關專業的教材。
pagetop