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 + 1];
EXPORT_SYMBOL(kmalloc_caches);

本文介绍了kmalloc和vmalloc两种内存分配方式在Linux内核中的不同。kmalloc提供物理和逻辑地址连续的内存,适用于小块内存分配,依赖于伙伴系统和slab分配器。而vmalloc则用于分配逻辑地址连续但物理地址不连续的内存,通过map_vm_area建立逻辑到物理地址映射。
最低0.47元/天 解锁文章
1350

被折叠的 条评论
为什么被折叠?



