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