这书內容根据Linux4.x内核,关键选择了Linux内核中较为基础和常见的内存管理、进程管理、高并发与同歩,及其终断管理方法这4个内核控制模块开展叙述。本书共分成6章,先后详细介绍了ARM系统架构、Linux内存管理、进程调度管理方法、高并发与同歩、终断管理方法、内核调节方法等內容。这书的各节內容全是一个Linux内核的话题讨论或是技术性点,阅读者能够依据每小标题前的难题开展思索,从而紧紧围绕难题开展内核源码的剖析。
这书主题鲜明,解读清楚深入,不但合适有一定Linux相关基本的工作人员,包含从业与Linux相关的开发人员、电脑操作系统的科学研究工作人员、内嵌式开发人员及Android最底层开发人员等学习和应用,并且合适做为对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