广西风水宝地将军地:总结一下 Linux Kernel中内存分配方式
来源:百度文库 编辑:偶看新闻 时间:2024/07/08 08:15:32
上周针对一个内存fragment issue的研究,让我开始重新总结kernel里对内存分配的方式和方法,如有不对请指教:
页分配
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上。
页分配
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上。
a full Linux 2.4 kernel,翻译
linux kernel 2.6的网卡驱动下栽和设置?
谁帮我总结一下LINUX系统各个版本的功能
谁能总结一下英语口语中最常用动词
请问,“嵌入式Linux的Kernel的定制与移植”怎么翻译???
Linux Kernel怎么装啊?为什么我运行不了,我家操作系统是XP的。。。
有谁能总结一下呢!
帮忙总结一下时事政治
linux内存管理
怎么写总结一年过去了总结一下??
KERNEL不存在?
谁能帮我总结一下英语中有关于主语和谓语的相关知识
谁能总结一下<龙樱>中好的学习方法和经典语句?多谢!
谁能帮助总结一下高中化学中化合物和单质的颜色
能帮我总结一下英语中所有的时态吗(越具体越好)
我装Red Hat Linux.装完进入系统时出现.Kernel panic: Attempted to Kill init是怎么回事??
有没有能在64M内存中运行的Linux?
哪位总结一下英语词组
文艺片的导演总结一下
谁帮我总结一下
有谁能帮我总结一下立体几何
总结一下代词的用法
总结一下薛宝钗这个人
总结一下夏季奥运会的资料