歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

《深入Linux內核架構》筆記:(N)UMA模型中的內存組織

1.概述

    在Linux中,內核對一致和非一致內存訪問系統使用相同的數據結構,因此針對各種不同形式的內存布局,各個算法幾乎沒有什麼差別。在UMA系統上,只使用一個NUMA結點來管理整個系統內存。

    首先內在劃分為結點。每個結點關聯到系統中的一個處理器,在內核中表示為pg_data_t的結構。

深入Linux內核架構 pdf版下載見 http://www.linuxidc.com/Linux/2012-06/62984.htm

    各個結點又劃分為內存域,是內存的進一步細分。例如,對可用於(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結點上進行。但這並不總是可行的,例如,該結點的內存可能已經用盡。對此類情況,每個結點都提供了一個備用列表。該列表包含了其他結點,可用於代替當前結點分配內存。列表項的位置越靠後,就越不適合分配。

Copyright © Linux教程網 All Rights Reserved