内存管理是Linux内核最为复杂且最为重要的部分,本文从原理及代码角度对Linux内存管理机制进行分析。
内存的划分
Linux将内存从大到小依次划分为Node(节点)->Zone(内存域)->Page(页):
- 节点:在大型结算及系统中,内存有不同的簇,依据对处理器距离的不同,访问这些簇有不同的代价。而这些簇就可以成为节点。例:在PC系统中可以理解为实际挂载的物理内存;在嵌入式系统中,有两块内存芯片A和B,分别代表一个节点。
- 内存域:内存域并不是物理存在的概念,是Linux系统对每个内存节点进行管理的单位,每个节点的内存域表示的是对该节点不同地址范围的划分。一般内存域有三种,分别为Normal、DMA和HighMem。
- 页:在每个内存域中,内存被划分为大小固定的块(32位系统一般为4K大小),为内核进行内存分配的基本单位(当然内核内存管理机制其实更为复杂,“基本单位”不代表每次分配内存最小就要分到4K。后边可以看到,当需要获取小于4K大小的内存时,内核有Slab分配器来满足要求)