linux内存伙伴算法(二:初始化内存域和数据结构)
体系结构相关代码需要在启动期间建立以下信息:
1.系统中各个内存域的页帧边界,保存在max_zone_pfn中
2.个结点页帧的分配情况,保存在全局变量early_node_map中。
从内核版本2.6.10开始提供一个通用的框架,用于将上述信息转换为伙伴系统预期的结点和内存域数据结构。在这以前,各个体系结构必须自行建立相关结构。现在,体系结构相关代码只需要建立前述的简单结构,将繁重的工作留给free_area_init_nodes即可。图1给出了该过程概述,图2给出了free_area_init_nodes的代码流程图。

图1:free_area_init_nodes过程概述

图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}