本文探讨了Linux操作系统中虚拟内存的核心机制,包括地址转换、内存映射和页式管理等关键技术,深入剖析其高效管理和使用内存的方法。
目录
第一章 Linux底层分段分页机制
1.1 基于x86的Linux分段机制
1.2 基于x86的Linux分页机制
1.2.1 页全局目录和页表
1.2.2 线性地址到物理地址转换
1.2.3 线性地址字段处理
1.2.4 页表处理
1.3 扩展分页与联想存储器
1.4 Linux内存布局
1.5 内核空间和用户空间
1.5.1 初始化临时内核页表
1.5.2 永久内核页表的初始化
1.5.3 第一次进入用户空间
1.5.4 内核映射机制实例
1.6 固定映射的线性地址
1.7 高端内存内核映射
1.8 永久内存映射
1.9 临时内核映射
第二章 内核级内存管理系统
2.1 Linux页面管理
2.1.1 NUMA架构
2.1.2 内存管理区
2.2 伙伴系统算法
2.2.1 数据结构
2.2.2 块分配
2.2.3 块释放
2.3 Linux页面级内存管理
2.3.1 分配一组页面
2.3.2 释放一组页面
2.4 每CPU页面高速缓存
2.4.1 数据结构
2.4.2 通过每CPU页高速缓存分配页面
2.4.3 释放页面到每CPU 页面高速缓存
2.5 slab分配器
2.5.1 数据结构
2.5.2 分配/释放slab页面
2.5.3 增加slab数据结构
2.5.4 高速缓存内存布局
2.5.5 slab着色
2.5.6 分配slab对象
2.5.7 释放Slab对象
2.5.8 通用对象
2.5.9 内存池
2.6 非连续内存区
2.6 高端内存区回顾
2.6 非连续内存区的描述符
2.7 分配非连续内存区
2.8 释放非连续内存区
第三章 进程的地址空间
3.1 用户态内存分配
3.1 mm_struct数据结构
3.2 内核线程的内存描述符
3.3 线性区的数据结构
3.4 红-黑树算法
3.5 线性区访问权限
3.6 线性区的底层处理
3.7 查找给定地址的最邻近区
3.8 查找一个与给定的地址区间相重叠的线性区
3.9 查找一个空闲的地址区间
3.10 向内存描述符链表中插入一个线性区
3.7 分配线性地址区间
3.8 释放线性地址区间
3.9 do_munmap()函数
3.10 split_vma()函数
3.11 unmap_region()函数
3.4 创建和删除进程的地址空间
3.5 创建进程的地址空间
3.6 删除进程的地址空间
3.7 内核线程1号的地址空间
3.8 堆的管理
第四章 磁盘文件内存映射
4.1 内存映射的数据结构
4.2 内存映射的创建
4.3 内存映射的请求调页
4.4 刷新内存映射的脏页
4.5 非线性内存映射
第五章 页面回收
5.1 页框回收概念
5.2 选择目标页
5.3 PFRA设计
5.2 反向映射技术
5.3 匿名页的反向映射
5.4 优先搜索树
5.5 映射页的反向映射
5.