1.目前多处理器体系结构:SMP( 对称多处理器,即一致内存访问UMA,所有处理器访问内存所花费的时间是一样的 )
NUMA:非一致性内存访问,适用于中高端服务器,实际中采用混合体系结构(在NUMA节点内部使用SMP体系结构)p297
2.内存模型:内存管理子系统支持3种内存模型
稀疏内存:物理地址空间存在空洞,
与不连续内存相似的是:将一块连续内存当成一个整体,将整个不连续物理内存,分割一块一块的连续内存块。
不同的是:非连续模型只是单纯对这块内存进行标记,并不进行维护,当热插拔出现之后,会使得原本连续的内存块变得不连续。而稀疏模型的块管理结构,就是可以对热插拔引起空洞,进行维护
不连续内存:
物理地址空间,不是一个完完全全连续的地址空间,中间是由断层的(为啥出现断层?整个原始的物理空间是连续的,但一些物理空间是不能用来分配的,如DMA区,又或是存储原始数据的区域),这时候怎么来进行管理呢?我们可以通过一个数据结构node来标记Struct page,只要找到node就可以索引到Struct page
平坦内存:内存的物理地址是连续的,没有空洞
3.内存管理子系统使用节点(NODE),区域(ZONE),页(PAGE)三级结构描述物理内存
内存节点分为两种情况:
a.NUMA系统的内存节点,根据处理器和内存的距离划分
b.在具有不连续内存的NUMA系统中,表示比区域的级别更高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点
4.内存节点 使用一个pglist_data结构体类型描述内存布局,对于平坦内存模型,只有一个pglist_data实例
5.内存区域:内存节点被划分为内存区域,Linux内核定义区域类型
6.物理页(每个物理页对应一个page结构体,称为页描述符,内存结点的pglist data实例的成员node_mem_map指向此内存节点包含的所有物理页的页描述符组成的数组)
ARM64架构处理最大物理地址宽度为48位,页长度为64kB,那么物理地址的最大宽度为52位,异常级别EL0-EL3
linux2.6.11_comment-master > include > linux >mmzone.h > pg_data_t
typedef struct pglist_data {
/**
* 节点管理区描述符数组
*/
struct zone node_zones[MAX_NR_ZONES];//内存区域数组 2023.4.14
/**
* 页分配器使用的zonelist数据结构的数组。
*/
struct zonelist node_zonelists[GFP_ZONETYPES];//备用区域列表 2023.4.14
/**
* 节点中管理区的个数
*/
int nr_zones;
/**
* 节点中页描述符的数组
*/
struct page *node_mem_map;
/**
* 用在内核初始化阶段
*/
struct bootmem_data *bdata;
/**
* 节点中第一个页框的下标。
*/
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;
/**
* 内存节点链表的下一项。
*/
struct pglist_data *pgdat_next;
/**
* Kswapd页换出守护进程使用的等待队列
*/
wait_queue_head_t kswapd_wait;
/**
* 指针指向kswapd内核线程的进程描述符。
*/
struct task_struct *kswapd;
/**
* Kswapd将要创建的空闲块大小取对数的值。
*/
int kswapd_max_order;
} pg_data_t;