《深入Linux内核架构》笔记:(N)UMA模型中的内存组织


1.概述

    在Linux中,内核对一致和非一致内存访问系统使用相同的数据结构,因此针对各种不同形式的内存布局,各个算法几乎没有什么差别。在UMA系统上,只使用一个NUMA结点来管理整个系统内存。

    首先内在划分为结点。每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t的结构。

深入Linux内核架构 pdf版下载见

    各个结点又划分为内存域,是内存的进一步细分。例如,对可用于(ISA设备的)DMA操作的内存区是有限制的。只有前16M适用,还有一个高端内存区域无法直接映射。在二者之间是通用的“普通”内存区。因此一个结点最多有3个内存域组成,如下图

内核引入了下列常量来枚举系统中的所有内存域:

  1. <mmzone.h>  
  2. enum zone_type {  
  3. #ifdef CONFIG_ZONE_DMA   
  4.        ZONE_DMA    ,  
  5. #endif   
  6. #ifdef CONFIG_ZONE_DMA32   
  7.        ZONE_DMA32  ,  
  8. #endif   
  9.        ZONE_NORMAL ,  
  10. #ifdef CONFIG_HIGHMEM   
  11.        ZONE_HIGHMEM,  
  12. #endif   
  13.        ZONE_MOVABLE,  
  14.        MAX_NR_ZONES  
  15. };  

◆ ZONE_DMA标记适合DMA的内存域。该区域的长度依赖于处理器类型。

◆ ZONE_DMA32标记了使用32位地址字可寻址、适合DMA的内存域。显然只有在64位系统上两种DMA内存域才有差别。

◆ ZONE_NORMAL标记了可直接映射到内核段的普通内存域。这是在所有体系结构上保证都会存在的唯一内存域,但无法保证该地址范围对应了实际的物理内存。

◆ ZONE_HIGHMEM标记了走出内核段的物理内存。 

此外内核定义了一个伪内存域ZONE_MOVABLE,在防止物理内存碎片的机制中需要使用该内存域。

MAX_NR_ZONES充当结束标记,在内核想要迭代系统中的所有内存域时,会用到该常量。

各个内在域都关联了一个数组,用来组织属于该内存域的物理内存页(内核中称为页帧)。对每个页帧,都分配了一个struct page的结构以及所需的管理数据。

出于性能考虑,在为进程分配内存时,内核总是试图在当前运行的CPU相关系的NUMA结点上进行。但这并不总是可行的,例如,该结点的内存可能已经用尽。对此类情况,每个结点都提供了一个备用列表。该列表包含了其他结点,可用于代替当前结点分配内存。列表项的位置越靠后,就越不适合分配。

  • 1
  • 2
  • 3
  • 下一页

相关内容