linux分配内核,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上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值