读书人

不延续内存区得分配和释放

发布时间: 2012-09-27 11:11:17 作者: rapoo

不连续内存区得分配和释放

分配内存区:

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;}

我也知道有很多的细节都没有分析到位,但是我也没有办法,曾经想着把里面涉及到的每一个函数都分析到位,但是那样的话自己相当的痛苦,因为那样的结果就是很多天都没有办法前进一点,会让人相当的有挫败感,最后只能选择大概先都过一遍,因为自己是一个内核的初学者,而内核前后的关联又很大,也只能先过一遍,到后面我会重新回来看我写得博客,能增进一些分析就增进一些分析。如果您认为上面确实有很重要的地方我没有分析到,希望您指点。



读书人网 >软件架构设计

热点推荐