1.前言
本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理。
本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础、虚拟地址空间的管理、物理地址空间的管理.
本文将主要以X86架构为例来介绍物理地址空间的管理。
请页机制可以为进程请求物理内存,如下将讲述物理内存在内核中如何管理和分配的
2.内核虚拟空间的划分
图 内核空间的划分图示
- 在IA-32体系结构上,内核空间的地址范围是PAGE_OFFSET~4G
- 内核空间的第一部分试图将物理内存的全部空间线性映射到虚拟地址空间中,最多只能映射high_memory(默认大小为896M)的物理内存,即将0~896M的物理内存直接映射
- 大于high_memory的物理内存将通过页表进行映射到内核空间的后半部分
- 0~high_memory称为低端内存,大于high_memory称为高端内存
3.内核虚拟地址和物理地址的转换
- __pa(vaddr)
返回vaddr虚拟地址所对应的物理地址,源码实现为:
- __va(paddr)
返回paddr物理地址所对应的虚拟地址,源码实现为:
注:如上两个函数仅限于内核空间低端物理内存(也就是内核空间线性映射部分)的地址转换
4. UMA和非UMA
- NUMA计算机(non-uniform memeory access)
总是多处理计算机,每个CPU拥有各自的本地内存,这样每个CPU都能以较快的速度访问本地的内存,各个CPU通过总线链接起来,也可以访问其它CPU的内存,不过速度会慢些
- UMA计算机(uniform memory access)
常见的计算机访问内存方式,无论多处理器还是单处理器都只能访问一整块内存
5. 物理内存的组织
为了兼容NUMA模型,内核引入了内存节点,每个节点关联一个CPU.各个节点又划分为几个内存区,每个内存区又包含若干个页框
物理内存在逻辑上被划分为三级结构,分别使用pg_data_t,zone和page这三种数据结构分别描述节点、区、物理页框
图 物理内存三级结构图示
- 内存节点(pg_data_t)
NUMA计算机中每个CPU的物理内存称为一个内存节点,通过pg_data_t数据结构描述,系统内所有节点形成一个双链表
UMA模型下的物理内存只对应一个内存节点,整个物理内存形成一个节点,因此上述节点链表只有一个元素
- 内存管理区(zone)
各个内存节点划分为若干个区,也是对物理内存的进一步划分。物理内存通过下面几个宏来标记不同的区:
ZONE_DMA:标记适合DMA范围的物理内存区
ZONE_NORMAL:可以直接线性映射到内核空间的物理内存区(0~896M的物理内存区)
ZONE_HIGHMEM:超出内核空间大小的物理内存区(即高于896M的物理内存区)
- 页框(page)
内核使用page结构体来描述一个物理页框,该结构也称为页描述符。
页框代表物理内存的最小单位,每个物理页框都关联这样一个结构体,所有的页描述符都存放在mem_map数组中
6. 物理内存管理机制
- 伙伴算法
负责大块连续物理内存的分配和释放,以页框为基本单位,可以避免外部碎片,可以分配20~210大小的物理内存块
- slab缓存
负责小块物理内存的分配,它也作为一个缓存,主要针对内核中经常分配并释放的对象
- per-cpu页框缓存
内核经常请求和释放单个页框,该缓存包含预先分配的页框,用于满足本地CPU发出的单一页框请求