一、概述
1.内存管理的领域:
1.管理物理内存页
2.分配打开内存的伙伴系统
3.分配小内存的slab、slub、slob分配器
4.分配非连续内存快的vmalloc
5.进程的地址空间
内核将虚拟地址空间分为两个部分,底部较大,用于用户空间,上部用于内核,在发生进程切换时,底部会变化,上部不会变化,因为进程共享内核空间
64位的不需要高端内存模式,因为64位地址空间足够将所有的物理地址映射到内核。
2. UMA模型中的内存组织
在UMA系统上只使用一个NUMA节点来管理整个系统内存,每个NUMA节点用pg_data_t来表示
linux上的内存分区
enum zone_type {
#ifdef CONFIG_ZONE_DMA
ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32
ZONE_DMA32,
#endif
ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
ZONE_HIGHMEM,
#endif
ZONE_MOVABLE, 为了防止物理内存碎片,我在2.6.22中没有看到这个位
MAX_NR_ZONES 为了表示结构的结束标志
};
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES]; 节点类内存域的数组
struct zonelist node_zonelists[MAX_ZONELISTS]; 备用节点及其内存域列表
int nr_zones; 节点中不同内存域的数目
#ifdef CONFIG_FLAT_NODE_MEM_MAP
struct page *node_mem_map; 指向该节点的所有物理内存页
#endif
struct bootmem_data *bdata; 指向自举内存分配器,在系统内存管理还没有启动是为系统分配内存
#ifdef CONFIG_MEMORY_HOTPLUG
/*
* Must be held any time you expect node_start_pfn, node_present_pages
* or node_spanned_pages stay constant. Holding this will also
* guarantee that any pfn_valid() stays that way.
*
* Nests above zone->lock and zone->size_seqlock.
*/
spinlock_t node_size_lock;
#endif
unsigned long node_start_pfn; 该节点的起始页帧,在UMA上为0
unsigned long node_present_pages; /* total number of physical pages */
unsigned long node_spanned_pages; /* total size of physical page
range, including holes */
int node_id;
wait_queue_head_t kswapd_wait;
struct task_struct *kswapd;
int kswapd_max_order;
} pg_data_t;
节点状态
enum node_states {
N_POSSIBLE, /* The node could become online at some point */
N_ONLINE, /* The node is online */
N_NORMAL_MEMORY, /* The node has regular memory */
#ifdef CONFIG_HIGHMEM
N_HIGH_MEMORY, /* The node has regular or high memory */
#else
N_HIGH_MEMORY = N_NORMAL_MEMORY,
#endif
N_CPU, /* The node has one or more cpus */
NR_NODE_STATES
};
N_POSSIBLE
N_ONLINE
N_CPU是对cpu和内存热插拔有用的位,内存管理有用的是
N_NORMAL_MEMORY和
N_HIGH_MEMORY
内存域
内核使用zone结构来描述内存域