本书基于Linux 5.0内核的源代码讲述Linux内核的调试技巧和案例。本书共6章。主要内容包括并发与同步,中断管理,内核调试和性能优化,基于x86_64的宕机难题解决方案,基于ARM64的宕机题解决方案,安全漏洞的产生原理与修复方案等。作者是一线芯片公司工程师,网称“笨叔”,还有章节打卡助读活动,题目邀请到了作者出题哇~ 感兴趣的网友,欢迎来参与~
如何申请
(1)往下滑到“产品资料”栏,可进一步了解书籍内容,章节设置;
(2)>>点击我要申请,认真填写申请理由、阅读分享计划等,即有机会免费获取书籍。
活动日程
申请时间:1月29日至2月25日
遴选公布:2月28日前,公布全部入围名单
阅读时间:3月6日-4月21日
颁奖时间:活动结束后两周内
阅读要求
(1)收到书籍后,请在EEWorld 嵌入式系统编程版块 自拟标题发表阅读心得,活动期间内,至少分享3篇具有实质性内容的心得,进度为至少每15天提交一篇,要求100%原创首发,抄袭会被封杀哦。心得可包含:书籍内容的评价、理解、尝试书中实验过程等;
(2)活动特邀请到作者笨叔出题,助力读者围读活动,参与者要求至少完成50%的章节问题打卡。
活动评奖
评委将对阅读心得质量、章节打卡任务完成度、分享及时性三方面进行评分。综合分=60%阅读心得质量+30%章节打卡完成度+10%及时性
综合分 | 奖励 |
综合分>=90分 | 保留阅读书籍+20威望+20芯积分 |
综合分>=75分 | 保留阅读书籍+10威望+10芯积分 |
综合分<75分 | 寄回阅读书籍 |
第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 乱序执行、异常处理和地址空间 308
6.2.2 修复方案:KPTI技术 309
6.3 CPU“幽灵”漏洞 319
6.3.1 分支预测 319
6.3.2 攻击原理 322
6.3.3 修复方案 323
附录A 使用DS-5调试ARM64 Linux内核 327
附录B ARM64中的独占访问指令 341
附录C 图解MESI状态转换 345
附录D 高速缓存与内存屏障 350
赞助厂商
人民邮电出版社,1953年10月成立,隶属于中国工信出版传媒集团,是工业和信息化部主管的大型专业出版社。建社以来,人民邮电出版社始终坚持正确的出版导向,坚持为科技发展与社会进步服务、为繁荣社会主义文化服务,坚持积极进取、改革创新,围绕“立足工信事业,面向现代社会,传播科学知识,引领美好生活”的出版宗旨,已发展成为集图书、期刊、音像电子及数字出版于一体的综合性出版大社。
最新测评
热门测评心得
联系我们
微信号:helloeeworld
关注我们
电子工程世界 电子工程世界福利社