linux多線程編程是指基於Linux操做系統下的多線程編程,包含多任務程序的設計,併發程序設計,網絡程序設計。數據共享等。Linux系統下的多線程遵循POSIX線程接口,稱爲pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,鏈接時需要使用庫libpthread.a。html
小編今天就來把幾本linux多線程編程書籍推薦給你們,但願能夠幫助到想要了解和學習linux多線程編程的攻城獅們。linux
linux多線程編程書籍推薦no.1:《精通Linux》ios
咱們學習Linux的緣由可能各不相同。對於IT從業者(如系統運維人員)來講,他們需要了解本書中的差點兒所有內容。算法
對於Linux軟件架構和開發者來講。他們相同需要了解這些內容,以便發揮操做系統的最大功效。對於研究人員和學生來講,本書可讓他們理解爲何咱們要這樣設置系統。本書菜鳥與老鳥通吃。既可做爲菜鳥的新手教程。也能夠做爲老鳥的進階指南。編程
linux多線程編程書籍推薦no.2:《Linux設備驅動開發具體解釋:基於最新的Linux 4.0內核》後端
歷時8年。三次重構。內窖越發爐火純青。設計模式
全部代碼更新至全新的Linux4.0版本號。緩存
全面解說ARM Linux新版本號內核架構,如設備樹等。安全
不僅注重知識和程序的解說,更注重程序的思想、演變、架構和算法。性能優化
linux多線程編程書籍推薦no.3:《深度實踐KVM:核心技術、管理運維、性能優化與項目實施》
中國運維領域裏劃時代著做。國內頂尖KVM專家和運維專家多年大規模生產環境實踐經驗總結,國內數十位運維專家鼎力支持和推薦。
從核心技術、管理運維、性能優化、項目實施等多個維度系統、深刻解說KVM虛擬化技術的工做原理、應用方法和技術生態。並針對生產環境中的各類難題給出瞭解決方式。
linux多線程編程書籍推薦no.4:《Linux性能優化大師》
本書適合廣大Linux用戶深刻學習,並適合計算機專業本科、碩士等專業的學生學習參考。
爲特定server的應用程序調整關鍵參數。從而產生優異的性能。
linux多線程編程書籍推薦no.5:《精通Linux內核網絡》
專一於各網絡協議實現技術的精髓及其遵循的指導方針和原則。
重點解說數據包在Linux內核網絡棧中的傳輸過程。闡述其與網絡各層及各子系統之間的交互。
從網絡開發人員視角,配合清晰圖表。深刻剖析Linux內核網絡子系統的內部細節及核心實現。
最詳盡的Linux內核網絡專著,深刻剖析IPsec、Wireless、InfiniBand等重要內核網絡子系統。
linux多線程編程的學習必定要與時俱進。杜絕閉門造車。以上的linux多線程編程書籍推薦假設仍是不能知足你的需求,你還想要尋找不少其它重磅的計算機好書,請點擊關注》》計算機圖書頻道。
《精通Linux內核網絡》討論Linux 內核網絡棧的實現及其原理,深刻而詳盡地分析網絡子系統及其架構,主要內容包含:內核網絡基礎知識、Netlink 套接字、ARP、鄰居發現和ICMP 等重要協議的實現、IPv4 和IPv6 的深刻探索、Linux 路由選擇、Netfilter 和IPsec 的實現、Linux 無線網絡、InfiniBand 等。
《精通Linux內核網絡》不只適合從事網絡相關項目的專業人員參考,也能爲相關研究人員和學生提供極大幫助。
做譯者
Rami Rosen
資深軟件project師。Linux內核網絡專家。
從業十餘年間,參與過多個尖端Linux內核項目,曾就Linux內核網絡和虛擬化發表過多篇文章,並作過屢次演講。博客地址:http://ramirose.wix.com/ramirosen
譯者簡單介紹:
袁國忠
自由譯者;2000年起專事翻譯,主譯圖書,偶譯新聞稿、軟文。出版譯著40餘部,當中包含《C++ Prime Plus中文版》《CCNA學習指南》《CCNP ROUTE學習指南》《面向模式的軟件架構:模式系統》《Android應用UI設計模式》《風投的選擇:誰是下一個十億美圓級公司》等,總計700餘萬字。專事翻譯前,從事過三年化工產品分析和開發,作過兩年雜誌和圖書編輯。
文件夾
第1章 緒論 1
1.1 Linux網絡棧 2
1.2 網絡設備 4
1.2.1 網絡設備中的NAPI 5
1.2.2 數據包的收發 5
1.2.3 套接字緩衝區 7
1.3 Linux內核網絡開發模型 10
1.4 總結 12
第2章 Netlink套接字 13
2.1 Netlink簇 13
2.1.1 Netlink套接字庫 15
2.1.2 結構sockaddr_nl 15
2.1.3 用於控制TCP/IP聯網的用戶
空間包 15
2.1.4 內核Netlink套接字 16
2.1.5 Netlink消息報頭 20
2.1.6 NETLINK_ROUTE消息 22
2.1.7 在路由選擇表中加入和刪除
路由選擇條目 24
2.2 通用Netlink協議 25
2.2.1 建立和發送通用Netlink消息 29
2.2.2 套接字監視接口 31
2.3 總結 32
2.4 高速參考 32
第3章 Internet控制消息協議(ICMP) 36
3.1 ICMPv4 36
3.1.1 ICMPv4的初始化 37
3.1.2 ICMPv4報頭 38
3.1.3 接收ICMPv4消息 42
3.1.4 發送ICMPv4消息:目的地
不可達 43
3.2 ICMPv6 47
3.2.1 ICMPv6初始化 47
3.2.2 ICMPv6報頭 48
3.2.3 接收ICMPv6消息 49
3.2.4 發送ICMPv6消息 52
3.3 ICMP套接字(ping套接字) 55
3.4 總結 56
3.5 高速參考 56
3.5.1 方法 56
3.5.2 表格 57
3.5.3 procfs條目 58
3.5.4 使用iptables建立「目的地
不可達」消息 59
第4章 IPv4 61
4.1 IPv4報頭 62
4.2 IPv4的初始化 63
4.3 接收IPv4數據包 64
4.4 接收IPv4組播數據包 67
4.5 IP選項 69
4.5.1 時間戳選項 71
4.5.2 記錄路由選項 74
4.5.3 IP選項和分段 82
4.5.4 建立IP選項 84
4.6 發送IPv4數據包 85
4.7 分段 89
4.7.1 高速路徑 90
4.7.2 慢速路徑 93
4.8 重組 94
4.9 轉發 99
4.10 總結 101
4.11 高速參考 101
4.11.1 方法 102
4.11.2 宏 104
第5章 IPv4路由選擇子系統 105
5.1 轉發和FIB 105
5.2 在路由選擇子系統中進行查找 107
5.3 FIB表 110
5.3.1 FIB信息 110
5.3.2 緩存 115
5.3.3 下一跳 115
5.3.4 策略路由選擇 117
5.3.5 FIB別名 118
5.4 ICMPv4重定向消息 121
5.4.1 生成ICMPv4重定向消息 122
5.4.2 接收ICMPv4重定向消息 123
5.4.3 IPv4路由選擇緩存 125
5.5 總結 126
5.6 高速參考 126
5.6.1 方法 127
5.6.2 宏 128
5.6.3 表 128
5.6.4 路由標誌 129
第6章 高級路由選擇 131
6.1 組播路由選擇 131
6.1.1 IGMP 132
6.1.2 組播路由選擇表 133
6.1.3 組播轉發緩存(MFC) 134
6.1.4 組播路由器 136
6.1.5 vif設備 137
6.1.6 IPv4組播接收路徑 138
6.1.7 方法ip_mr_forward() 141
6.1.8 方法ipmr_queue_xmit() 143
6.1.9 方法ipmr_forward_finish() 145
6.1.10 組播流量中的TTL 146
6.2 策略路由選擇 146
6.2.1 策略路由選擇的管理 147
6.2.2 策略路由選擇的實現 147
6.3 多路徑路由選擇 148
6.4 總結 149
6.5 高速參考 149
6.5.1 方法 149
6.5.2 宏 151
6.5.3 procfs組播條目 152
6.5.4 表 152
第7章 Linux鄰接子系統 153
7.1 鄰接子系統的核心 153
7.1.1 建立和釋放鄰居 160
7.1.2 用戶空間和鄰接子系統之間
的交互 161
7.1.3 處理網絡事件 163
7.2 ARP協議(IPv4) 163
7.2.1 ARP:發送請求 165
7.2.2 ARP:接收請求和應答 168
7.3 NDISC協議(IPv6) 174
7.3.1 反覆地址檢測(DAD) 174
7.3.2 NIDSC:發送請求 176
7.3.3 NDISC:接收鄰居請求和
通告 179
7.4 總結 185
7.5 高速參考 186
7.5.1 方法 186
7.5.2 宏 189
7.5.3 結構neigh_statistics 190
7.5.4 表 191
第8章 IPv6 192
8.1 IPv6簡單介紹 192
8.2 IPv6地址 193
8.2.1 特殊地址 193
8.2.2 組播地址 194
8.3 IPv6報頭 195
8.4 擴展報頭 197
8.5 IPv6初始化 199
8.6 本身主動配置 200
8.7 接收IPv6數據包 201
8.7.1 本地投遞 204
8.7.2 轉發 206
8.8 接收IPv6組播流量 210
8.9 組播偵聽者發現(MLD) 211
8.9.1 增長和退出組播組 212
8.9.2 MLDv2組播偵聽者報告 215
8.9.3 組播源過濾 215
8.10 發送IPv6數據包 220
8.11 IPv6路由選擇 221
8.12 總結 221
8.13 高速參考 221
8.13.1 方法 221
8.13.2 宏 224
8.13.3 表 224
8.13.4 特殊地址 225
8.13.5 IPv6路由選擇表的管理 226
第9章 Netfilter 227
9.1 Netfilter框架 227
9.2 Netfilter掛接點 228
註冊Netfilter鉤子回調函數 229
9.3 鏈接跟蹤 230
9.3.1 鏈接跟蹤的初始化 231
9.3.2 鏈接跟蹤條目 234
9.3.3 鏈接跟蹤輔助方法和指望
鏈接 238
9.3.4 iptables 241
9.3.5 投遞到當前主機 243
9.3.6 轉發數據包 245
9.3.7 網絡地址轉換(NAT) 245
9.3.8 NAT鉤子回調函數和鏈接
跟蹤鉤子回調函數 247
9.3.9 NAT鉤子回調函數 250
9.3.10 鏈接跟蹤擴展 252
9.4 總結 253
9.5 高速參考 253
9.5.1 方法 253
9.5.2 宏 255
9.5.3 表 255
9.5.4 工具和庫 256
第10章 IPsec 257
10.1 概述 257
10.2 Internet密鑰交換(IKE) 257
10.3 IPsec和加密 259
10.4 XFRM框架 259
10.4.1 XFRM的初始化 260
10.4.2 XFRM策略 260
10.4.3 XFRM狀態(安全關聯) 263
10.5 IPv4 ESP的實現 266
10.6 接收IPsec數據包(傳輸模式) 268
10.7 發送IPsec數據包(傳輸模式) 271
10.8 XFRM查找 272
10.9 IPsec的NAT穿越功能 275
10.10 總結 276
10.11 高速參考 276
10.11.1 方法 276
10.11.2 表 278
第11章 第4層協議 280
11.1 套接字 280
11.2 建立套接字 281
11.3 用戶數據包協議(UDP) 285
11.3.1 UDP的初始化 286
11.3.2 發送UDP數據包 287
11.3.3 接收來自網絡層(L3)的
UDP數據包 290
11.4 傳輸控制協議(TCP) 293
11.4.1 TCP報頭 293
11.4.2 TCP的初始化 295
11.4.3 TCP定時器 296
11.4.4 TCP套接字的初始化 297
11.4.5 TCP鏈接的創建 297
11.4.6 接收來自網絡層(L3)的
TCP數據包 298
11.4.7 發送TCP數據包 299
11.5 流控制傳輸協議(SCTP) 300
11.5.1 SCTP數據包和數據塊 301
11.5.2 SCTP塊頭 302
11.5.3 SCTP塊 302
11.5.4 SCTP關聯 303
11.5.5 創建SCTP關聯 305
11.5.6 接收SCTP數據包 305
11.5.7 發送SCTP數據包 306
11.5.8 SCTP心跳 306
11.5.9 SCTP多流 306
11.5.10 SCTP多宿主 307
11.6 數據報擁塞控制協議(DCCP) 307
11.6.1 DCCP報頭 307
11.6.2 DCCP的初始化 309
11.6.3 DCCP套接字的初始化 310
11.6.4 接收來自網絡層(L3)的
DCCP數據包 311
11.6.5 發送DCCP數據包 311
11.6.6 DCCP和NAT 312
11.7 總結 313
11.8 高速參考 313
11.8.1 方法 313
11.8.2 宏 315
11.8.3 表 315
第12章 無線子系統 317
12.1 mac80211子系統 317
12.2 802.11 MAC幀頭 318
12.3 802.11 MAC幀頭的其它成員 320
12.4 網絡拓撲 321
12.4.1 基礎設施BSS 321
12.4.2 IBSS(對等模式) 322
12.5 省電模式 322
12.5.1 進入省電模式 322
12.5.2 退出省電模式 322
12.5.3 處理組播/廣播緩衝區 323
12.6 管理層 325
12.6.1 掃描 325
12.6.2 身份驗證 325
12.6.3 關聯 325
12.6.4 又一次關聯 325
12.7 mac80211的實現 326
12.7.1 接收路徑 328
12.7.2 傳輸路徑 328
12.7.3 分段 329
12.7.4 mac80211 debugfs 330
12.7.5 無線模式 331
12.8 高吞吐量(IEEE 802.11n) 331
12.9 網狀網絡(802.11s) 334
12.9.1 HWMP 335
12.9.2 組建網狀網絡 336
12.10 Linux無線開發流程 337
12.11 總結 337
12.12 高速參考 338
12.12.1 方法 338
12.12.2 表 341
第13章 InfiniBand 343
13.1 RDMA和InfiniBand概述 343
13.1.1 RDMA棧的組織結構 344
13.1.2 RDMA技術的長處 345
13.1.3 InfiniBand硬件組件 345
13.1.4 InfiniBand中的編址 345
13.1.5 InfiniBand的功能 346
13.1.6 InfiniBand數據包 346
13.1.7 管理實體 347
13.2 RDMA資源 348
13.2.1 RDMA設備 348
13.2.2 PD 350
13.2.3 AH 350
13.2.4 MR 350
13.2.5 FMR池 351
13.2.6 MW 352
13.2.7 CQ 352
13.2.8 XRC 353
13.2.9 SRQ 353
13.2.10 QP 355
13.2.11 工做請求的處理 360
13.2.12 RDMA架構支持的操做 361
13.2.13 組播組 365
13.2.14 用戶空間RDMA API
和內核級RDMA API
的區別 365
13.3 總結 366
13.4 高速參考 366
第14章 高級主題 372
14.1 網絡命名空間 372
14.1.1 命名空間的實現 373
14.1.2 UTS命名空間的實現 381
14.1.3 網絡命名空間的實現 383
14.1.4 網絡命名空間的管理 388
14.2 cgroup 392
14.2.1 cgroup的實現 393
14.2.2 cgroup設備控制器:一個
簡單演示樣例 395
14.2.3 cgroup內存控制器:一個
簡單演示樣例 396
14.2.4 net_prio模塊 396
14.2.5 分類器cls_cgroup 397
14.2.6 掛載cgroup子系統 398
14.3 頻繁輪詢套接字 399
14.3.1 全局啓用 400
14.3.2 對特定套接字啓用 401
14.3.3 調整和配置 401
14.3.4 性能 401
14.4 Linux藍牙子系統 401
14.4.1 HCI層 404
14.4.2 HCI鏈接 406
14.4.3 L2CAP 407
14.4.4 BNEP 407
14.4.5 藍牙數據包接收示意圖 408
14.4.6 L2CAP擴展功能 409
14.4.7 藍牙工具 409
14.5 IEEE 802.15.4和6LoWPAN 410
14.5.1 鄰居發現優化 411
14.5.2 Linux內核的6LoWPAN
實現 412
14.6 NFC 415
14.6.1 NFC標籤 415
14.6.2 NFC設備 416
14.6.3 通訊模式和操做模式 416
14.6.4 主機控制器接口 417
14.6.5 Linux對NFC的支持 417
14.6.6 用戶空間架構 421
14.6.7 Android NFC 421
14.7 通知鏈 422
14.8 PCI子系統 425
14.9 組合網絡設備 428
14.10 PPPoE協議 428
14.10.1 PPPoE報頭 429
14.10.2 PPPoE的初始化 430
14.10.3 PPPoE數據包的收發 432
14.11 Android 435
14.11.1 Android聯網技術 436
14.11.2 Android內部原理:資料 437
14.12 總結 438
14.13 高速參考 438
14.13.1 方法 438
14.13.2 宏 443
附錄A Linux API 444
附錄B 網絡管理 520
附錄C 術語表 537
性能調優有時被稱爲"黑色藝術",因爲有時有效地調整一個系統,要求具備更深層次的知識,且需要了解一個系統的硬件和軟件組成。以及系統之間的相互做用。
性能優化是針對特定環境來定製系統的配置過程,或者是讓某個特定的應用程序獲得更好的響應時間或吞吐量的過程。
《Linux性能優化大師》首先對Linux 操做系統進行了深刻剖析,並對最常用的企業監控工具Benchmark 及其它監控工具進行了具體的介紹。此外分析了系統中識別和分析瓶頸的過程,最後闡述怎樣使用性能衡量工具。以及怎樣對系統的4 大子系統進行調整,使系統以最優狀態應對不一樣的工做環境。
《Linux性能優化大師》適合廣大Linux 用戶深刻學習,並適合計算機專業本科、碩士等專業的學生學習參考。
做譯者
趙永剛,2006-2008年期間主要從事思科網絡研究,並在2008年得到思科CCNA 與CCNP國際認證。
2009至今一直在從事Linux系統的研究。並在2009年和2010年分別得到紅帽RHCE和RHCA國際認證。
文件夾
第1章深刻理解Linux操做系統 1
1.1 Linux進程管理 1
1.1.1 什麼是進程 2
1.1.2 進程的生命週期 2
1.1.3 線程 3
1.1.4 進程優先級和nice等級 4
1.1.5 上下文切換 4
1.1.6 中斷處理 5
1.1.7 進程狀態 5
1.1.8 進程的內存段 6
1.1.9 Linux CPU調度程序 7
1.2 Linux內存體系結構 8
1.2.1 物理內存和虛擬內存 8
1.2.2 虛擬內存管理 10
1.3 Linux文件系統 12
1.3.1 虛擬文件系統 12
1.3.2 文件系統日誌 13
1.3.3 Ext2 13
1.3.4 Ext3 15
1.3.5 Ext4 15
1.3.6 XFS 18
1.3.7 Btrfs 19
1.3.8 JFS 20
1.3.9 ReiserFS 20
1.4 Linux 磁盤 I/O 子系統 20
1.4.1 I/O子系統的體系結構 20
1.4.2 Cache 20
1.4.3 塊層 23
1.4.4 I/O 設備驅動程序 25
1.4.5 RAID與文件系統 26
1.5 Linux 網絡子系統 26
1.5.1 網絡化的實現 26
1.5.2 TCP/IP 30
1.5.3 Offload 32
1.5.4 Bonding模塊 32
1.6 瞭解Linux性能度量標準 32
1.6.1 處理器度量標準 32
1.6.2 內存度量標準 33
1.6.3 塊設備度量標準 34
1.6.4 網絡接口度量標準 34
第2章 監控工具 35
2.1 介紹 35
2.2 工具功能概述 35
2.3 監控工具 36
2.3.1 top 36
2.3.2 uptime 38
2.3.3 ps、pstree 38
2.3.4 free 43
2.3.5 mpstat 44
2.3.6 vmstat 46
2.3.7 iostat 50
2.3.8 netstat、ss 53
2.3.9 sar 58
2.3.10 numastat 70
2.3.11 pmap 72
2.3.12 iptraf 73
2.3.13 tcpdump和wireshark 76
2.3.14 strace和ltrace 92
2.3.15 gnuplot 97
2.3.16 Gnome System Monitor 106
2.3.17 KDE System Guard 114
第3章 Benchmark工具 123
3.1 CPU2006 124
3.1.1 安裝與執行 126
3.1.2 runspec命令 130
3.1.3 配置文件 139
3.2 STREAM 167
3.2.1 什麼是STREAM 167
3.3 Bonnie++ 172
3.4 Netperf 177
3.4.1 Netperf介紹 177
3.4.2 Netperf設計 178
3.4.3 CPU使用率 179
3.4.4 全局命令行選項 181
3.4.5 使用Netperf測量"批量數據"傳輸 186
3.4.6 使用Netperf測量"請求/響應" 192
3.4.7 使用netperf來測試總體性能 196
3.4.8 使用netperf測量雙向傳輸 201
3.4.9 omni測試 203
3.4.10 其它的nerperf測試 206
第4章分析性能瓶頸 208
4.1 識別系統瓶頸 208
4.1.1 收集信息 208
4.1.2 分析server性能 210
4.2 CPU瓶頸 210
4.2.1 查找CPU瓶頸 211
4.2.2 SMP 211
4.2.3 性能調整選項 211
4.3 內存瓶頸 212
4.3.1 查找內存瓶頸 212
4.3.2 性能調整選項 213
4.4 磁盤瓶頸 214
4.4.1 查找磁盤瓶頸 214
4.4.2 性能調整選項 216
4.5 網絡瓶頸 216
4.5.1 查找網絡瓶頸 216
4.5.2 性能調整選項 217
第5章調整操做系統 218
5.1 調整原則 218
5.1.1 變動管理 219
5.2 安裝注意事項 219
5.2.1 安裝 219
5.2.2 檢查當前的配置 220
5.2.3 最小化資源使用 227
5.2.4 SELinux 231
5.2.5 編譯內核 232
5.3 更改內核參數 233
5.3.1 proc文件系統 233
5.3.2 存儲參數的位置 235
5.3.3 使用sysctl命令 235
5.4 調整處理器子系統 235
5.4.1 調整進程優先級 236
5.4.2 CPU親和力 237
5.4.3 平衡中斷 240
5.4.4 NUMA系統 240
5.5 調整內存子系統 243
5.5.1 內存回收(設置內核交換和刷新髒數據行爲) 243
5.5.2 調整swap 245
5.5.3 HugeTLBfs 247
5.5.4 內存同頁合併 250
5.6 調整磁盤子系統 252
5.6.1 安裝Linux前的硬件注意事項 252
5.6.2 I/O調度的調整和選擇 254
5.6.3 文件系統的選擇和調整 258
5.6.4 虛擬化存儲 261
5.7 調整網絡子系統 263
5.7.1 網卡綁定 263
5.7.2 巨幀 265
5.7.3 速度與雙工模式 266
5.7.4 添加網絡緩衝區 268
5.7.5 添加數據包隊列 270
5.7.6 添加傳輸隊列長度 270
5.7.7 配置offload 271
5.7.8 Netfilter 對性能的影響 272
5.7.9 流量特性的注意事項 275
5.7.10 額外的TCP/IP調整 276
5.8 限制資源使用 278
虛擬化技術是大數據和雲計算應用中的核心技術,通過幾年的友展,KVM已經很成熟和穩定,逐漸代替Xen等商業虛擬化技術和產品,成爲該領域其實的標準。因爲採用KVM技術的業務規模都比較大。生產環境大多比較複雜,加上KVM整個技術生態中涉及的技術較多,使用起來有必定的門檻,企業的學習成本較高。
當KVM技術在國內鮮有人使用時。本書做者團隊就開始鑽研並在生產環境中使用,短短几年內,就爲公司節省了上億的運莒成本。幫助公司多個處於生命週期末的遊戲項目實現扭虧爲盈。本書中所有的知識和經驗都來自國內一線的互聯網公司的生產環境。比方金山西山居、盛大遊戲等,最大的特色就是業務規模大、環境複雜,很具備表明性,極爲珍貴。
本書從多個維度具體解說了KVM虛擬化原理、技術及性能調優、軟硬件選型,生產環境虛擬化項目實施方法。開源管理平臺介紹及部署。虛擬化後端存儲方案。開源分佈式文件系統GIusterFS、Ceph在虛擬化中的用法,虛擬化監控、報警、應急方案的制定,並附有大量生產環境案例。
做譯者
肖力,資深運維專家。擁有15年運維經驗,就任於金山西山居,擔任系統運維經理,曾就任於盛大遊戲,在運維圈有極大的影響力。國內最頂尖的KVM專家之中的一個,從2009年開始研究KVM技術。是國內較早在生產環境大規模實踐KVM的人之中的一個。積累了很豐富的經驗。
熱衷於技術傳播,一直在無私地爲運維領域的發展作貢獻,維護有微信訂閱號「KVM虛擬化實踐」。分享了大量KVM和運維領域的乾貨內容。同一時候還運營着多個運維相關的微信羣。此外。他仍是華章「運維前線」系列圖書的總策劃。無償地在組織大量願意無私分享經驗的運維project師們來參與寫做。
汪愛偉。資深運維專家。安居客資深系統project師,曾就任於阿里雲、UCloud、盛大遊戲等知名互聯網公司。對KVM技術有深刻的研究。在虛擬化集羣方面有豐富的生產環境經驗。擅長KVM虛擬化項目的實施和運維。
楊俊俊,資深虛擬化技術專家和運維project師。就任於盛大,擔任盛大遊戲公有云「G雲」運維負責人和Intel聯合實驗室技術負責人。曾任職51。com,精通虛擬化項目的評估與實施,精通開源分佈式文件系統在生產環境的運維與實踐。
趙德祿,資深運維project師和虛擬化project師。就任於攜程,擔任高級雲平臺運維project師。曾就任於盛大遊戲,擔任資深虛擬化project師。精通KVM、OpenStack、OpenvSwitch、桌面虛擬化等技術,在生產環境下的實踐經驗很豐富。
文件夾
本書讚譽
前 言
第一篇 KVM技術具體解釋與實踐
第1章 企業虛擬化選型與KVM介紹 2
1.1 KVM的前世此生 2
1.2 KVM與常用企業級虛擬化產品的PK 7
1.3 推斷企業是否適合使用KVM的標準 9
1.4 本章小結 10
第2章 開始本身的第一臺虛擬機 11
2.1 serverBIOS設置 11
2.2 宿主機CentOS 6.五、CentOS 7系統安裝與配置技巧 13
2.3 第一臺虛擬機安裝 15
2.4 本章小結 21
第3章 CPU、內存虛擬化技術與應用場景 22
3.1 NUMA技術與應用 22
3.1.1 KVM虛擬機NUMA調優 24
3.1.2 CPU綁定操做方法 27
3.2 CPU熱加入與應用 32
3.3 CPU host-passthrough 技術與應用 36
3.4 CPU Nested 技術與配置方法 38
3.5 KSM技術與應用 39
3.6 內存氣球技術具體解釋與應用 40
3.7 內存限制技術與應用 43
3.8 巨型頁內存技術與應用 44
3.9 本章小結 47
第4章 網絡虛擬化技術與應用場景 48
4.1 半虛擬化網卡技術具體解釋 48
4.1.1 半虛擬化網卡的配置 49
4.1.2 全虛擬化網卡、半虛擬化網卡性能比較 50
4.1.3 全虛擬化網卡、半虛擬化網卡的應用場景 63
4.2 MacVTap和vhost-net技術原理與應用 63
4.2.1 MacVTap技術與應用 64
4.2.2 vhost_net技術 66
4.3 網卡的中斷與多隊列 66
4.4 網卡PCI Passthrough技術 71
4.5 SR-IVO虛擬化技術 72
4.6 虛擬化軟件交換機Open vSwitch的安裝與配置 75
4.6.1 Open vSwitch安裝 75
4.6.2 Open vSwitch典型配置 77
4.7 多網卡綁定與建橋 79
4.8 本章小結 82
第5章 KVM磁盤虛擬化技術與應用場景 83
5.1 磁盤虛擬化方式性能比較與應用場景 83
5.1.1 QEMU磁盤虛擬化方式概述 83
5.1.2 IDE與Virtio性能比較測試 84
5.2 Virtio磁盤緩存方式具體解釋、性能比較與應用場景 85
5.2.1 磁盤緩存具體解釋 86
5.2.2 緩存方式的性能比較測試 87
5.2.3 緩存方式的應用場景 89
5.3 磁盤鏡像格式 89
5.3.1 QEMU支持的磁盤鏡像格式 89
5.3.2 裸設備使用 96
5.3.3 KVM虛擬機鏡像管理利器guestfish 97
5.3.4 raw、qcow二、裸盤、lvm性能比較 106
5.3.5 磁盤鏡像格式的應用場景 107
5.4 文件系統塊對齊 108
5.4.1 什麼是塊對齊 108
5.4.2 塊對齊與塊不正確齊性能比較 109
5.4.3 生產環境怎樣配置塊對齊 110
5.5 SSD在KVM虛擬化中的使用實踐 111
5.5.1 SSD原理與寫放大 111
5.5.2 SSD在KVM中的使用 112
5.5.3 Flachcache配置與性能測試 117
5.5.4 DM-cache配置 120
5.5.5 LVM cache配置與性能測試 122
5.5.6 生產環境中SSD使用要點 123
5.6 本章小結 126
第6章 KVM虛擬機的資源限制 127
6.1 哪些場景要作虛擬機的資源限制 127
6.2 使用CGroups 130
6.3 KVM虛擬機CPU資源限制配置 142
6.4 KVM虛擬機網絡資源限制 144
6.5 KVM虛擬機磁盤資源限制 150
6.6 本章小結 151
第7章 物理機轉虛擬機實踐 152
7.1 哪些應用場景適合作物理機轉虛擬機 152
7.2 P2V的技術實施方案 152
7.3 Windows系統物理機轉虛擬機的操做方法 153
7.3.1 WinPE的製做方法 153
7.3.2 Windows系統P2V操做方法 155
7.4 Linux物理server轉換虛擬機操做 155
7.5 使用virt-p2v工具進行P2V轉換 157
7.6 P2V經驗總結 160
7.7 關於V2V 160
7.8 本章小結 160
第8章 KVM桌面虛擬化實踐 161
8.1 桌面虛擬化簡單介紹及Spice協議 161
8.2 桌面虛擬化實踐經驗 162
8.3 本章小結 167
第二篇 分佈式文件系統
第9章 幾種常見開源文件系統在KVM中的應用 170
9.1 演示環境基礎配置 170
9.2 DRBD在KVM中的應用 172
9.2.1 DRBD介紹 172
9.2.2 DRBD搭建方法及在KVM中的應用 173
9.2.3 DRBD在KVM虛擬化中的優化方案 183
9.3 GlusterFS在KVM虛擬化中的應用 184
9.3.1 GlusterFS介紹 184
9.3.2 GlusterFS集羣搭建與使用 189
9.3.3 GlusterFS在KVM虛擬化中的應用 195
9.3.4 GlusterFS在KVM虛擬化中的優化方案 198
9.4 Sheepdog在KVM中的應用 199
9.4.1 Sheepdog介紹 199
9.4.2 Sheepdog搭建方法及在KVM中的應用 201
9.5 MooseFS在KVM中的應用 207
9.5.1 MooseFS介紹 208
9.5.2 MFS搭建方法及在KVM虛擬化中的應用 208
9.6 本章小結 213
第10章 Ceph在KVM虛擬化中的應用與故障處理 214
10.1 Ceph簡單介紹 214
10.2 Ceph部署方法及在KVM中的應用 217
10.2.1 使用ceph-deploy工具部署Ceph 217
10.2.2 掛載CephFS 221
10.2.3 經過Librbd方式使用Ceph RBD 223
10.2.4 使用內核方式掛載並使用Ceph RBD 226
10.3 CRUSH算法介紹及調優方法 228
10.3.1 CRUSH算法介紹 228
10.3.2 CRUSH算法調優方法 230
10.4 多角度評估Ceph在KVM虛擬化環境中的應用 234
10.5 Ceph生產環境搭建案例 240
10.5.1 使用CephFS集中備份虛擬機 240
10.5.2 使用Librbd將虛擬機執行在Ceph RBD 241
10.5.3 在CephFS上建立qcow2文件做爲雲硬盤 242
10.6 Ceph常見故障處理 242
10.6.1 Ceph集羣監控狀態檢查 243
10.6.2 Ceph常見錯誤提示的含義與處理方法 244
10.7 本章小結 245
第三篇 KVM虛擬化管理平臺
第11章 利用OpenStack管理KVM 248
11.1 OpenStack搭建 248
11.1.1 OpenStack簡單介紹 248
11.1.2 控制節點的安裝 249
11.1.3 計算節點的安裝 266
11.2 OpenStack有用技巧 269
11.2.1 RabbitMQ Cluster搭建 269
11.2.2 利用Haproxy和Keepalived實現控制節點高可用 271
11.2.3 冷遷移虛擬機的方法 277
11.3 本章小結 277
第12章 利用OpenNebula管理KVM 278
12.1 OpenNebula架構 278
12.1.1 OpenNebula架構介紹 278
12.1.2 OpenNebula組件介紹 279
12.2 在KVM中使用OpenNebula 280
12.2.1 在CentOS 6.5上高速搭建OpenNebula 280
12.2.2 使用OpenNebula建立第一臺KVM虛擬機 285
12.2.3 使虛擬機硬盤建立在宿主機本地硬盤上 288
12.3 OpenNebula常見故障處理 291
12.4 本章小結 293
第13章 其它管理平臺介紹 294
13.1 ConVirt管理平臺介紹 294
13.1.1 ConVirt的理念 294
13.1.2 ConVirt的架構 295
13.2 CloudStack管理平臺介紹 295
13.3 oVirt管理平臺介紹 297
13.4 WebVirtMgr管理平臺介紹 299
13.5 怎樣選擇管理平臺 303
13.6 本章小結 304
第四篇 KVM虛擬化項目實施
第14章 業務性能評估與壓力模型創建 306
14.1 Linux 系統性能數據採集原則與方法 306
14.2 Linux 系統壓力模型創建 311
14.3 Windows系統性能數據採集原則與方法 314
14.4 Windows 系統壓力模型創建 317
14.5 本章小結 319
第15章 宿主機選型與基礎性能測試 320
15.1 宿主機CPU選型原則 320
15.2 宿主機內存選型注意事項 322
15.3 宿主機硬盤選型 324
15.4 RAID卡選型 326
15.5 server網卡選型 327
15.6 宿主機性能基準測試實踐 328
15.7 本章小結 345
第16章 虛擬機鏡像製做、配置與測試 346
16.1 Windows虛擬機制做方法 346
16.1.1 Windows鏡像製做 346
16.1.2 Windows虛擬機sysprep初始化封裝 361
16.2 Linux鏡像製做方法 362
16.2.1 RHEL/CentOS鏡像製做方法 362
16.2.2 Ubuntu、Debian虛擬機配置注意點 364
16.3 虛擬機本身主動配置IP的實現辦法 365
16.3.1 經過DHCP給虛擬機配置IP 365
16.3.2 經過Libvirt實現虛擬機本身主動配置IP 365
16.3.3 筆者生產環境虛擬機IP本身主動配置的方法 365
16.4 虛擬機鏡像測試 375
16.5 本章小結 375
第17章 單機虛擬化技術與生產環境實踐 376
17.1 單機虛擬化技術與應用場景 376
17.1.1 單機虛擬化的優點和劣勢 377
17.1.2 單機虛擬化技術 378
17.1.3 單機虛擬化應用場景 380
17.2 單機虛擬化生產環境注意點 381
17.2.1 單機虛擬化災備與應急方案 381
17.2.2 單機虛擬化生產環境部署實踐 382
17.3 本章小結 385
第18章 KVM虛擬化集羣技術與應用場景 386
18.1 虛擬化集羣設計思路與架構 386
18.2 虛擬化集羣的實施流程與技術方案 389
18.3 虛擬化集羣搭建 392
18.3.1 計算節點配置與管理 392
18.3.2 網絡設計與配置 403
18.3.3 虛擬機遷移管理 404
18.3.4 虛擬化集羣的備份與恢復 407
18.4 Dell EqualLogic存儲的管理實踐經驗 414
18.5 本章小結 419
第19章 業務遷移到虛擬化環境流程 420
19.1 性能評估與測試環境測試 420
19.2 上線前的檢查工做 428
19.3 小規模部署及逐步切換到虛擬化環境 429
19.4 本章小結 430
第20章 宿主機本身主動化運維管理 431
20.1 Puppet簡單介紹與安裝部署 431
20.2 利用Puppet管理宿主機的運維架構設計 436
20.3 利用Puppet配置宿主機初始化操做 441
20.4 利用Puppet管理宿主機配置與更新 442
20.5 利用Puppet推送宿主機的非一致性配置 445
20.6 本章小結 449
第21章 虛擬化監控、報警與應急響應方案 450
21.1 虛擬化監控內容 450
21.1.1 宿主機CPU監控要點 450
21.1.2 宿主機內存監控注意點 455
21.1.3 宿主機網絡監控注意點 458
21.1.4 宿主機磁盤監控注意點 460
21.1.5 宿主機層面監控虛擬機的方法 461
21.2 監控軟件Cacti、Zabbix 463
21.2.1 用Cacti監控宿主機 464
21.2.2 用Zabbix監控宿主機 471
21.3 應急方案 487
21.3.1 應急方案制定注意要點 487
21.3.2 單機虛擬化應急方案 491
21.3.3 集羣虛擬化應急方案 495
21.4 本章小結 497
第五篇 KVM虛擬化典型案例
第22章 生產環境問題案例與分析 500
22.1 遊戲在虛擬機上很慢的案例 500
22.2 虛擬機流量太高引發網絡風暴的案例一 502
22.3 虛擬機流量太高引發網絡風暴的案例二 517
22.4 其它生產環境問題案例 520
22.4.1 共享存儲集羣虛擬機遷移故障案例 520
22.4.2 宿主機異常關機後虛擬機沒法啓動案例 522
22.4.3 宿主機使用CentOS 5.6系統問題案例 523
22.4.4 Windows虛擬機網絡閃斷、不通問題案例 523
22.4.5 Windows 7虛擬機僅僅能使用2個CPU案例 524
22.4.6 生產環境很奇怪的一個案例 524
22.4.7 U盤在虛擬機上掛載問題案例 526
22.4.8 HP ILO4固件Bug引發宿主機從新啓動案例 528
22.4.9 一次機房斷電引發的問題案例 529
22.4.10 CPU綁定問題案例 531
22.4.11 生產環境存儲故障致使50個虛擬機丟失案例 532
22.4.12 生產環境Ubuntu虛擬機故障問題案例 533
22.5 本章小結 538
附錄 筆者推薦的KVM學習資料 539
對於嵌入式project師來講。進入更高階段後,學習Linux設備驅動開發無疑就是職業生涯的一次「重生」。這是因爲Linux設備驅動開發不僅涉及操做系統的轉換。開發方式的轉換,更重要的是思惟上的轉變。對於Linux這樣一個複雜系統。怎樣從複雜的代碼中抓住設備驅動開發的關鍵是不論什麼一個Linux設備驅動開發人員入門時需要面對的挑戰。除了知識、工具以外,每每還需要思路上的指導。本書不但幫助Linux設備驅動開發的剛開始學習的人釐清必要的概念,還從詳細的實例、設備驅動開發的指導原則按部就班地引導讀者漸入學習佳境。
爲了讓讀者能夠達到Linux設備驅動開發的至臻境地,做者更是從軟件project的角度抽象出設備驅動開發的通常思想。毫無疑問,本書將成爲讀者學習Linux設備驅動開發過程當中的一座「燈塔」。
做譯者
宋寶華
Linux佈道者,知名嵌入式系統專家,《Essential Linux Device Drivers》譯者。做爲最先從事Linux內核與設備驅動研究的專家之中的一個,他在衆多國內外知名企業開展Linux技術培訓。他也是一位活躍的Linux開發人員和深度實踐者,爲Linux官方內核貢獻了大量的Linux源代碼並承擔代碼審覈工做。至今已向Linux官方內核提交逾數萬行代碼和幾百個補丁。
他的《Linux設備驅動開發具體解釋》系列書在嵌入式Linux開發人員中有口皆碑,是衆多Linux書籍中爲數很少的暢銷書。
文件夾
讚譽
推薦序一
推薦序二
前言
第1章 Linux設備驅動概述及開發環境構建 1
1.1 設備驅動的做用 1
1.2 無操做系統時的設備驅動 2
1.3 有操做系統時的設備驅動 4
1.4 Linux設備驅動 5
1.4.1 設備的分類及特色 5
1.4.2 Linux設備驅動與整個軟硬件系統的關係 6
1.4.3 Linux設備驅動的重點、難點 7
1.5 Linux設備驅動的開發環境構建 8
1.5.1 PC上的Linux環境 8
1.5.2 QEMU實驗平臺 11
1.5.3 源碼閱讀和編輯 13
1.6 設備驅動Hello World:LED驅動 15
1.6.1 無操做系統時的LED驅動 15
1.6.2 Linux下的LED驅動 15
第2章 驅動設計的硬件基礎 20
2.1 處理器 20 2.1.1 通用處理器 20 2.1.2 數字信號處理器 22 2.2 存儲器 24 2.3 接口與總線 28 2.3.1 串口 28 2.3.2 I2C 29 2.3.3 SPI 30 2.3.4 USB 31 2.3.5 以太網接口 33 2.3.6 PCI和PCI-E 34 2.3.7 SD和SDIO 36 2.4 CPLD和FPGA 37 2.5 原理圖分析 40 2.6 硬件時序分析 42 2.6.1 時序分析的概念 42 2.6.2 典型的硬件時序 43 2.7 芯片數據手冊閱讀方法 44 2.8 儀器儀表使用 47 2.8.1 萬用表 47 2.8.2 示波器 47 2.8.3 邏輯分析儀 49 2.9 總結 51 第3章 Linux內核及內核編程 52 3.1 Linux內核的發展與演變 52 3.2 Linux 2.6後的內核特色 56 3.3 Linux內核的組成 59 3.3.1 Linux內核源碼的文件夾結構 59 3.3.2 Linux內核的組成部分 60 3.3.3 Linux內核空間與用戶空間 64 3.4 Linux內核的編譯及載入 64 3.4.1 Linux內核的編譯 64 3.4.2 Kconfig和Makefile 66 3.4.3 Linux內核的引導 74 3.5 Linux下的C編程特色 75 3.5.1 Linux編碼風格 75 3.5.2 GNU C與ANSI C 78 3.5.3 do { } while(0) 語句 83 3.5.4 goto語句 85 3.6 工具鏈 85 3.7 實驗室建設 88 3.8 串口工具 89 3.9 總結 91 第4章 Linux內核模塊 92 4.1 Linux內核模塊簡單介紹 92 4.2 Linux內核模塊程序結構 95 4.3 模塊載入函數 95 4.4 模塊卸載函數 97 4.5 模塊參數 97 4.6 導出符號 99 4.7 模塊聲明與描寫敘述 100 4.8 模塊的使用計數 100 4.9 模塊的編譯 101 4.10 使用模塊「繞開」GPL 102 4.11 總結 103 第5章 Linux文件系統與設備文件 104 5.1 Linux文件操做 104 5.1.1 文件操做系統調用 104 5.1.2 C庫文件操做 108 5.2 Linux文件系統 109 5.2.1 Linux文件系統文件夾結構 109 5.2.2 Linux文件系統與設備驅動 110 5.3 devfs 114 5.4 udev用戶空間設備管理 116 5.4.1 udev與devfs的差異 116 5.4.2 sysfs文件系統與Linux設備模型 119 5.4.3 udev的組成 128 5.4.4 udev規則文件 129 5.5 總結 133 第6章 字符設備驅動 134 6.1 Linux字符設備驅動結構 134 6.1.1 cdev結構體 134 6.1.2 分配和釋放設備號 136 6.1.3 file_operations結構體 136 6.1.4 Linux字符設備驅動的組成 138 6.2 globalmem虛擬設備實例描寫敘述 142 6.3 globalmem設備驅動 142 6.3.1 頭文件、宏及設備結構體 142 6.3.2 載入與卸載設備驅動 143 6.3.3 讀寫函數 144 6.3.4 seek函數 146 6.3.5 ioctl函數 146 6.3.6 使用文件私有數據 148 6.4 globalmem驅動在用戶空間中的驗證 156 6.5 總結 157 第7章 Linux設備驅動中的併發控制 158 7.1 併發與競態 158 7.2 編譯亂序和運行亂序 160 7.3 中斷屏蔽 165 7.4 原子操做 166 7.4.1 整型原子操做 167 7.4.2 位原子操做 168 7.5 自旋鎖 169 7.5.1 自旋鎖的使用 169 7.5.2 讀寫自旋鎖 173 7.5.3 順序鎖 174 7.5.4 讀-複製-更新 176 7.6 信號量 181 7.7 相互排斥體 183 7.8 完畢量 184 7.9 添加併發控制後的globalmem的設備驅動 185 7.10 總結 188 第8章 Linux設備驅動中的堵塞與非堵塞I/O 189 8.1 堵塞與非堵塞I/O 189 8.1.1 等待隊列 191 8.1.2 支持堵塞操做的globalfifo設備驅動 194 8.1.3 在用戶空間驗證globalfifo的讀寫 198 8.2 輪詢操做 198 8.2.1 輪詢的概念與做用 198 8.2.2 應用程序中的輪詢編程 199 8.2.3 設備驅動中的輪詢編程 201 8.3 支持輪詢操做的globalfifo驅動 202 8.3.1 在globalfifo驅動中添加輪詢操做 202 8.3.2 在用戶空間中驗證globalfifo設備的輪詢 203 8.4 總結 205 第9章 Linux設備驅動中的異步通知與異步I/O 206 9.1 異步通知的概念與做用 206 9.2 Linux異步通知編程 207 9.2.1 Linux信號 207 9.2.2 信號的接收 208 9.2.3 信號的釋放 210 9.3 支持異步通知的globalfifo驅動 212 9.3.1 在globalfifo驅動中添加異步通知 212 9.3.2 在用戶空間中驗證globalfifo的異步通知 214 9.4 Linux異步I/O 215 9.4.1 AIO概念與GNU C庫AIO 215 9.4.2 Linux內核AIO與libaio 219 9.4.3 AIO與設備驅動 222 9.5 總結 223 第10章 中斷與時鐘 224 10.1 中斷與定時器 224 10.2 Linux中斷處理程序架構 227 10.3 Linux中斷編程 228 10.3.1 申請和釋放中斷 228 10.3.2 使能和屏蔽中斷 230 10.3.3 底半部機制 230 10.3.4 實例:GPIO按鍵的中斷 235 10.4 中斷共享 237 10.5 內核定時器 238 10.5.1 內核定時器編程 238 10.5.2 內核中延遲的工做delayed_work 242 10.5.3 實例:秒字符設備 243 10.6 內核延時 247 10.6.1 短延遲 247 10.6.2 長延遲 248 10.6.3 睡着延遲 248 10.7 總結 250 第11章 內存與I/O訪問 251 11.1 CPU與內存、I/O 251 11.1.1 內存空間與I/O空間 251 11.1.2 內存管理單元 252 11.2 Linux內存管理 256 11.3 內存存取 261 11.3.1 用戶空間內存動態申請 261 11.3.2 內核空間內存動態申請 262 11.4 設備I/Oport和I/O內存的訪問 267 11.4.1 Linux I/Oport和I/O內存訪問接口 267 11.4.2 申請與釋放設備的I/Oport和I/O內存 268 11.4.3 設備I/Oport和I/O內存訪問流程 269 11.4.4 將設備地址映射到用戶空間 270 11.5 I/O內存靜態映射 276 11.6 DMA 277 11.6.1 DMA與Cache一致性 278 11.6.2 Linux下的DMA編程 279 11.7 總結 285 第12章 Linux設備驅動的軟件架構思想 286 12.1 Linux驅動的軟件架構 286 12.2 platform設備驅動 290 12.2.1 platform總線、設備與驅動 290 12.2.2 將globalfifo做爲platform設備 293 12.2.3 platform設備資源和數據 295 12.3 設備驅動的分層思想 299 12.3.1 設備驅動核心層和例化 299 12.3.2 輸入設備驅動 301 12.3.3 RTC設備驅動 306 12.3.4 Framebuffer設備驅動 309 12.3.5 終端設備驅動 311 12.3.6 misc設備驅動 316 12.3.7 驅動核心層 321 12.4 主機驅動與外設驅動分離的設計思想 321 12.4.1 主機驅動與外設驅動分離 321 12.4.2 Linux SPI主機和設備驅動 322 12.5 總結 330 第13章 Linux塊設備驅動 331 13.1 塊設備的I/O操做特色 331 13.2 Linux塊設備驅動結構 332 13.2.1 block_device_operations結構體 332 13.2.2 gendisk結構體 334 13.2.3 bio、request和request_queue 335 13.2.4 I/O調度器 339 13.3 Linux塊設備驅動的初始化 340 13.4 塊設備的打開與釋放 342 13.5 塊設備驅動的ioctl函數 342 13.6 塊設備驅動的I/O請求處理 343 13.6.1 使用請求隊列 343 13.6.2 不使用請求隊列 347 13.7 實例:vmem_disk驅動 349 13.7.1 vmem_disk的硬件原理 349 13.7.2 vmem_disk驅動模塊的載入與卸載 349 13.7.3 vmem_disk設備驅動的block_device_operations 351 13.7.4 vmem_disk的I/O請求處理 352 13.8 Linux MMC子系統 354 13.9 總結 357 第14章 Linux網絡設備驅動 358 14.1 Linux網絡設備驅動的結構 358 14.1.1 網絡協議接口層 359 14.1.2 網絡設備接口層 363 14.1.3 設備驅動功能層 367 14.2 網絡設備驅動的註冊與註銷 367 14.3 網絡設備的初始化 369 14.4 網絡設備的打開與釋放 370 14.5 數據發送流程 371 14.6 數據接收流程 372 14.7 網絡鏈接狀態 375 14.8 參數設置和統計數據 377 14.9 DM9000網卡設備驅動實例 380 14.9.1 DM9000網卡硬件描寫敘述 380 14.9.2 DM9000網卡驅動設計分析 380 14.10 總結 386 第15章 Linux I2C核心、總線與設備驅動 387 15.1 Linux I2C體系結構 387 15.2 Linux I2C核心 394 15.3 Linux I2C適配器驅動 396 15.3.1 I2C適配器驅動的註冊與註銷 396 15.3.2 I2C總線的通訊方法 397 15.4 Linux I2C設備驅動 399 15.4.1 Linux I2C設備驅動的模塊載入與卸載 400 15.4.2 Linux I2C設備驅動的傳輸數據 400 15.4.3 Linux的i2c-dev.c文件分析 400 15.5 Tegra I2C總線驅動實例 405 15.6 AT24xx EEPROM的I2C設備驅動實例 410 15.7 總結 413 第16章 USB主機、設備與Gadget驅動 414 16.1 Linux USB驅動層次 414 16.1.1 主機側與設備側USB驅動 414 16.1.2 設備、配置、接口、端點 415 16.2 USB主機控制器驅動 420 16.2.1 USB主機控制器驅動的整體結構 420 16.2.2 實例:Chipidea USB主機驅動 425 16.3 USB設備驅動 425 16.3.1 USB設備驅動的整體結構 425 16.3.2 USB請求塊 430 16.3.3 探測和斷開函數 435 16.3.4 USB骨架程序 436 16.3.5 實例:USB鍵盤驅動 443 16.4 USB UDC與Gadget驅動 446 16.4.1 UDC和Gadget驅動的重要數據結構與API 446 16.4.2 實例:Chipidea USB UDC驅動 451 16.4.3 實例:Loopback Function驅動 453 16.5 USB OTG驅動 456 16.6 總結 458 第17章 I2C、SPI、USB驅動架構類比 459 17.1 I2C、SPI、USB驅動架構 459 17.2 I2C主機和外設眼裏的Linux世界 460 第18章 ARM Linux設備樹 461 18.1 ARM設備樹起源 461 18.2 設備樹的組成和結構 462 18.2.1 DTS、DTC和DTB等 462 18.2.2 根節點兼容性 468 18.2.3 設備節點兼容性 470 18.2.4 設備節點及label的命名 475 18.2.5 地址編碼 477 18.2.6 中斷鏈接 479 18.2.7 GPIO、時鐘、pinmux鏈接 480 18.3 由設備樹引起的BSP和驅動變動 484 18.4 常用的OF API 490 18.5 總結 493 第19章 Linux電源管理的系統架構和驅動 494 19.1 Linux電源管理的全局架構 494 19.2 CPUFreq驅動 495 19.2.1 SoC的CPUFreq驅動實現 495 19.2.2 CPUFreq的策略 501 19.2.3 CPUFreq的性能測試和調優 501 19.2.4 CPUFreq通知 502 19.3 CPUIdle驅動 504 19.4 PowerTop 508 19.5 Regulator驅動 508 19.6 OPP 511 19.7 PM QoS 515 19.8 CPU熱插拔 518 19.9 掛起到RAM 522 19.10 執行時的PM 528 19.11 總結 534 第20章 Linux芯片級移植及底層驅動 535 20.1 ARM Linux底層驅動的組成和現狀 535 20.2 內核節拍驅動 536 20.3 中斷控制器驅動 541 20.4 SMP多核啓動以及CPU熱插拔驅動 549 20.5 DEBUG_LL和EARLY_PRINTK的設置 556 20.6 GPIO驅動 557 20.7 pinctrl驅動 560 20.8 時鐘驅動 572 20.9 dmaengine驅動 578 20.10 總結 580 第21章 Linux設備驅動的調試 581 21.1 GDB調試器的使用方法 581 21.1.1 GDB的基本使用方法 581 21.1.2 DDD圖形界面調試工具 591 21.2 Linux內核調試 594 21.3 內核信息打印——printk() 596 21.4 DEBUG_LL和EARLY_PRINTK 599 21.5 使用「/proc」 600 21.6 Oops 606 21.7 BUG_ON()和WARN_ON() 608 21.8 strace 609 21.9 KGDB 610 21.10 使用仿真器調試內核 612 21.11 應用程序調試 613 21.12 Linux性能監控與調優工具 616 21.13 總結 618