3.5 物理内存组织
3.5.1 体系结构
目前多处理器系统有两种体系结构。
(1)非一致内存访问(non-uniform memory access,numa):指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。每个处理器有一个本地内存节点,处理器访问本地内存节点的速度比访问其他内存节点的速度快。numa 是中高端服务器的主流体系结构。
(2)对称多处理器(symmetric multi-processor,smp):即一致内存访问(uniform memory access,uma),所有处理器访问内存花费的时间是相同的。每个处理器的地位是平等的,仅在内核初始化的时候不平等:“0 号处理器作为引导处理器负责初始化内核,其他处理器等待内核初始化完成。”
在实际应用中可以采用混合体系结构,在 numa 节点内部使用 smp 体系结构。
3.5.2 内存模型
内存模型是从处理器的角度看到的物理内存分布情况,内核管理不同内存模型的方式存在差异。内存管理子系统支持 3 种内存模型。
(1)平坦内存(flat memory):内存的物理地址空间是连续的,没有空洞。
(2)不连续内存(discontiguous memory):内存的物理地址空间存在空洞,这种模型可以高效地处理空洞。
(3)稀疏内存(sparse memory):内存的物理地址空间存在空洞。如果要支持内存热插拔,只能选择稀疏内存模型。
什么情况会出现内存的物理地址空间存在空洞?系统包含多块物理内存,两块内存的物理地址空间之间存在空洞。一块内存的物理地址空间也可能存在空洞,可以查看处理器的参考手册获取分配给内存的物理地址空间。
如果内存的物理地址空间是连续的,不连续内存模型会产生额外的开销,降低性能,所以平坦内存模型是更好的选择。
如果内存的物理地址空间存在空洞,应该选择哪种内存模型?
平坦内存模型会为空洞分配 page 结构体,浪费内存;而不连续内存模型对空洞做了优化处理,不会为空洞分配 page 结构体。和平坦内存模型相比,不连续内存模型是更好的选择。
稀疏内存模型是实验性的,尽量不要选择稀疏内存模型,除非内存的物理地址空间很稀疏,或者要支持内存热插拔。其他情况应该选择不连续内存模型。
3.5.3 三级结构
内存管理子系统使用节点(node)、区域(zone)和页(page)三级结构描述物理内存。
1.内存节点
内存节点分两种情况。
(1)numa 系统的内存节点,根据处理器和内存的距离划分。
(2)在具有不连续内存的 uma 系统中,表示比区域的级别更高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点。
如图 3.16 所示,内存节点使用一个 pglist_data 结构体描述内存布局。内核定义了宏node_data(nid),它用来获取节点的 pglist_data 实例。对于平坦内存模型,只有一个pglist_data 实例:contig_page_data。
图3.16 内存节点的pglist_data实例
成员 node_id 是节点标识符。
成员 node_zones 是内存区域数组,成员 nr_zones 是内存节点包含的内存区域的数量。
成员 node_start_pfn 是起始物理页号,成员 node_present_pages 是实际存在的物理页的总数,成员 node_spanned_pages 是包括空洞的物理页总数。
成员 node_mem_map 指向页描述符数组,每个物理页对应一个页描述符。注意:成员node_mem_map 可能不是指向数组的第一个元素,因为页描述符数组的大小必须对齐到 2的(max_order − 1)次方,(max_order − 1)是页分配器可分配的最大阶数。
pglist_data 结构体的主要成员如下:
2.内存区域
内存节点被划分为内存区域,内核定义的区域类型如下:
dma 区域(zone_dma):dma 是“direct memory access”的缩写,意思是直接内存访问。如果有些设备不能直接访问所有内存,需要使用 dma 区域。例如旧的工业标准体系结构(industry standard architecture,isa)总线只能直接访问 16mb 以下的内存。
dma32 区域(zone_dma32):64 位系统,如果既要支持只能直接访问 16mb 以下内存的设备,又要支持只能直接访问 4gb 以下内存的 32 位设备,那么必须使用 dma32 区域。
普通区域(zone_normal):直接映射到内核虚拟地址空间的内存区域,直译为“普通区域”,意译为“直接映射区域”或“线性映射区域”。内核虚拟地址和物理地址是线性映射的关系,即虚拟地址 =(物理地址 + 常量)。是否需要使用页表映射?不同处理器的实现不同,例如 arm 处理器需要使用页表映射,而 mips 处理器不需要使用页表映射。
高端内存区域(zone_highmem):这是 32 位时代的产物,内核和用户地址空间按 1 : 3 划分,内核地址空间只有 1gb,不能把 1gb 以上的内存直接映射到内核地址空间,把不能直接映射的内存划分到高端内存区域。通常把 dma 区域、dma32 区域和普通区域统称为低端内存区域。64 位系统的内核虚拟地址空间非常大,不再需要高端内存区域。
可移动区域(zone_movable):它是一个伪内存区域,用来防止内存碎片,后面讲反碎片技术的时候具体描述。
设备区域(zone_device):为支持持久内存(persistent memory)热插拔增加的内存区域。
每个内存区域用一个 zone 结构体描述,其主要成员如下:
3.物理页
每个物理页对应一个 page 结构体,称为页描述符,内存节点的 pglist_data 实例的成员node_mem_map 指向该内存节点包含的所有物理页的页描述符组成的数组。
结构体 page 的成员 flags 的布局如下:
| [section] | [node] | zone | [last_cpupid] | ... | flags | 其中,section 是稀疏内存模型中的段编号,node 是节点编号,zone 是区域类型,flags 是标志位。
内联函数 page_to_nid 用来得到物理页所属的内存节点的编号,page_zonenum 用来得到物理页所属的内存区域的类型。
头文件“include/linux/mm_types.h”定义了 page 结构体。因为物理页的数量很大,所以在 page 结构体中增加 1 个成员,可能导致所有 page 实例占用的内存大幅增加。为了减少内存消耗,内核努力使 page 结构体尽可能小,对于不会同时生效的成员,使用联合体,这种做法带来的负面影响是 page 结构体的可读性差。
SICK光电传感器的分类
人工智能和物联网的融合市场将如何发展
驾驶员监控系统全解析 | 航芯案例分享
虽然华为荣耀v9来了 但是我相信花粉会和我一样更期待的是华为p10
小米芯片,与高通华为芯片的差距大吗?
一文搞懂物理内存组织的体系结构与内存模型
基于DSP的高阶COSTAS锁相环的设计
防静电安全知识培训内容
中国电信正式发布了2019年第一季度财报
IBM计划收购软件公司Tealeaf
如何防范重放攻击
这两大重器于华为AI战略具有里程碑式的意义
dhcp的作用是什么_dhcp的工作原理
30年卧薪尝胆的富士康
联想百应平台助力企业业务效率提升
场效应三极管的型号
小米6、努比亚Z17、一加5上半年主流骁龙835的几款旗舰手机,哪款才是与你最对位呢?
永磁同步电机控制系列的数学模型(5):矢量控制的波形记录
PCB继电器在工业生产控制系统中的作用
汇总压敏电阻常见问题