不连续内存区得分配和释放
分配内存区:
vmalloc是一个接口函数,内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。因为用于vmalloc的内存页总是必须映射在内核地址空间中,因此使用ZONE_HIGHMEM内存域的页要优于其他内存域。这使得内核可以节省比较宝贵的低端内存域,而又不会带来而外的坏处。因此,vmalloc是内核出于自身的目的使用高端内存页得少数情况之一。
内核在管理虚拟内存中的vmalloc区域时,内核必须跟踪哪些子区域被使用、哪些是空闲的。为此定义了一个数据结构,将所有使用的部分保存在一个链表中。
static struct vm_struct *__remove_vm_area(void *addr){struct vm_struct **p, *tmp;for (p = &vmlist ; (tmp = *p) != NULL ;p = &tmp->next) {//扫描vmlist,以找到相关项 if (tmp->addr == addr) goto found;}return NULL;found:unmap_vm_area(tmp);//使用找到的vm_struct实例,从页表删除不再需要的项。它还会更新CPU高速缓存*p = tmp->next;/* * Remove the guard page. */tmp->size -= PAGE_SIZE;//还需减去两个vmalloc内存区之间的一个警戒页return tmp;}