欢迎来到天天文库
浏览记录
ID:16486301
大小:184.00 KB
页数:4页
时间:2018-08-10
《linux内核中常见内存分配函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux内核中常见内存分配函数1.原理说明Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为:l页全局目录(PageGlobalDirectory)l页上级目录(PageUpperDirectory)l页中间目录(PageMiddleDirectory)l页表(PageTable)页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址,而页中间目录又包含
2、若干页表的地址,每一个页表项指向一个页框。Linux中采用4KB大小的页框作为标准的内存分配单元。多级分页目录结构1.1.伙伴系统算法在实际应用中,经常需要分配一组连续的页框,而频繁地申请和释放不同大小的连续页框,必然导致在已分配页框的内存块中分散了许多小块的空闲页框。这样,即使这些页框是空闲的,其他需要分配连续页框的应用也很难得到满足。为了避免出现这种情况,Linux内核中引入了伙伴系统算法(buddysystem)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,3
3、2,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合
4、并为一个较大的页框块。1.1.slab分配器slab分配器源于Solaris2.4的分配算法,工作于物理内存页框分配器之上,管理特定大小对象的缓存,进行快速而高效的内存分配。slab分配器为每种使用的内核对象建立单独的缓冲区。Linux内核已经采用了伙伴系统管理物理内存页框,因此slab分配器直接工作于伙伴系统之上。每种缓冲区由多个slab组成,每个slab就是一组连续的物理内存页框,被划分成了固定数目的对象。根据对象大小的不同,缺省情况下一个slab最多可以由1024个页框构成。出于对齐等其它方面的要
5、求,slab中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费。2.常用内存分配函数2.1.__get_free_pagesunsignedlong__get_free_pages(gfp_tgfp_mask,unsignedintorder)__get_free_pages函数是最原始的内存分配方式,直接从伙伴系统中获取原始页框,返回值为第一个页框的起始地址。__get_free_pages在实现上只是封装了alloc_pages函数,从代码分析,alloc_pages函数会分配
6、长度为1<7、*kmem_cache_create(constchar*name,size_tsize,size_talign,unsignedlongflags,void(*ctor)(void*,structkmem_cache*,unsignedlong),void(*dtor)(void*,structkmem_cache*,unsignedlong))void*kmem_cache_alloc(structkmem_cache*c,gfp_tflags)kmem_cache_create/kmem_cach8、e_alloc是基于slab分配器的一种内存分配方式,适用于反复分配释放同一大小内存块的场合。首先用kmem_cache_create创建一个高速缓存区域,然后用kmem_cache_alloc从该高速缓存区域中获取新的内存块。kmem_cache_alloc一次能分配的最大内存由mm/slab.c文件中的MAX_OBJ_ORDER宏定义,在默认的2.6.18内核版本中,该宏定义为5,于是一次最多能申请1<<5*4KB也就是128KB的连续
7、*kmem_cache_create(constchar*name,size_tsize,size_talign,unsignedlongflags,void(*ctor)(void*,structkmem_cache*,unsignedlong),void(*dtor)(void*,structkmem_cache*,unsignedlong))void*kmem_cache_alloc(structkmem_cache*c,gfp_tflags)kmem_cache_create/kmem_cach
8、e_alloc是基于slab分配器的一种内存分配方式,适用于反复分配释放同一大小内存块的场合。首先用kmem_cache_create创建一个高速缓存区域,然后用kmem_cache_alloc从该高速缓存区域中获取新的内存块。kmem_cache_alloc一次能分配的最大内存由mm/slab.c文件中的MAX_OBJ_ORDER宏定义,在默认的2.6.18内核版本中,该宏定义为5,于是一次最多能申请1<<5*4KB也就是128KB的连续
此文档下载收益归作者所有