数据结构:
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];
struct zonelist node_zonelists[MAX_ZONELISTS];
int nr_zones;
struct page *node_mem_map;
struct bootmem_data *bdata;
unsigned long node_start_pfn;
unsigned long node_present_pages;
unsigned long node_spanned_pages;
...
...
} pg_data_t;
struct zone {
unsigned long pages_min, pages_low, pages_high;
unsigned long lowmem_reserve[MAX_NR_ZONES];
struct per_cpu_pageset pageset[NR_CPUS];
struct free_area free_area[MAX_ORDER];
struct list_head active_list;
struct list_head inactive_list;
unsigned long nr_scan_active;
unsigned long nr_scan_inactive;
unsigned long pages_scanned;
unsigned long flags;
...
...
};
物理内存的管理分三层:
每个page对象对应一个4K大小的物理内存页,page对象存在于mem_map全局数组中,通过page在全局数组中的位置可以找到其关联的物理内存页的位置。
zone管理着page对象,主要通过四个字段结构管理page对象:
a. pageset:如图3,管理着为各个cpu预先分配好的内存页。 b. free_area:如图4,管理者空闲内存页,用于实现伙伴系统。 c. active:保存活动页集合 d. inactive:保存不活动页集合
pg_data_t管理者zone对象,主要通过两个字段管理:
a. node_zones:zone数组,保存本结点的所有zone对象 b. node_zonelists:zonelist数组,保存所有节点的所有zone对象