摘录改写自 【奔跑吧 Linux内核 卷1:基础架构】第 3 章 内存管理之预备知识。
从 malloc 开始,我们会接触到虚拟内存(malloc 函数只是建立进程的虚拟地址空间,并没有分配实际的物理内存。当进程访问没有建立映射关系的虚拟内存时会自动的触发一个缺页中断)的概念。
要明白虚拟内存,你可能需要了解什么是 MMU、页表、物理内存、物理页面、映射关系、按需分配、缺页中断和写时复制等。
了解 MMU 时,除了要了解 MMU 的工作原理外,还要了解 Linux 内核如何建立页表项映射,其中包括用户空间页表的建立和内核空间页表的建立,以及内核是如何查询页表和修改页表的。
当了解物理内存和物理页面时,你会接触到 pglist_data、zone 和 page 等数据结构,这 3 个数据结构描述了系统中物理内存的组织架构。
当了解怎么分配物理页面时,会接触伙伴系统机制和页面分配器(内存管理中最复杂的代码之一)。
有了物理内存,那怎么和虚拟内存建立映射关系呢?采用建立页表的方法来建立映射关系。为什么和进程地址空间建立映射的页面中有的叫匿名页面,而有的叫高速缓存页面?
当了解 malloc 怎么分配物理内存时,你会接触到缺页中断,缺页中断的代码也是内存管理中最复杂的代码之一。
这时,虚拟内存和物理内存已经建立了映射关系,这是以页面为基础的,可是有时内核需要小于一个页面大小的内存,于是 slab 机制就诞生了。
如果用户持续分配和使用内存导致物理内存不足怎么办?页面回收机制和反向映射机制应用而生。
虚拟内存和物理内存的映射关系经常在建立后又被解除了,时间长了,系统物理页面布局变得凌乱不堪,碎片化严重,这时内核如果需要分配大内存块就会变得很困难,那么内存规整机制就诞生了。