linux 内核分配算法

分配 

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) 
直接从buddy系统中得到原始页。最原始的分配方式。 

slab分配器 

1. 通用 cache 
void *kmalloc(size_t size, gfp_t flags) 
kmalloc 基于如下几种size的mem cache:32, 64, 128, 256, 512, 1,024, 2,048, 4,096, 
8,192, 16,384, 32,768, 65,536 和 131,072 bytes。其本质也是调用kmem_cache_alloc来分配 
object。因此kmalloc一次最大可分配的size为128KB。kmalloc分配速度很快,在分配时需注意gfp flag 
参数:在不interrupt上下文(ISR, softirq, tasklet)及不可睡眠上下文使用GFP_ATOMIC。 
内核还增长了内存清零的分配函数:kzalloc。 

2. 专用 cache 
kmem_cache_create() 
void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) 
若是你须要频繁的分配和释放某个结构,建议不要采用kmalloc,而是本身在slab系统中建立memory cache。 
指定该结构的object size。分配时使用kmem_cache_alloc。一样的slab object大小也有限制,通常状况 
下一个MAX_OBJ_ORDER是5,也就是32个页,128KB。 

非连续内存分配 

void *vmalloc(unsigned long size) 
超过128KB的内存显然不能使用slab分配,而且当申请的连续内存大小不能在buddy系统中获得知足,那么 
就须要使用vmalloc。vmalloc为了把物理的非连续页一个个映射,从而致使比直接内存映射大的多的 
后援缓冲区抖动。除非须要特别大的内存,不然尽可能不要使用vmalloc。 

基于DMA 分配 

void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) 
在某些arch中,可使用dma_alloc_coherent来分配DMA专用内存。列入在arch/arm/mm/consistent.c 
中,该函数先分配最小可知足size的2^order内存,而后释放2^order-size多余的页给buddy。而arch/i386/ 
kernel/pci-dma.c中,则直接分配2^order块内存。 

直接映射分配 

ioremap(unsigned long phys_addr, size_t size) 
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, 
unsigned long pfn, unsigned long size, pgprot_t prot) 
在某些体系结构中,咱们能够保留memory map段上的某一个区域,做为dma或其余设备的专有内存。 
这段内存并不在kernel buddy的控制之下(没有被放入mem_maps),你也没法从以上几种分配方式中获得 
这些内存。这个时候,你能够用ioremap和remap_pfn_range将这段内存直接映射到vm上。
相关文章
相关标签/搜索