node
- 内核使用结构体pglist_data ,管理node中的内存资源
所有node的pglist_data结构地址都放在数组node_data
- struct pglist_data *node_data[MAX_NUMNODES];//64
- #define MAX_NUMNODES (1 << CONFIG_NODES_SHIFT)
- node中的内存资源,被划分成若干zone
- ZONE_DMA:物理地址16MB以下(ISA设备)
- ZONE_DMA32:物理地址4GB以下(只能在4GB范围内进行DMA的32位设备)
- ZONE_NORMAL:物理地址4GB以上的空间
- ZONE_MOVABLE:虚拟内存域,可移动
- x64中并没有所谓的ZONE_HIGHMEM 高端内存
typedef struct pglist_data pg_data_t;
struct pglist_data{
struct zone node_zones[MAX_NR_ZONES];
//分别对应4种zone类型ZONE_DMA、ZONE_DMA32、ZONE_NORMAL、ZONE_MOVABLE
struct zonelist node_zonelists[MAX_ZONELISTS];
//用于分配页框时,查找从哪个zone分配
int nr_zones;//node_zones中有效zone的个数
unsigned long node_start_pfn;//node的第一个页框号
unsigned long node_present_pages;//node内的页框数,不包含洞
unsigned long node_spanned_pages;//node内的页框数,包含洞
int node_id;//当前node的编号
};
zone
struct zone {
int node;//当前zone所属的node编号
struct per_cpu_pageset __percpu *pageset;//针对每个cpu的,页分配高速缓存
spinlock_t lock;//保护当前zone结构的自旋锁
struct free_area free_area[MAX_ORDER];//空闲页框的组织结构
unsigned long *pageblock_flags;
//在SPARSEMEM中,实际存储在mem_section的pageblock_flags中
struct pg_data_t *zone_pgdat;//当前zone所属node结构的指针
unsigned long zone_start_pfn;//zone的第一个页框号
unsigned long spanned_pages;//zone中的页框数,包括洞
unsigned long present_pages;//zone中的页框数,不包括洞
unsigned long managed_pages;//managed_pages = present_pages - reserved_pages;
const char *name;//Zone的名称:"DMA", "DMA32", "Normal", "Movable"
};