kmalloc和vmalloc完全不同。
kmalloc
kmalloc申请一段物理地址和逻辑地址连续的内存空间。
/* 申请一段物理地址连续的内存空间 */
static __always_inline void *kmalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) {
if (size > KMALLOC_MAX_CACHE_SIZE) //申请空间大于一个page_size
return kmalloc_large(size, flags);
#ifndef CONFIG_SLOB
/* 在未配置slob情况下:申请空间小于一个page_size:从slab中kmalloc_caches分配 */
if (!(flags & GFP_DMA)) {
int index = kmalloc_index(size);
if (!index)
return ZERO_SIZE_PTR;
return kmem_cache_alloc_trace(kmalloc_caches[index],
flags, size);
}
#endif
}
/* 在配置slob情况下:申请空间小于一个page_size:从slob中kmalloc_caches分配 */
return __kmalloc(size, flags);
}
在申请内存size>PAGE_SIZE的时候,从伙伴系统中分配page;
size<PAGE_SIZE时,从slab分配器中的kmalloc_caches缓存申请一个slab对象。
kmalloc_caches的具体设置如下:
struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH +