目录一、 内核版本 2二、 数据结构和函数列表 2(一) 数据结构 2(二) 函数列表 2三、 内容分析 3(一) 启动伙伴算法 41. 伙伴系统算法简介 42. 源代码片段分析 10(二) 初始化slab分配器 151. slab分配器简介 152. 源代码片段分析 18(三) 初始化非连续内存区 231. 非连续内存区简介 232. 源代码片段分析 25四、 个人总结 27初始化内存管理内核版本版本为linux-。数据结构structrange{}structkmem_list3{}staticstructkmem_cachecache_cache={}structcache_sizesmalloc_sizes[]={}staticstructcache_names__initdatacache_names[]={}structvm_struct{}structvmap_area{}函数列表void__initmem_init(void)unsignedlong__initfree_all_bootmem(void)unsignedlong__initfree_all_memory_core_early(initnodeid)staticvoid__init__free_pages_memory(unsignedlongstart,unsignedlongend)staticunsignedlong__initfree_all_bootmem_core(bootmem_data_t*bdata)void__meminit__free_pages_bootmem(structpage*page,unsignedintorder)void__free_pages(structpage*page,unsignedintorder)void__initkmem_cache_init(void)staticvoidkmem_list3_init(structkmem_list3*parent)staticvoid__initset_up_list3s(structkmem_cache*cachep,intindex)staticinlinevoidpgtable_cache_init(void)void__initvmalloc_init(void)内容分析在本文中除了介绍内存管理的初始化过程(包括启动伙伴算法,初始化slab分配器和初始化非连续内存区)还会同时介绍bootmemoryallocator的退出过程。linux内核刚启动时采用bootmemory管理内存,之后由bootmemory初始化buddysystem,最终由buddy接管内存的动态分配。具体地,当函数paging_init(void)执行时,只有bootmemory空间被初始化完毕,因此页表描述符只能使用bootmemory中的空间。linux对系统中每个zone中的大多数空闲页面采用buddy算法进行管理,同时为了加速页面分配,对少量单个页面进行了缓存(见zone中的pageset[NR_CPUS]字段)。在一个操作系统中,还可以采用其他动态存储管理策略:顺序搜索,分类搜索,位图搜索等。有能力的用户可以根据情况开发自己的存储管理算法来代替linux中的buddy。在linux系统中,mem_init()函数执行完毕之后,buddy系统初始化完毕,此时,全局变量mem_init_done将被设置为1,之后buddy系统将开始对linux物理内存进行管理。全局变量mem_init_done被设置之前。即,从linux系统开始引导,到mem_init函数结束之前,linux不能使用buddy进行物理内存分配。必须使用bootmemory进行内存的申请和分配。bootmemory仅仅是系统在初期为过渡而使用的内存管理算法。bootmemory的初始化使用FFB(FirstFitAllocator)算法管理bootmemory的物理内存。FFB算法使用位图(bitmap)描述整个物理内存空间。其中,位图中的每一位代表一个实际物理页面。若位图某位为1表示对应的物理页面已经别使用,为0表示未使用。系统程序员在使用bootmemory申请内存和释放时容易在物理内存留下多个空洞。bootmemory的清除与释放不同:释放是指释放正在使用的物理页面,清除是指将没有在bootmemory中使用的物理页面清除出bootmemory并加入到buddysystem中去。可见如果系统程序员不释放在bootmemory中申请的内存时,这些内存将不会被清除到buddysystem中去。从而永远被系统占用。li
内存管理初始化 来自淘豆网www.taodocs.com转载请标明出处.