本书以相对独立于硬件的角度阐述Linux VM,试图弥补内存管理理论和在Linux中具体实现之间的差距,并且将两个部分结合起来,是当今最能够充分理解Linux VM的运行机制以及将理论和实现联系在一起的书籍。本书不是以讲述理论为目标,而是先讲述理论,再结合Linux的实现深入剖析其细节,使用函数调用图和系统架构图,一目了然,思路清晰,读者可以快速地掌握系统总体架构。内容涵盖物理内存、页表管理、进程地址空间、引导内存分配器、物理页面分配、非连续内存分配、Slab分配器、高端内存管理、页面帧回收、交换管理、共享内存虚拟文件系统等部分。
本书读者主要针对高等院校师生、研究机构科研人员、Linux内核开发人员、应用开发人员及系统管理人员,以及任何对VM或内核子系统运行机制感兴趣的爱好者。
VM的行为影响着Linux内核的每个子系统,并动态地改变整体性能。但直至目前,理解VM的惟一途径便是:逐行学习文档极少的源代码。而现在有了更简单快捷的可选方案。本书史无前例地详细描述了VM,不仅包括理论基础,而且还包括逐行的代码注释。它同样系统地涵盖了从物理内存描述到内存溢出管理的每个方面:
·Linux VM 2.4体系结构的层次,附图表和调用图
·物理内存描述、页表、地址空间和内存分配
·高端内存、交换、共享内存和更多的内容
·专家级地指导如何分析开源项目
·每个章节中有Linux 2.6内核的新特性
《深入理解Linux虚拟内存管理》将成为每个内核程序员和研究人员不可或缺的案头宝典。
第1章 简介
1.1 开始启程2
1.2 管理源码4
1.3 浏览代码9
1.4 阅读代码11
1.5 提交补丁12
第2章 描述物理内存
2.1 节点14
2.2 管理区16
2.3 管理区初始化21
2.4 初始化mem_map21
2.5 页面22
2.6 页面映射到管理区26
2.7 高端内存26
2.8 2.6中有哪些新特性27
第3章 页表管理
3.1 描述页目录30
3.2 描述页表项33
3.3 页表项的使用34
3.4 页表项的转换和设置36
3.5 页表的分配和释放36
3.6 内核页表37
3.7 地址和struct page之间的映射39
3.8 转换后援缓冲区(TLB)40
3.9 一级CPU高速缓存管理41
3.10 2.6中有哪些新特性44
第4章 进程地址空间
4.1 线性地址空间50
4.2 地址空间的管理52
4.3 进程地址空间描述符53
4.4 内存区域57
4.5 异常处理72
4.6 缺页中断74
4.7 复制到用户空间/从用户空间复制81
4.8 2.6中有哪些新特性82
第5章 引导内存分配器
5.1 表示引导内存映射88
5.2 初始化引导内存分配器89
5.3 初始化bootmem_data89
5.4 分配内存90
5.5 释放内存91
5.6 销毁引导内存分配器91
5.7 2.6中有哪些新特性93
第6章 物理页面分析
6.1 管理空闲块94
6.2 分配页面96
6.3 释放页面98
6.4 获得空闲页面(GFP)标志位99
6.5 进程标志位101
6.6 防止碎片102
6.7 2.6中有哪些新特性102
第7章 非连续内存分配
7.1 描述虚拟内存区105
7.2 分配非连续区域106
7.3 释放非连续内存108
7.4 2.6中有哪些新特性109
第8章 Slab分配器
8.1 高速缓存113
8.2 Slabs124
8.3 对象131
8.4 指定大小的高速缓存133
8.5 perCPU 对象高速缓存135
8.6 初始化slab分配器137
8.7 伙伴分配器接口138
8.8 2.6中有哪些新特性138
第9章 高端内存管理
9.1 管理PKMap地址空间140
9.2 映射高端内存页面141
9.3 解除页面映射143
9.4 原子性的映射高端内存页面143
9.5 弹性缓冲区144
9.6 紧急池146
9.7 2.6中有哪些新特性147
第10章 页面帧回收
10.1 页面替换策略150
10.2 页面高速缓存151
10.3 LRU链表156
10.4 收缩所有的高速缓存159
10.5 换出进程页面161
10.6 页面换出守护程序(kswapd)162
10.7 2.6中有哪些新特性162
第11章 交换管理
11.1 描述交换区166
11.2 映射页表项到交换项169
11.3 分配一个交换槽170
11.4 交换区高速缓存171
11.5 从后援存储器读取页面174
11.6 向后援存储器写页面174
11.7 读/写交换区域的块175
11.8 激活一个交换区177
11.9 禁止一个交换区178
11.10 2.6中有哪些新特性179
第12章 共享内存虚拟文件系统
12.1 初始化虚拟文件系统181
12.2 使用shmem函数182
12.3 在tmpfs中创建文件184
12.4 虚拟文件中的缺页中断186
12.5 tmps中的文件操作188
12.6 tmpfs中的索引节点操作188
12.7 建立共享区189
12.8 System V IPC189
12.9 2.6中有哪些新特性192
第13章 内存溢出管理
13.1 检查可用内存193
13.2 确定OOM状态194
13.3 选择进程194
13.4 杀死选定的进程195
13.5 是这样吗?195
13.6 2.6中有哪些新特性195
第14章 结束语
附录A 介绍
附录B 描述物理内存
B.1 初始化管理区201
B.2 页面操作214
附录C 页表管理
C.1 初始化页表219
C.2 遍历页表227
附录D 进程地址空间
D.1 进程内存描述符232
D.2 创建内存区域239
D.3 查找内存区域285
D.4 对内存区域上锁和解锁291
D.5 缺页中断304
D.6 页面相关的磁盘I/O330
附录E 启动内存分配
E.1 初始化引导内存分配器370
E.2 分配内存372
E.3 释放内存381
E.4 释放引导内存分配器383
附录F 物理页面分配
F.1 分配页面391
F.2 分配辅助函数402
F.3 释放页面404
F.4 释放辅助函数409
附录G 不连续内存分配
G.1 分配一块非连续的区域411
G.2 释放一块非连续区域420
附录H Slab分配器
H.1 高速缓存控制427
H.2 Slabs446
H.3 对象452
H.4 指定大小的高速缓存466
H.5 PerCPU 对象高速缓存469
H.6 初始化Slab分配器476
H.7 与伙伴分配器的接口477
附录I 高端内存管理
I.1 映射高端内存页面479
I.2 自动映射高端内存页面484
I.3 解除页面映射485
I.4 自动解除高端内存页面映射487
I.5 弹性缓冲区488
I.6 紧急池495
附录J 页面帧回收
J.1 页面高速缓存操作500
J.2 LRU链表操作510
J.3 重填充inactive_list514
J.4 从LRU链表回收页面515
J.5 收缩所有高速缓存522
J.6 换出进程页面525
J.7 页面交换守护程序536
附录K 交换管理
K.1 查找空闲项543
K.2 交换高速缓存548
K.3 交换区I/O555
K.4 激活一个交换区564
K.5 禁止一个交换区575
附录L 共享内存虚拟文件系统
L.1 初始化shmfs591
L.2 在tmpfs中创建文件596
L.3 tmpfs中的文件操作600
L.4 tmpfs中的索引节点操作613
L.5 虚拟文件中的缺页中断622
L.6 交换空间交互633
L.7 建立共享区639
L.8 System V IPC642
附录M 内存溢出管理
M.1 确定可用内存650
M.2 检查OOM并从中恢复652
参考文献