文章目錄
- 一、備用記憶體區域清單
- 二、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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMyMTN3MmZjF2M3UGO4UjNyYzXxETOyEDM1IzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
二、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
三、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
四、備用記憶體區域借用實體頁規則
從 " 備用記憶體區域 " 借用 實體頁 規則 :
① 相同類型區域借用實體頁 : 記憶體節點 的 指定類型區域 可以從 另一個 記憶體節點 相同類型區域 借用 實體頁 ,
如 : 記憶體節點 普通區域 從 記憶體節點 的普通區域 借用實體頁 ;
② 高類型借用低類型區域 : 高區域類型 從 低區域類型 借用 實體頁 ,
如 : 普通區域 向 DMA 區域 借用 實體頁 ;