内存管理API之kmem_cache_alloc
2018-01-24 08:15
1061 查看
void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)用于从缓存中申请内存。 其使用的例程如下: table->table = kmem_cache_alloc(amd_iommu_irq_cache, GFP_ATOMIC); if (!table->table) { kfree(table); table = NULL; goto out_unlock; } 其源码分析如下: void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) { #核心是调用slab_alloc 来申请 void *ret = slab_alloc(cachep, flags, _RET_IP_); #下面这两个函数是debug 用的 kasan_slab_alloc(cachep, ret, flags); trace_kmem_cache_alloc(_RET_IP_, ret, cachep->object_size, cachep->size, flags); return ret; } 其中slab_alloc 在slab/slub/slob 中都有实现,我们这里以slab中的实现为例: static __always_inline void * slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller) { unsigned long save_flags; void *objp; flags &= gfp_allowed_mask; #这个函数和后面的slab_post_alloc_hook 配合使用 cachep = slab_pre_alloc_hook(cachep, flags); if (unlikely(!cachep)) return NULL; cache_alloc_debugcheck_before(cachep, flags); #关闭本地cpu的中断 local_irq_save(save_flags); #开始从名字为cachep的缓存中申请内存 objp = __do_cache_alloc(cachep, flags); local_irq_restore(save_flags); objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller); prefetchw(objp); if (unlikely(flags & __GFP_ZERO) && objp) memset(objp, 0, cachep->object_size); slab_post_alloc_hook(cachep, flags, 1, &objp); return objp; }
相关文章推荐
- 内存管理API之kmem_cache_free
- 内存管理API之kmem_cache_create
- 内存管理API之kmem_cache_destroy
- 内存管理API之kmem_cache_zalloc
- 内存管理-SLAB(分配SLAB对象kmem_cache_alloc())
- 内存管理-SLAB(释放SLAB对象kmem_cache_free())
- kmalloc VS kmem_cache_alloc
- 内存管理API之alloc_pages
- 内核IPSec代码中xfrm_input.c中关于kmem_cache_alloc的使用分析
- 内存管理 初始化(七)kmem_cache_init_late 初始化slab分配器(下)
- Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
- 内存管理API之alloc_pages_exact
- kmalloc VS kmem_cache_alloc
- kmem_cache_alloc, kmem_cache_create, struct kmem_cache
- 内存管理API之alloc_vm_area
- Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- 核心游记之 内存管理 kmem_cache_init
- 高速dma缓冲使用。kmem_cache_alloc,kmem_cache_create,struct kmem_cache。内核dma
- 内存管理 初始化(五)kmem_cache_init 初始化slab分配器(上)
- kmalloc VS kmem_cache_alloc