首页 > 编程知识 正文

linux的tmp目录大小限制

时间:2023-05-06 18:16:33 阅读:185189 作者:1916

kmalloc是通过cache来实现的, 只不过每次kmalloc的大小不同, 因此是从不同的cache中分配:

/* include/linux/slab.h */

// 注意kmalloc是在头文件中定义的

static inline void *kmalloc(size_t size, gfp_t flags)

{

if (__builtin_constant_p(size)) {

/*__builtin_constant_p 用于判断一个值是否为编译时常数,如果参数size的值是常数,函数返

* 回 1,否则返回 0。__builtin_constant_p是GCC的内建函数*/

// 以下是找一个对象大小刚好大于等于size的cache

int i = 0;

#define CACHE(x)

if (size <= x)

goto found;

else

i++;

#include "kmalloc_sizes.h"

#undef CACHE

{

extern void __you_cannot_kmalloc_that_much(void);

__you_cannot_kmalloc_that_much();

}

found:

// 实际还是通过kmem_cache_alloc来分配内存空间, 因此也是cache

return kmem_cache_alloc((flags & GFP_DMA) ?

malloc_sizes[i].cs_dmacachep :

malloc_sizes[i].cs_cachep, flags);

}

// 通过该函数最后也是由__cache_alloc()函数来分配空间

return __kmalloc(size, flags);

}

// 这是kmalloc_sizes.h文件内容, 实际就是定义CACHE中可用的对象大小

// 普通情况下最大是128K, 也就是kmalloc能分配的最大内存量

#if (PAGE_SIZE == 4096)

CACHE(32)

#endif

CACHE(64)

#if L1_CACHE_BYTES < 64

CACHE(96)

#endif

CACHE(128)

#if L1_CACHE_BYTES < 128

CACHE(192)

#endif

CACHE(256)

CACHE(512)

CACHE(1024)

CACHE(2048)

CACHE(4096)

CACHE(8192)

CACHE(16384)

CACHE(32768)

CACHE(65536)

CACHE(131072)

#if (NR_CPUS > 512) || (MAX_NUMNODES > 256) || !defined(CONFIG_MMU)

CACHE(262144)

#endif

#ifndef CONFIG_MMU

CACHE(524288)

CACHE(1048576)

#ifdef CONFIG_LARGE_ALLOCS

CACHE(2097152)

CACHE(4194304)

CACHE(8388608)

CACHE(16777216)

CACHE(33554432)

#endif /* CONFIG_LARGE_ALLOCS */

#endif /* CONFIG_MMU

继续调用

void *__kmalloc(size_t size, gfp_t flags)

{

return __do_kmalloc(size, flags, NULL);

}

static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,

void *caller)

{

struct kmem_cache *cachep;

/* If you want to save a few bytes .text space: replace

* __ with kmem_.

* Then kmalloc uses the uninlined functions instead of the inline

* functions.

*/

cachep = __find_general_cachep(size, flags);

if (unlikely(cachep == NULL))

return NULL;

return __cache_alloc(cachep, flags, caller);

}

static inline struct kmem_cache *__find_general_cachep(size_t size, gfp_t gfpflags)

{

struct cache_sizes *csizep = malloc_sizes;

#if DEBUG

/* This happens if someone tries to call

* kmem_cache_create(), or __kmalloc(), before

* the generic caches are initialized.

*/

BUG_ON(malloc_sizes[INDEX_AC].cs_cachep == NULL);

#endif

while (size > csizep->cs_size)

csizep++;

/*

* Really subtle: The last entry with cs->cs_size==ULONG_MAX

* has cs_{dma,}cachep==NULL. Thus no special case

* for large kmalloc calls required.

*/

if (unlikely(gfpflags & GFP_DMA))

return csizep->cs_dmacachep;

return csizep->cs_cachep;

}

__find_general_cachep确定可以分配的空间大小由malloc_sizes结构体数组指定,在阅读mm/slab.c中它的定义如下

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。