linux物理内存描述

Linux采用VM系统管理内存,以实现体系结构无关的内存描述。内存分为多个节点(pg_data_t),节点下有管理区(zone),如ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM和新增的ZONE_MOVABLE。每个物理页面由page结构体描述,存储在全局mem_map数组中。分配内存时,Linux倾向于从运行CPU附近的节点分配,以提高效率。page结构体记录页面状态,管理区则用于统计和跟踪页面使用情况。

linux使用于广泛的体系结构,因此需要用一种与体系结构无关的方式来描述内存。linux用VM描述和管理内存。在VM中兽药的普遍概念就是非一致内存访问。对于大型机器而言,内存会分成许多簇,依据簇与处理器“距离”的不同,访问不同的簇会有不同的代价。

每个簇都被认为是一个节点(pg_data_t),每个节点被分成很多的成为管理区(zone)的块,用于表示内存中的某个范围。除了ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM以外,linux2.6.32中引入了ZONE_MOVABLE,用于适应大块连续内存的分配。

每个物理页面由一个page结构体描述,所有的结构都存储在一个全局的mem_map数组中(非平板模式),该数组通常存放在ZONE_NORMAL的首部,或者就在校内存系统中为装入内核映像而预留的区域之后。

节点

内存的每个节点都有pg_data_t描述,在分配一个页面时,linux采用节点局部分配的策略,从最靠近运行中的CPU的节点分配内存。由于进程往往是在同一个CPU上运行,因此从当前节点得到的内存很可能被用到。

/*
 * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
 * (mostly NUMA machines?) to denote a higher-level memory zone than the
 * zone denotes.
 *
 * On NUMA machines, each NUMA node would have a pg_data_t to describe
 * it's memory layout.
 *
 * Memory statistics and page replacement data structures are maintained on a
 * per-zone basis.
 */
struct bootmem_data;
typedef struct pglist_data {
	 /*该节点内的内存区。可能的区域类型用zone_type表示。 */
	struct zone node_zones[MAX_NR_ZONES];
	 /* 该节点的备用内存区。当节点没有可用内存时,就从备用区中分配内存。*/
	struct zonelist node_zonelists[MAX_ZONELISTS];
	  /*可用内存区数目,即node_zones数据中保存的最后一个有效区域的索引*/
	int nr_zones;
#ifdef CONFIG_FLAT_NODE_MEM_MAP	/* means !SPARSEMEM */
	 /* 在平坦型的内存模型中,它指向本节点第一个页面的描述符。 */
	struct page *node_mem_map;
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
	/*cgroup相关*/
	struct page_cgroup *node_page_cgroup;
#endif
#endif
  /**
          * 在内存子系统初始化以前,即boot阶段也需要进行内存管理。
          * 此结构用于这个阶段的内存管理。
          */
	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.
	 */
	    /*当系统支持内存热插拨时,用于保护本结构中的与节点大小相关的字段。
          	哪调用node_start_pfn,node_present_pages,node_spanned_pages相关的代码时,需要使用该锁。
          */
	spinlock_t node_size_lock;
#endif
	/*起始页面帧号,指出该节点在全局mem_map中
	的偏移*/
	unsigned long node_start_pfn;
	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;
管理区

每个管理区由一个

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值