Linux高端内存映射(下)

2014-11-24 12:51:40 · 作者: · 浏览: 3

非连续内存分配是指将物理地址不连续的页框映射到线性地址连续的线性地址空间,主要应用于大容量的内存分配。采用这种方式分配内存的主要优点是避免了外部碎片,而缺点是必须打乱内核页表,而且访问速度较连续分配的物理页框慢。



相关阅读:


非连续内存分配的线性地址空间是从VMALLOC_START到VMALLOC_END(具体可以参见<>),共128M,每当内核要用vmalloc类的函数进行非连续内存分配,就会申请一个vm_struct结构来描述对应的vmalloc区,两个vmalloc区之间的间隔至少为一个页框的大小,即PAGE_SIZE。下图是非连续内存分配区的示意图



所有的vm_struct都会链入vmlist链表来管理,从2.6的某个内核版本开始,为了提高效率,内核又为vmalloc区添加了vmap_area结构和vm_struct共同描述,并且引入了红黑树来组织这些结构,鉴于红黑树的复杂,为了简化讨论,把重心放在非连续内存分配的机制上,涉及到vmap_area的具体代码不做详细的分析。


数据结构描述


在分析具体的代码之前,我们先了解描述vmalloc区的这两个数据结构