文章目錄
- 一、分區夥伴配置設定器
- 二、分區夥伴配置設定器源碼資料結構
- 1、free_area 空閑區域數組
- 2、MAX_ORDER 宏定義 ( 空閑區域的頁最大階數 )
一、分區夥伴配置設定器
在前兩篇部落格
- 【Linux 核心 記憶體管理】夥伴配置設定器 ① ( 夥伴配置設定器引入 | 頁塊、階 | 夥伴 )
- 【Linux 核心 記憶體管理】夥伴配置設定器 ② ( 夥伴配置設定器配置設定記憶體流程 )
中 , 講解了 基本 夥伴配置設定器 概念 , 以及 記憶體配置設定流程 ;
分區夥伴配置設定器概念 : Linux 核心 在 基本 夥伴配置設定器 基礎上 , 增加了對 " 記憶體節點 “ 和 ” 記憶體區域 “ 的支援 , 這就是 ” 分區夥伴配置設定器 “ , 英文名稱為 ” Zond Buddy Allocator " ;
分區夥伴配置設定器 專注于 特定記憶體節點 的 特定記憶體區域 ;
" 分區夥伴配置設定器 " 的特點 :
- 将 實體記憶體 根據 可移動性 進行了分組 , 防止出現記憶體碎片 ;
- 優化了 " 單頁記憶體配置設定 " , 減少了 CPU 之間的 鎖競争 , 在 記憶體區域 增加 每處理器頁集合 ;
二、分區夥伴配置設定器源碼資料結構
1、free_area 空閑區域數組
記憶體區域
zone
結構體中的
free_area
成員 , 就是用于維護 空閑頁塊 的 數組 資料結構 , 該
free_area
數組的 下标索引 對應 頁塊 階數 ;
也就是說
free_area[0]
表示的是
0 階頁塊 空閑記憶體 ,
free_area[2]
表示的是
2
2
2 階頁塊 空閑記憶體 ;
源碼路徑 : linux-4.12\include\linux\mmzone.h#453
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COxMDM5MjZxEDO2ITNhFjNyYzX4MDM0IDMyIzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
" 記憶體區域 "
struct zone
結構體位置 :
源碼路徑 : linux-4.12\include\linux\mmzone.h#350
參考 【Linux 核心 記憶體管理】實體記憶體組織結構 ④ ( 記憶體區域 zone 簡介 | zone 結構體源碼分析 | zone 結構體源碼 ) 部落格 ;
2、MAX_ORDER 宏定義 ( 空閑區域的頁最大階數 )
struct free_area free_area[MAX_ORDER];
數組中的
MAX_ORDER
宏定義的值為
11
11
11 ,
MAX_ORDER
是最大的階數
11
11
11 , 夥伴配置設定器 最大可以配置設定
2
10
2^{10}
210 頁塊 , 也就是
10
10
10 階頁塊 ;
free_area[10]
表示的是
10
10
10 階頁塊 空閑記憶體 , 也就是
2
10
2^{10}
210 個頁塊 ;
#ifndef CONFIG_FORCE_MAX_ZONEORDER
作用是判定是否定義了
CONFIG_FORCE_MAX_ZONEORDER
宏定義 , 該宏定義的作用是 " 指定最大階數 " , 如果沒有指定 , 則指定最大階數為
11
11
11 ;
MAX_ORDER
宏定義源碼 :
/* Free memory management - zoned buddy allocator. */
#ifndef CONFIG_FORCE_MAX_ZONEORDER
#define MAX_ORDER 11
#else
#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
#endif
#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
源碼路徑 : linux-4.12\include\linux\mmzone.h#24