- 论坛徽章:
- 0
|
回复 7# B_C_1024
kmalloc过程
static __always_inline void *kmalloc(size_t size, gfp_t flags)//kmalloc的flags一般为GFP_KERNEL和GFP_ATOMIC,表示从低端分配
return __kmalloc(size, flags);
__do_kmalloc(size, flags, 0);
cachep = kmalloc_slab(size, flags);
ret = slab_alloc(cachep, flags, caller);
objp = __do_cache_alloc(cachep, flags);
____cache_alloc(cachep, flags);
objp = cache_alloc_refill(cachep, flags, force_refill);
x = cache_grow(cachep, flags | GFP_THISNODE, node, NULL);
BUG_ON(flags & GFP_SLAB_BUG_MASK) //GFP_SLAB_BUG_MASK = (__GFP_DMA32|__GFP_HIGHMEM|~__GFP_BITS_MASK)
local_flags = flags & (GFP_CONSTRAINT_MASK|GFP_RECLAIM_MASK);//清除高端内存标志
objp = kmem_getpages(cachep, local_flags, nodeid);
page = alloc_pages_exact_node(nodeid, flags | __GFP_NOTRACK, cachep->gfporder);
__alloc_pages(gfp_mask, order, node_zonelist(nid, gfp_mask));
return page_address(page);
slabp = alloc_slabmgmt(cachep, objp, offset,local_flags & ~GFP_CONSTRAINT_MASK, nodeid);
slabp = kmem_cache_alloc_node(cachep->slabp_cache,local_flags, nodeid);
return kmem_cache_alloc(cachep, flags);
|
|