2. 非连续内存分配
vmalloc()是内核可以用来分配连续虚存,但非连续物理内存的方法。
对于内核,可以用来分配的虚存介于VMALLOC_START和VMALLOC_END之间。VMALLOC_START的起始位置取决于可用的物理l内存总量。因为是给不连续物理内存分配,所以每块物理单元都是用:vm_struct来描述。此结构很简单,包括单元块使用标志,起始地址,长度,及至向next的指针。
一个有意思的地方是,每一个离散的被分配的块之间至少会有一页的间隔,以此来避免overrun。
1. 分配/释放非连续区域
首先找到可以满足分配的足够大的一块区,再分配PGD条目,PMD条目,PTE条目,最后才分配页。释放的顺序正好相反,先释放PGD条目,PMD条目,PTE条目,最后是页。
Reference: <<Understanding the Linux Virtual Memory Manager>>