当前位置: IT大杂烩 > Ubuntu  > [Linux内存]vmalloc学习笔记

[Linux内存]vmalloc学习笔记

www.someabcd.com  网友分享于:Jun 8, 2018 5:59:34 PM

标签:

一:vmalloc
http://www.360doc.com/content/14/0614/13/18127083_386524093.shtml
1,vmalloc()的内核入口函数是kernel/mm/Vmalloc.c里的void *vmalloc(unsigned long size),size表示的是请求内核分配的字节数目。


从以上代码可知,vmalloc()主要是从高端内存区域去分配内存。
vmalloc()函数最终会调用到__vmalloc_node_range(unsigned long size,unsigned long align,unsigned long start,unsigned long end,gfp_t gfp_mask,,,,)函数
以上函数size表示的是具体分配的字节的大小,align表示对齐的大小,默认为1,start和end分别表示vmalloc分区区域的起始地址和结束地址,arm体系结构上默认如下:


__vmalloc_node_range所做的事情如下:
1. 首先检查请求分配的内存大小有没有超过最大的物理页面数。如果超过返回0,表示分配失败。
       size = PAGE_ALIGN(size);
       if (!size || (size >> PAGE_SHIFT) > num_physpages)
              return NULL;
2,调用__get_vm_area_node()函数,
 该函数作用,使用kmalloc在slab中,分配vm_struct数据结构。


 接下来在单链表vmlist中查找适合的位置,并将新的vm节点插入到单链表中。


3,调用__vmalloc_area_node()函数
  接下来初始化vm_struct结构中的pages和nr_pages字段。
 a)         初始化nr_pages字段
      nr_pages = (area->size - PAGE_SIZE) >> PAGE_SHIFT;
 b)        初始化pages数组
 计算数组大小
     array_size = (nr_pages * sizeof(struct page *));
 如果数组大小大于1个页面,在非连续区进行分配,否则在连续区进行分配


 从伙伴系统中进行物理内存页面的分配


    最后根据实际申请到的物理内存情况建立页表映射。刷新TLB标志
4,调用insert_vmalloc_vmlist()函数
    将vm_struct结构体插入到vmlist链表中
5,调用kmemleak_alloc()函数。

[Linux内存]vmalloc学习笔记

标签:

发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
Copyright ©2018  IT大杂烩  版权所有  京ICP备11030978号-1 网站地图