内容简介 · · · · · ·
本书内容基于Linux4.x内核,主要选取了Linux内核中比较基本和常用的内存管理、进程管理、并发与同步,以及中断管理这4个内核模块进行讲述。全书共分为6章,依次介绍了ARM体系结构、Linux内存管理、进程调度管理、并发与同步、中断管理、内核调试技巧等内容。本书的每节内容都是一个Linux内核的话题或者技术点,读者可以根据每小节前的问题进行思考,进而围绕问题进行内核源代码的分析。
本书内容丰富,讲解清晰透彻,不仅适合有一定Linux相关基础的人员,包括从事与Linux相关的开发人员、操作系统的研究人员、嵌入式开发人员及Android底层开发人员等学习和使用,而且适合作为对Linux感兴趣的程序员的学习用书,也可以作为大专院校相关专业师生的学习用书和培训学校的教材。
作者简介 · · · · · ·
张天飞,笔名“笨叔叔”。Linux内核爱好者,从事Linux内核和驱动开发十余年,在多家芯片公司从事过手机芯片底层软件开发和客户支持工作。
目录 · · · · · ·
LINUX内核奔跑卷 1
第1章 处理器体系结构 4
本章思考题 4
第2章 内存管理 32
本章思考题 32
2.1 物理内存初始化 36
2.1.1 内存管理概述 36
2.1.2 内存大小 37
2.1.3 物理内存映射 38
2.1.4 zone初始化 40
2.1.5 空间划分 44
2.1.6 物理内存初始化 45
2.2 页表的映射过程 51
2.2.1 ARM32页表映射 51
2.2.2 ARM64页表映射 60
2.3 内核内存的布局图 67
2.3.1 ARM32内核内存布局图 67
2.3.2 ARM64内核内存布局图 70
2.4 分配物理页面 72
2.4.1 伙伴系统分配内存 72
2.4.2 释放页面 85
2.4.3 小结 89
2.5 slab分配器 90
2.5.1 创建slab描述符 91
2.5.2 分配slab对象 103
2.5.3 释放slab缓冲对象 108
2.5.4 kmalloc分配函数 111
2.5.5 小结 112
2.6 vmalloc 113
2.7 VMA操作 120
2.7.1 查找VMA 122
2.7.2 插入VMA 124
2.7.3 合并VMA 129
2.7.4 红黑树例子 131
2.7.5 小结 133
2.8 malloc 133
2.8.1 brk实现 134
2.8.2 VM_LOCK情况 138
2.8.3 小结 148
2.9 mmap 150
2.9.1 mmap概述 151
2.9.2 小结 153
2.10 缺页中断处理 155
2.10.1 do_page_fault() 157
2.10.2 匿名页面缺页中断 165
2.10.3 文件映射缺页中断 169
2.10.4 写时复制 175
2.10.5 小结 183
2.11 page引用计数 184
2.11.1 struct page数据结构 185
2.11.2 _count和_mapcount的区别 188
2.11.3 页面锁PG_Locked 192
2.11.4 小结 192
2.12 反向映射RMAP 192
2.12.1 父进程分配匿名页面 193
2.12.2 父进程创建子进程 198
2.12.3 子进程发生COW 200
2.12.4 RMAP应用 201
2.12.5 小结 202
2.13 回收页面 204
2.13.1 LRU链表 204
2.13.2 kswapd内核线程 216
2.13.3 balance_pgdat函数 219
2.13.4 shrink_zone函数 228
2.13.5 shrink_active_list函数 233
2.13.6 shrink_inactive_list函数 238
2.13.7 跟踪LRU活动情况 244
2.13.8 Refault Distance算法 244
2.13.9 小结 249
2.14 匿名页面生命周期 251
2.14.1 匿名页面的诞生 251
2.14.2 匿名页面的使用 252
2.14.3 匿名页面的换出 252
2.14.4 匿名页面的换入 254
2.14.5 匿名页面销毁 254
2.15 页面迁移 254
migrate_pages()函数 255
2.16 内存规整(memory compaction) 262
2.16.1 内存规整实现 263
2.16.2 小结 272
2.17 KSM 273
2.17.1 KSM实现 274
2.17.2 匿名页面和KSM页面的区别 293
2.17.3 小结 294
2.18 Dirty COW内存漏洞 296
2.19 总结内存管理数据结构和API 309
2.19.1 内存管理数据结构的关系图 309
2.19.2 内存管理中常用API 312
2.20 最新更新和展望 315
2.20.1 页面回收策略从zone迁移到node 315
2.20.2 OOM Killer改进 316
2.20.3 swap优化 317
2.20.4 展望 318
第3章 进程管理 319
本章思考题 319
3.1 进程的诞生 320
3.1.1 init进程 321
3.1.2 fork 325
3.1.3 小结 344
3.2 CFS调度器 345
3.2.1 权重计算 346
3.2.2 进程创建 358
3.2.3 进程调度 369
3.2.4 scheduler tick 379
3.2.5 组调度 382
3.2.6 PELT算法改进 386
3.2.7 小结 387
3.3 SMP负载均衡 389
3.3.1 CPU域初始化 389
3.3.2 SMP负载均衡 401
3.3.3 唤醒进程 415
3.3.4 调试 421
3.3.5 小结 422
3.4 HMP调度器 422
3.4.1 初始化 423
3.4.2 HMP负载调度 425
3.4.3 新创建的进程 436
3.4.4 小结 437
3.5 NUMA调度器 438
3.5.1 node和page的关系 439
3.5.2 扫描进程 441
3.5.3 NUMA缺页中断 442
3.5.4 进程迁移 450
3.5.5 小结 455
3.6 EAS绿色节能调度器 457
3.6.1 能效模型 459
3.6.2 WALT算法 465
3.6.3 唤醒进程 480
3.6.4 CPU动态调频 491
3.6.5 小结 494
3.7 实时调度 496
3.8 最新更新与展望 500
3.8.1 进程管理更新 500
3.8.2 展望 500
第4章 并发与同步 501
本章思考题 501
4.1 原子操作与内存屏障 503
4.1.1 原子操作 503
4.1.2 内存屏障 506
4.2 spinlock 508
4.2.1 spinlock实现 509
4.2.2 spinlock变种 511
4.2.3 spinlock和raw_spin_lock 512
4.3 信号量 513
4.3.1 信号量 513
4.3.2 小结 516
4.4 Mutex互斥体 517
4.4.1 MCS锁机制 518
4.4.2 Mutex锁的实现 525
4.4.3 小结 531
4.5 读写锁 531
4.5.1 读者信号量 532
4.5.2 写者锁 538
4.5.3 小结 544
4.6 RCU 544
4.6.1 经典RCU和Tree RCU 547
4.6.2 Tree RCU设计 551
4.6.3 小结 573
4.7 内存管理中的锁 574
4.8 最新更新与展望 584
4.8.1 Queued Spinlock 584
4.8.2 读写信号量优化 591
4.8.3 展望 592
4.8.4 推荐书籍 593
第5章 中断管理 594
本章思考题 594
5.1 Linux中断管理机制 595
5.1.1 ARM中断控制器 595
5.1.2 硬件中断号和Linux中断号的映射 599
5.1.3 注册中断 610
5.1.4 ARM底层中断处理 618
5.1.5 高层中断处理 626
5.1.6 小结 636
5.2 软中断和tasklet 637
5.2.1 SoftIRQ软中断 638
5.2.2 tasklet 642
5.2.3 local_bh_disable/local_bh_enable 647
5.2.4 小结 649
5.3 workqueue工作队列 650
5.3.1 初始化工作队列 652
5.3.2 创建工作队列 659
5.3.3 调度一个work 665
5.3.4 取消一个work 675
5.3.5 和调度器的交互 680
5.3.6 小结 682
第6章 内核调试 684
6.1 QEMU调试Linux内核 684
6.1.1 QEMU运行ARM Linux内核 684
6.1.2 QEMU调试ARM Linux内核 687
6.1.3 QEMU运行ARMv8开发平台 688
6.1.4 文件系统支持 690
6.1.5 图形化调试 691
6.1.6 实验进阶 693
6.2 ftrace 694
6.2.1 irqs跟踪器 695
6.2.2 preemptoff跟踪器 696
6.2.3 preemptirqsoff跟踪器 697
6.2.4 function跟踪器 698
6.2.5 动态ftrace 699
6.2.6 事件跟踪 700
6.2.7 添加tracepoint 702
6.2.8 trace-cmd和kernelshark 705
6.2.9 trace marker 707
6.2.10 小结 709
6.3 SystemTap 710
6.4 内存检测 714
6.4.1 slub_debug 714
6.4.2 内存泄漏检测kmemleak 718
6.4.3 kasan内存检测 720
6.5 死锁检测 722
6.6 内核调试秘籍 728
6.6.1 printk 728
6.6.2 动态打印 730
6.6.3 RAM Console 731
6.6.4 OOPS分析 731
6.6.5 BUG_ON()和WARN_ON() 734
· · · · · · (收起)
第1章 处理器体系结构 4
本章思考题 4
第2章 内存管理 32
本章思考题 32
2.1 物理内存初始化 36
2.1.1 内存管理概述 36
2.1.2 内存大小 37
2.1.3 物理内存映射 38
2.1.4 zone初始化 40
2.1.5 空间划分 44
2.1.6 物理内存初始化 45
2.2 页表的映射过程 51
2.2.1 ARM32页表映射 51
2.2.2 ARM64页表映射 60
2.3 内核内存的布局图 67
2.3.1 ARM32内核内存布局图 67
2.3.2 ARM64内核内存布局图 70
2.4 分配物理页面 72
2.4.1 伙伴系统分配内存 72
2.4.2 释放页面 85
2.4.3 小结 89
2.5 slab分配器 90
2.5.1 创建slab描述符 91
2.5.2 分配slab对象 103
2.5.3 释放slab缓冲对象 108
2.5.4 kmalloc分配函数 111
2.5.5 小结 112
2.6 vmalloc 113
2.7 VMA操作 120
2.7.1 查找VMA 122
2.7.2 插入VMA 124
2.7.3 合并VMA 129
2.7.4 红黑树例子 131
2.7.5 小结 133
2.8 malloc 133
2.8.1 brk实现 134
2.8.2 VM_LOCK情况 138
2.8.3 小结 148
2.9 mmap 150
2.9.1 mmap概述 151
2.9.2 小结 153
2.10 缺页中断处理 155
2.10.1 do_page_fault() 157
2.10.2 匿名页面缺页中断 165
2.10.3 文件映射缺页中断 169
2.10.4 写时复制 175
2.10.5 小结 183
2.11 page引用计数 184
2.11.1 struct page数据结构 185
2.11.2 _count和_mapcount的区别 188
2.11.3 页面锁PG_Locked 192
2.11.4 小结 192
2.12 反向映射RMAP 192
2.12.1 父进程分配匿名页面 193
2.12.2 父进程创建子进程 198
2.12.3 子进程发生COW 200
2.12.4 RMAP应用 201
2.12.5 小结 202
2.13 回收页面 204
2.13.1 LRU链表 204
2.13.2 kswapd内核线程 216
2.13.3 balance_pgdat函数 219
2.13.4 shrink_zone函数 228
2.13.5 shrink_active_list函数 233
2.13.6 shrink_inactive_list函数 238
2.13.7 跟踪LRU活动情况 244
2.13.8 Refault Distance算法 244
2.13.9 小结 249
2.14 匿名页面生命周期 251
2.14.1 匿名页面的诞生 251
2.14.2 匿名页面的使用 252
2.14.3 匿名页面的换出 252
2.14.4 匿名页面的换入 254
2.14.5 匿名页面销毁 254
2.15 页面迁移 254
migrate_pages()函数 255
2.16 内存规整(memory compaction) 262
2.16.1 内存规整实现 263
2.16.2 小结 272
2.17 KSM 273
2.17.1 KSM实现 274
2.17.2 匿名页面和KSM页面的区别 293
2.17.3 小结 294
2.18 Dirty COW内存漏洞 296
2.19 总结内存管理数据结构和API 309
2.19.1 内存管理数据结构的关系图 309
2.19.2 内存管理中常用API 312
2.20 最新更新和展望 315
2.20.1 页面回收策略从zone迁移到node 315
2.20.2 OOM Killer改进 316
2.20.3 swap优化 317
2.20.4 展望 318
第3章 进程管理 319
本章思考题 319
3.1 进程的诞生 320
3.1.1 init进程 321
3.1.2 fork 325
3.1.3 小结 344
3.2 CFS调度器 345
3.2.1 权重计算 346
3.2.2 进程创建 358
3.2.3 进程调度 369
3.2.4 scheduler tick 379
3.2.5 组调度 382
3.2.6 PELT算法改进 386
3.2.7 小结 387
3.3 SMP负载均衡 389
3.3.1 CPU域初始化 389
3.3.2 SMP负载均衡 401
3.3.3 唤醒进程 415
3.3.4 调试 421
3.3.5 小结 422
3.4 HMP调度器 422
3.4.1 初始化 423
3.4.2 HMP负载调度 425
3.4.3 新创建的进程 436
3.4.4 小结 437
3.5 NUMA调度器 438
3.5.1 node和page的关系 439
3.5.2 扫描进程 441
3.5.3 NUMA缺页中断 442
3.5.4 进程迁移 450
3.5.5 小结 455
3.6 EAS绿色节能调度器 457
3.6.1 能效模型 459
3.6.2 WALT算法 465
3.6.3 唤醒进程 480
3.6.4 CPU动态调频 491
3.6.5 小结 494
3.7 实时调度 496
3.8 最新更新与展望 500
3.8.1 进程管理更新 500
3.8.2 展望 500
第4章 并发与同步 501
本章思考题 501
4.1 原子操作与内存屏障 503
4.1.1 原子操作 503
4.1.2 内存屏障 506
4.2 spinlock 508
4.2.1 spinlock实现 509
4.2.2 spinlock变种 511
4.2.3 spinlock和raw_spin_lock 512
4.3 信号量 513
4.3.1 信号量 513
4.3.2 小结 516
4.4 Mutex互斥体 517
4.4.1 MCS锁机制 518
4.4.2 Mutex锁的实现 525
4.4.3 小结 531
4.5 读写锁 531
4.5.1 读者信号量 532
4.5.2 写者锁 538
4.5.3 小结 544
4.6 RCU 544
4.6.1 经典RCU和Tree RCU 547
4.6.2 Tree RCU设计 551
4.6.3 小结 573
4.7 内存管理中的锁 574
4.8 最新更新与展望 584
4.8.1 Queued Spinlock 584
4.8.2 读写信号量优化 591
4.8.3 展望 592
4.8.4 推荐书籍 593
第5章 中断管理 594
本章思考题 594
5.1 Linux中断管理机制 595
5.1.1 ARM中断控制器 595
5.1.2 硬件中断号和Linux中断号的映射 599
5.1.3 注册中断 610
5.1.4 ARM底层中断处理 618
5.1.5 高层中断处理 626
5.1.6 小结 636
5.2 软中断和tasklet 637
5.2.1 SoftIRQ软中断 638
5.2.2 tasklet 642
5.2.3 local_bh_disable/local_bh_enable 647
5.2.4 小结 649
5.3 workqueue工作队列 650
5.3.1 初始化工作队列 652
5.3.2 创建工作队列 659
5.3.3 调度一个work 665
5.3.4 取消一个work 675
5.3.5 和调度器的交互 680
5.3.6 小结 682
第6章 内核调试 684
6.1 QEMU调试Linux内核 684
6.1.1 QEMU运行ARM Linux内核 684
6.1.2 QEMU调试ARM Linux内核 687
6.1.3 QEMU运行ARMv8开发平台 688
6.1.4 文件系统支持 690
6.1.5 图形化调试 691
6.1.6 实验进阶 693
6.2 ftrace 694
6.2.1 irqs跟踪器 695
6.2.2 preemptoff跟踪器 696
6.2.3 preemptirqsoff跟踪器 697
6.2.4 function跟踪器 698
6.2.5 动态ftrace 699
6.2.6 事件跟踪 700
6.2.7 添加tracepoint 702
6.2.8 trace-cmd和kernelshark 705
6.2.9 trace marker 707
6.2.10 小结 709
6.3 SystemTap 710
6.4 内存检测 714
6.4.1 slub_debug 714
6.4.2 内存泄漏检测kmemleak 718
6.4.3 kasan内存检测 720
6.5 死锁检测 722
6.6 内核调试秘籍 728
6.6.1 printk 728
6.6.2 动态打印 730
6.6.3 RAM Console 731
6.6.4 OOPS分析 731
6.6.5 BUG_ON()和WARN_ON() 734
· · · · · · (收起)
喜欢读"奔跑吧 Linux内核"的人也喜欢 · · · · · ·
奔跑吧 Linux内核的书评 · · · · · · ( 全部 3 条 )

