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无条件地清除某个设置的比特位,并返回原值。