前面已经分析了伙伴管理算法的释放实现,接着分析一下伙伴管理算法的内存申请实现。
伙伴管理算法内存申请和释放的入口一样,其实并没有很清楚的界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点的地方作为入口分析。于是选择了alloc_pages()宏定义作为分析切入口:
[……]
前面已经分析了伙伴管理算法的释放实现,接着分析一下伙伴管理算法的内存申请实现。
伙伴管理算法内存申请和释放的入口一样,其实并没有很清楚的界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点的地方作为入口分析。于是选择了alloc_pages()宏定义作为分析切入口:
[……]
此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。
具体实现:
【file:/include/linux/gfp.h】 #define __free_page(page) __free_pages((page), 0)[......]
前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。
伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义:
【file:/include/linux/mmzone.h】 #ifndef CONFIG[......]
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。
具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init():
【file:/init/main.c】 /* * Set up kernel memory allocators */ static voi[......]
前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。
build_all_zonelists()用来初始化内存分配器使用的存储节点中[……]