内存分配的API有:alloc_pages, kmalloc, slab分配,vmalloc, malloc,下面简单说明一下以上几个函数的差别:
alloc_pages:主要用来从buddy系统中分配内存,以页为单位分配区域需要通过gfp_flag指定,一般情况下会优先从highmem zone分配,返回的是分配到物理首个页面的管理结构体struct page,buddy里面页面的组织情况如下图:
alloc_pages返回的是满足条件的用于管理free_area中对应大小的block的page struct的地址,同时每个free_area元素的migrationtype中的内存block的管理者都通过page组成的lru链表管理,而alloc_pages返回的是通过list_entry来获取这个lru链表中的一个page struct返回,从管理页面的角度,buddy可以化成如下示意图:
而alloc_pages如果分配的order是小于等于4,则返回的是上图中其中一个page struct
kmalloc和slab:kmalloc是slab的一个通用分配内存API,slab分配器从buddy拿到需求大小且物理内存连续的物理页面个数,然后kmalloc再从slab分配器中获取需要的slab对象,slab对象大小可以为64,128,256等等个字