3.2 (N)UMA模型的内存组织

2019-04-14 20:00发布

3.2 (N)UMA模型中的内存组织
Linux支持的各种不同体系结构在内存管理方面差别很大。
内核对一致和非一致内存访问系统使用相同的数据结构,因此针对各种不同形式的内存布局,各个算法几乎没有什么差别。 3.2.1 概述
首先,内存划分为结点。每个节点关联到系统中的一个处理器,在内核中表示为pg_data_tr的实力。
各个节点又划分为内存域,是内存的进一步细分。

if USE_SPLIT_PTLOCKS

spinlock_t ptl;

endif

struct kmem_cache *slab; struct page *first_page; } union { pgoff_t index; void *freelist; }; struct list_head lru; void *virtual;

ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS

unsigned long debug_flags;

endif

ifdef CONFIG_KMEMCHECK

void *shadow;

endif

} *flags 存储了体系结构无关的标志,用于描述页的属性。
*_count是一个使用计数,表示内核中引用该页的次数。
*_mapcount表示在也表中有多少向执行该页
*lru是一个表头,用于在各种链表上维护该页,以便将也按不同类别分组,最重要的类 别是活动和不活动也。
*内核可以将多个毗连的也合并为符合也(compound page).
*mapping 指定了页帧所在的地址空间。index是页帧在映射内部的偏移量。地址空间是 一个非常一般的概念。地址空间用于将文件的内容与装载数据的内存区关联起来。
*private是一个指向”私有”数据的指针,虚拟内存管理会忽略该数据。根据页的用途, 可以用不同的方式使用该指针。
*virtual用于高端内存区域中的页,换言之,机无法直接映射到内核内存中的也。 virtual用于存储该也的虚拟地址。 *体系结构无关的也标志
也的不同属性通过一些列页标志描述,存储为struct page的flags成员中的各个比特位 。
*PageLocked查询比特位是否置位;
*SetPageLocked设置PG_locked位,不考虑先前的状态;
*TestSetPageLocked设置比特位,而且返回原值;
*ClearPageLocked清除比特位,不考虑先前的状态
*T estClearPageLocked清除比特位,返回原值。 *PG_locked指定了页是否锁定。如果该别提为置位,内核的其他部分不允许反问该也。 者防止了内存管理出席那静态条件。
*如果设计该也的I/O操作期间发生错误,则PG_error置位。
*PG_referenced和PG_active控制了系统使用该也的活跃程度。在也交换子系统选择患处 页时,该信息是很重要的。
*PG_uptodate表示也的数据已经从块设备读取,期间没有出错。
*如果与硬盘上的数据相比,也的内容已经该bain,则之为PG_dirty.
*PG_lru有助于实现页面回收和切换。
*如果page结构的private成员非空,则必须设置PG_private位。用于I/O页,可使用该字 段将页细分为多个缓冲区,但内核的其他部分也有各种不同的方法,将私有数据附加到 也上。
*如果页的内容处于向块设备会写的过程中,则需要设置PG_writeback位。
*如果页的slab分配器的一部分,则设置PG_slab位
*如果也处于交换缓存,则设置PG_swapcache为。
*在可用内存的数量变少时,内核试图周期性地回收也,即提出不活动、未用的也。
*如果也空闲且包含子啊伙伴的列表中,则设置PG_buddy位,伙伴系统是也分配机制的核 心。
*PG_compound表示该也属于一个更大的符合页,符合也有多个毗连的普通页组成。
*PageXXX(page)会检查也是否设置了PG_XXX位。
*SetPageXXX无条件地清除某个设置的比特位,并返回原值。