首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux内存储器伙伴算法(二:初始化内存域和数据结构)

2012-09-09 
linux内存伙伴算法(二:初始化内存域和数据结构)体系结构相关代码需要在启动期间建立以下信息:1.系统中各个

linux内存伙伴算法(二:初始化内存域和数据结构)

体系结构相关代码需要在启动期间建立以下信息:

1.系统中各个内存域的页帧边界,保存在max_zone_pfn中

2.个结点页帧的分配情况,保存在全局变量early_node_map中。

从内核版本2.6.10开始提供一个通用的框架,用于将上述信息转换为伙伴系统预期的结点和内存域数据结构。在这以前,各个体系结构必须自行建立相关结构。现在,体系结构相关代码只需要建立前述的简单结构,将繁重的工作留给free_area_init_nodes即可。图1给出了该过程概述,图2给出了free_area_init_nodes的代码流程图。

linux内存储器伙伴算法(二:初始化内存域和数据结构)linux内存储器伙伴算法(二:初始化内存域和数据结构)

                                                                                        图1:free_area_init_nodes过程概述

linux内存储器伙伴算法(二:初始化内存域和数据结构)

linux内存储器伙伴算法(二:初始化内存域和数据结构)

                                          图2:free_area_init_nodes代码流程图

free_area_init_nodes的源代码的详细分析如下:

static void check_for_regular_memory(pg_data_t *pgdat){#ifdef CONFIG_HIGHMEMenum zone_type zone_type;for (zone_type = 0; zone_type <= ZONE_NORMAL; zone_type++) {//进一步检查低于ZONE_HIGHMEM的内存域中是否有内存struct zone *zone = &pgdat->node_zones[zone_type];if (zone->present_pages)node_set_state(zone_to_nid(zone), N_NORMAL_MEMORY);//并根据上面的检查在结点位图中相应地设置N_NORMAL_MEMORY}#endif}

我也知道有很多的细节都没有分析到位,但是我也没有办法,曾经想着把里面涉及到的每一个函数都分析到位,但是那样的话自己相当的痛苦,因为那样的结果就是很多天都没有办法前进一点,会让人相当的有挫败感,最后只能选择大概先都过一遍,因为自己是一个内核的初学者,而内核前后的关联又很大,也只能先过一遍,到后面我会重新回来看我写得博客,能增进一些分析就增进一些分析。如果您认为上面确实有很重要的地方我没有分析到,希望您指点。





热点排行