帮助你学习Linux操作系统最关键的内核
这篇书评可能有关键情节透露
Linux操作系统已经部署到越来越多计算领域的系统中,理解操作系统内核的实现就变成一个具有极高价值的技能。《奔跑吧Linux内核》可以帮助你学习Linux操作系统最关键的内核,让你有足够多的知识去将Linux顺利应用到你所创造的新设备和新应用环境中。 —GregKroah-Hartman ... (展开)> 更多书评 3篇
论坛 · · · · · ·
在这本书的论坛里发言当前版本有售 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
- 我的编程之路 (Yun)
- 操作系统 (shawnfeng0)
- ARMq嵌入式 (物理就是没道理)
- 计算机材料 (鹤望兰)
- Unix&Linux (丹京)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
订阅关于奔跑吧 Linux内核的评论:
feed: rss 2.0
1 有用 aeiowx 2018-02-24 22:28:21
讲得很细,内存管理、进程调度、并发同步、中断管理4个部分用了600多页,但是很难懂,啃不下去。不推荐初学者读,属于没读懂系列。
0 有用 poincare 2018-12-19 13:20:34
不错吧
0 有用 usless 2020-01-04 15:59:38
有实验,不错
1 有用 towell 2018-03-20 09:31:15
错误太多,基本每隔两页就有错误,包括配图都错了,这书看着是真闹心。
0 有用 豆友254915719 2022-07-02 15:35:33
偏向于内存管理了。覆盖度可以再全面一些
0 有用 Wenix 2023-03-07 16:59:08 湖南
一坨答辩。作者几乎是每个都懂一点,但也仅仅就懂一点,但是他的表达能力非常差,总之不适合精看。 适合随遍过一眼混个眼熟
0 有用 豆友254915719 2022-07-02 15:35:33
偏向于内存管理了。覆盖度可以再全面一些
3 有用 阿德利臭企鹅 2022-06-05 21:17:26
只会对着代码一行行解释,而且话都讲不清楚。主要目的还是卖视频赚钱
3 有用 苏里南公牛 2022-02-28 23:51:52
网上都能找得到资料的地方拼命说;一到关键的需要实践过才能深刻认知理解的地方,就随便瞎说一通糊弄过去。
0 有用 0x7fff 2022-01-03 22:54:37
相当的硬核,但是离我应用层太遥远。