天天看點

【Linux 核心 記憶體管理】分區夥伴配置設定器 ③ ( 備用記憶體區域清單 | ZONELIST_FALLBACK 枚舉 | zoneref 結構體 | 備用記憶體區域借用實體頁規則 )

文章目錄

  • ​​一、備用記憶體區域清單​​
  • ​​二、ZONELIST_FALLBACK、ZONELIST_NOFALLBACK 枚舉​​
  • ​​三、zoneref 結構體​​
  • ​​四、備用記憶體區域借用實體頁規則​​

一、備用記憶體區域清單

假如 首選 記憶體節點 或 記憶體區域 不能滿足 記憶體配置設定請求 ,

就需要從 " 備用記憶體區域 " 借用 實體頁 進行 記憶體配置設定 , 該操作需要遵守如下算法規則 ;

" 記憶體節點 " 使用 ​

​pglist_data​

​ 結構體 進行描述 , 該結構體定義在 Linux 核心源碼中的 linux-4.12\include\linux\mmzone.h#601 位置 ;

​pglist_data ​

​​ 結構體中的 ​

​struct zone node_zones[MAX_NR_ZONES]​

​​ 成員是 記憶體區域 數組 , ​

​struct zonelist node_zonelists[MAX_ZONELISTS]​

​ 成員是 備用記憶體區域清單 ;

typedef struct pglist_data {
  struct zone node_zones[MAX_NR_ZONES];
  struct zonelist node_zonelists[MAX_ZONELISTS];
}pg_data_t;      

源碼路徑 : linux-4.12\include\linux\mmzone.h#601

【Linux 核心 記憶體管理】分區夥伴配置設定器 ③ ( 備用記憶體區域清單 | ZONELIST_FALLBACK 枚舉 | zoneref 結構體 | 備用記憶體區域借用實體頁規則 )

二、ZONELIST_FALLBACK、ZONELIST_NOFALLBACK 枚舉

UMA 系統中 , 有 個備用區域清單 , 内部的備用區域 按照 區域類型 , 由高到低 進行排序 ;

如 : 該 UMA 系統有 " 普通區域 " , " DMA 區域 " , 那麼備用區域清單如下 { 普通區域 , DMA 區域 } ;

UMA 系統的 每個 記憶體節點中 , 都有 個 備用記憶體區域清單 ,

  • 一個包含了 所有記憶體節點 的 備用記憶體區域清單 ,
  • 另外一個 包含了 目前記憶體節點 的 備用區域清單 ;

​ZONELIST_FALLBACK​

​ 枚舉 包含了 所有記憶體節點 的 備用記憶體區域清單 ;

​ZONELIST_NOFALLBACK​

​ 枚舉 包含了當 前記憶體節點 的 備用區域清單 ;

enum {
  ZONELIST_FALLBACK,  /* zonelist with fallback */
#ifdef CONFIG_NUMA
  /*
   * The NUMA zonelists are doubled because we need zonelists that
   * restrict the allocations to a single node for __GFP_THISNODE.
   */
  ZONELIST_NOFALLBACK,  /* zonelist without fallback (__GFP_THISNODE) */
#endif
  MAX_ZONELISTS
};      

源碼路徑 : linux-4.12\include\linux\mmzone.h#545

【Linux 核心 記憶體管理】分區夥伴配置設定器 ③ ( 備用記憶體區域清單 | ZONELIST_FALLBACK 枚舉 | zoneref 結構體 | 備用記憶體區域借用實體頁規則 )

三、zoneref 結構體

​struct zone *zone​

​ 成員 指向 記憶體區域 資料結構 ;

​int zone_idx​

​ 成員 指向 記憶體區域 的 類型 ;

/*
 * This struct contains information about a zone in a zonelist. It is stored
 * here to avoid dereferences into large structures and lookups of tables
 */
struct zoneref {
  struct zone *zone;  /* Pointer to actual zone */
  int zone_idx;   /* zone_idx(zoneref->zone) */
};      

源碼路徑 : linux-4.12\include\linux\mmzone.h#561

【Linux 核心 記憶體管理】分區夥伴配置設定器 ③ ( 備用記憶體區域清單 | ZONELIST_FALLBACK 枚舉 | zoneref 結構體 | 備用記憶體區域借用實體頁規則 )

四、備用記憶體區域借用實體頁規則

從 " 備用記憶體區域 " 借用 實體頁 規則 :

① 相同類型區域借用實體頁 : 記憶體節點 的 指定類型區域 可以從 另一個 記憶體節點 相同類型區域 借用 實體頁 ,

如 : 記憶體節點 普通區域 從 記憶體節點 的普通區域 借用實體頁 ;

② 高類型借用低類型區域 : 高區域類型 從 低區域類型 借用 實體頁 ,

如 : 普通區域 向 DMA 區域 借用 實體頁 ;

繼續閱讀