天天看點

【Linux 核心 記憶體管理】分區夥伴配置設定器 ① ( 分區夥伴配置設定器源碼資料結構 | free_area 空閑區域數組 | MAX_ORDER 宏定義 | 空閑區域的頁最大階數 )

文章目錄

  • ​​一、分區夥伴配置設定器​​
  • ​​二、分區夥伴配置設定器源碼資料結構​​
  • ​​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

【Linux 核心 記憶體管理】分區夥伴配置設定器 ① ( 分區夥伴配置設定器源碼資料結構 | free_area 空閑區域數組 | MAX_ORDER 宏定義 | 空閑區域的頁最大階數 )

" 記憶體區域 " ​

​struct zone​

​ 結構體位置 :

【Linux 核心 記憶體管理】分區夥伴配置設定器 ① ( 分區夥伴配置設定器源碼資料結構 | free_area 空閑區域數組 | MAX_ORDER 宏定義 | 空閑區域的頁最大階數 )

源碼路徑 : 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

繼續閱讀