人生像是在跑马拉松,能够完赛的都是不断地坚持向前迈进;人生就是像在跑马拉松,不断调整步伐,把握好分分秒秒;人生还是像在跑马拉松,能力决定了能跑短程、半程还是全程。人生其实就是一场马拉松,坚持不懈,珍惜时间。
发布时间:2015-03-11 01:33:37
此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。具体实现:【file:/include/linux/gfp.h】#define __free_page(page) __free_pages((page), 0)而__free_pages()的实现:.........【阅读全文】
发布时间:2015-03-11 01:25:12
前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义:【file:/include/linux/mmzone.h】#ifndef CONFIG_FORCE_MAX_ZONEORDE.........【阅读全文】
发布时间:2015-03-08 23:09:46
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init():【file:/init/main.c】/* * Set up kernel memory allocators */sta.........【阅读全文】
发布时间:2015-02-28 00:53:19
前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。 build_all_zonelists()用来初始化内存分配器使用的存储节点中的管理区链表,是为内存.........【阅读全文】
发布时间:2015-02-28 00:48:26
前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充。如下图,这是前面已经看到过的linux物理内存管理框架的层次关系。现着重分析一下各个管理结构体的成员功能作用。【file:/include/linux/mmzone.h】typedef struct pglist.........【阅读全文】
发布时间:2015-01-25 19:42:39
虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),这里不准备复述什么,仅针对required_movablecore和required_kernelcore做一个补充。以required_movablecore为例,代码中没有很清晰地表明该值从何而来,仅有一处cmdline_parse_movablecore()疑似赋值的实现:.........【阅读全文】
发布时间:2015-01-01 12:46:31
此处接前文,分析free_area_init_nodes()函数最后部分,分析其末尾的循环: for_each_online_node(nid) { pg_data_t *pgdat = NODE_DATA(nid); free_area_init_node(nid, NULL, &nbs.........【阅读全文】
发布时间:2015-01-01 12:43:42
前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建。此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable_init()。据前面分析可知x86_init结构体内该钩子实际上挂接的是native_pagetable_init()函数。 native_pagetable_init().........【阅读全文】
发布时间:2014-12-11 08:35:57
传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的。这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构)。但是随着计算机的发展,一些新型的服务器结构中,尤其是多CPU的情况下,物理内存空间的访问就难以控制所需的时间相同了。在多CPU的环境下,系统只.........【阅读全文】
发布时间:2014-12-10 22:17:17
前面已经分析了内核页表的准备工作以及内核低端内存页表的建立,接着回到init_mem_mapping()中,低端内存页表建立后紧随着还有一个函数early_ioremap_page_table_range_init():【file:/arch/x86/mm/init.c】/* * Build a proper pagetable for the kernel.........【阅读全文】