linux内核Kmalloc范围,linux内核kmalloc和vmalloc的区别

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

kmalloc 和 vmalloc的区别

kmallocvoid *kmalloc(size_t size, gfp_t flags)

kmalloc是内核中最常用的一种内存分配方式,连续的物理内存。如果size是常量,调用kmem_cache_alloc_trace分配,否则调用__kmalloc分配。size如果是常量且大于4M,直接返回0(内核版本3.4.5);如果size是0,返回地址是((void *)16)。

vmallocvoid *vmalloc(unsigned long size)

kmalloc内存分配方式都是物理连续的,能保证较低的平均访问时间。但是在某些场合中,对内存区的请求不是很频繁,较高的内存访问时间也 可以接受,这是就可以分配一段线性连续,物理不连续的地址,带来的好处是一次可以分配较大块的内存。vmalloc对 一次能分配的内存大小没有明确限制。

kmalloc预处理后的代码static inline __attribute__((always_inline)) __attribute__((always_inline)) void *kmalloc(size_t size, gfp_t flags)

{

struct kmem_cache *cachep;

void *ret;

if (__builtin_constant_p(size)) {

int i = 0;

if (!size)

return ((void *)16);

# 1 "include/linux/kmalloc_sizes.h" 1

if (size <= 32) goto found; else i++;

if (size <= 64) goto found; else i++;

if (size <= 128) goto found; else i++;

if (size <= 192) goto found; else i++;

if (size <= 256) goto found; else i++;

if (size <= 512) goto found; else i++;

if (size <= 1024) goto found; else i++;

if (size <= 2048) goto found; else i++;

if (size <= 4096) goto found; else i++;

if (size <= 8192) goto found; else i++;

if (size <= 16384) goto found; else i++;

if (size <= 32768) goto found; else i++;

if (size <= 65536) goto found; else i++;

if (size <= 131072) goto found; else i++;

if (size <= 262144) goto found; else i++;

if (size <= 524288) goto found; else i++;

if (size <= 1048576) goto found; else i++;

if (size <= 2097152) goto found; else i++;

if (size <= 4194304) goto found; else i++;

# 145 "include/linux/slab_def.h" 2

return ((void *)0);

found:

cachep = malloc_sizes[i].cs_cachep;

ret = kmem_cache_alloc_trace(size, cachep, flags);

return ret;

}

return __kmalloc(size, flags);

}

void *__kmalloc(size_t size, gfp_t flags)

{

return __do_kmalloc(size, flags, ((void *)0));

}

static inline __attribute__((always_inline)) __attribute__((always_inline)) void *__do_kmalloc(size_t size, gfp_t flags, void *caller)

{

struct kmem_cache *cachep;

void *ret;

cachep = __find_general_cachep(size, flags);

if (__builtin_expect(!!(((unsigned long)(cachep) <= (unsigned long)((void *)16))), 0))

return cachep;

ret = __cache_alloc(cachep, flags, caller);

trace_kmalloc((unsigned long) caller, ret,

size, cachep->buffer_size, flags);

return ret;

}88x31.png

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

你可能感兴趣的:(linux内核Kmalloc范围,linux内核kmalloc和vmalloc的区别)