linux物理内存的管理

数据结构:

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;
    ...
    ...
};

linux物理内存的管理_第1张图片
linux物理内存的管理_第2张图片

linux物理内存的管理_第3张图片

linux物理内存的管理_第4张图片

物理内存的管理分三层:

  1. 每个page对象对应一个4K大小的物理内存页,page对象存在于mem_map全局数组中,通过page在全局数组中的位置可以找到其关联的物理内存页的位置。

  2. zone管理着page对象,主要通过四个字段结构管理page对象:

    a.      pageset:如图3,管理着为各个cpu预先分配好的内存页。
    
    b.      free_area:如图4,管理者空闲内存页,用于实现伙伴系统。
    
    c.      active:保存活动页集合
    
    d.      inactive:保存不活动页集合
    
  3. pg_data_t管理者zone对象,主要通过两个字段管理:

    a. node_zones:zone数组,保存本结点的所有zone对象
    
    b. node_zonelists:zonelist数组,保存所有节点的所有zone对象
    

你可能感兴趣的:(内存,linux,linux)