物理内存组织结构

一、系统调用mmap

虚拟内存地址区域使用起始地址和结束地址描述,链表按起始地址递增排序。两系统调用区别:mmap指定的偏移的单位是字节,而nmap2指定的偏移的单位是页。ARM64架构实现系统调用mmap。

image-20231112150736424

系统调用munmmap

image-20231112161308720

1、vma = find_vma(mm, start) 根据起始地址找到要删除的第一个虚拟内存区域vms

2、如果只删除虚拟内存区域vam的部分,那么分裂虚拟内存区域vma

3、根据结束地址找到要删除的 最后一个虚拟内存区域vma

4、如果只删除虚拟内存区域last的一部分,那么分裂虚拟内存区域vma

5、针对所有删除目标,如果虚拟内存区域被锁定在内存中(不允许换出到交换区),调用函数解除锁定。

6、调用此函数,把所有删除目标从进程虚拟区域链表和树中删除,单独组成一条临时的链表。

7、调用此函数,针对所有删除目标,在进程的页表中删除映射,并且从处理器的页表缓存中删除映射。

8、调用此函数执行处理器架构特定的处理操作

9、调用此函数,删除所有目标。

 

物理内存组织结构

目前多处理器系统有两种体系结构:

1)非一致内存访问(Non-Unit Memory Access,NUMA):指内存被划分成多个内存节点的多处理器系统。访问一个内存节点花费的时间取决于处理器和内存节点的距离。

image-20231112165813536

2)对称多处理器(Symmetric Multi-Processor,SMP):即一致内存访问(Uniform Memory Access,UMA),所有处理器访问内存花费的时间是相同。

image-20231112165307294

2、内存模型

Version:0.9 StartHTML:0000000105 EndHTML:0000001763 StartFragment:0000000141 EndFragment:0000001723

内存模型是从处理器角度看到的物理内存分布,内核管理不同内存模型的方式存差异。

内存管理子系统支持3种内存模型

(1)平坦内存(Flat Memory):内存的物理地址空间是连续的,没有空洞。

(2)不连续内存(Discontiguous Memory):内存的物理地址空间存在空洞,这种模 型可以高效地处理空洞。

(3)稀疏内存(Space Memory):内存的物理地址空间存在空洞,如果要支持内存热插拔,只能选择稀疏内存模型

 

3、三级结构

内存管理子系统使用节点(node),区域(zone)、页(page)三级结构描述物理内存。

a、内存节点------>分为两种情况:

(1)NUMA体系的内存节点,根据处理器和内存的距离划分;

(2)在具有不连续内存的NUMA系统中,表示比区域的级别更高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点。

 

内存节点使用pglist_data结构体描述内存布局

image-20231112172340017

image-20231112172406096

node_mem_map此成员指向页描述符数组,每个物理页对应一个页描述符。

Node是内存管理最顶层的结构,在NUMA架构下,CPU平均划分为多个Node,每个Node有自己的内存控制器及内存插槽。CPU访问自己Node上内存速度快,而访问其他CPU所关联Node的内存速度满。UMA被当作只一个Node的NUMA系统。

内存区域

image-20231112180425356

image-20231112180513822

image-20231112180543582

 

 

每个区域使用一个zone结构体进行描述,如下为主要成员。

image-20231112181228623

image-20231112181359874

image-20231112181426751

物理页

页是内存管理当中的最小单位,页面中的内存其物理地址是连续的,每个物理页由struct page描述。为了节省内存,struct page是一个联合体(union)。

页,又称为页帧,在内核当中,内存管理单元MMU(负责虚拟地址和物理地址转换的硬件)是把物理也page作为内存管理的基本单位。体系结构不同,支持的页大小也不同。

32位体系结构支持4kb的页,64位体系结构支持8kb的页,MIPS64体系架构支持8kb的页。

每个物理页对应一个page结构体,称为页描述符,内存节点的pglist_data实例的成员node_mem_map指向该内存节点包含的所有物理页的页描述符组成的数组。Linux内核源码分析:include/linux/mm_types.h

image-20231112182651377

image-20231112182725759

THE END