文章目錄
- 一、實體頁 page 簡介
- 1、實體頁 page 引入
- 2、實體頁 page 與 MMU 記憶體管理單元
- 3、實體頁 page 結構體
- 4、Linux 核心源碼中的 page 結構體
- 二、記憶體節點 pglist_data 與 實體頁 page 聯系
記憶體管理系統
3
3
3級結構 :
① 記憶體節點 Node ,
② 記憶體區域 Zone ,
③ 實體頁 Page ,
Linux 核心中 , 使用 上述
3
3
3 級結構 描述 和 管理 " 實體記憶體 " ;
一、實體頁 page 簡介
1、實體頁 page 引入
" 記憶體節點 " node 是記憶體管理的 最頂層結構 ,
" 記憶體節點 " 再向下劃分 , 就是 " 記憶體區域 " zone ,
" 記憶體區域 " 再向下劃分 , 就是 " 實體頁 " page ;
2、實體頁 page 與 MMU 記憶體管理單元
在 Linux 核心中 , MMU 記憶體管理單元 , 主要作用是 将 " 虛拟位址 " 映射到 真實的 " 實體位址 " 中 ,
MMU 将 實體頁 page 作為記憶體管理基本機關 ,
不同體系結構的支援的 實體頁 大小也不同 ,
32 位體系結構中 , 支援的實體頁大小為
4 kb ,
- 64 位體系結構中 , 支援的實體頁大小為 8 kb ,
- MIPS 64 位體系結構中 , 支援的實體頁大小為 16 kb ,
3、實體頁 page 結構體
" 實體頁 "
page
是 Linux 核心 " 記憶體管理 " 中的 最小機關 ,
實體頁 中的 " 實體位址 " 是連續的 ,
每個 " 實體頁 " 使用
struct page
結構體 進行描述 ;
為了節省 " 記憶體管理 " 的記憶體開銷 , 實體頁的描述符 page 中都是 union 聯合體 , 如 :
struct page {
union {
struct address_space *mapping; /* If low bit clear, points to
* inode address_space, or NULL.
* If page mapped as anonymous
* memory, low bit is set, and
* it points to anon_vma object:
* see PAGE_MAPPING_ANON below.
*/
void *s_mem; /* slab first object */
atomic_t compound_mapcount; /* first tail page */
/* page_deferred_list().next -- second tail page */
};
}
4、Linux 核心源碼中的 page 結構體
" 實體頁 " 使用
page
結構體 進行描述 , 該結構體又稱為 " 頁描述符 " ;
該
page
結構體 定義在 Linux 核心源碼的 linux-4.12\include\linux\mm_types.h#40 位置 ;
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMxgjMzQTNhFzNilTN5EjNyYzX5EDNzEDMyIzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
二、記憶體節點 pglist_data 與 實體頁 page 聯系
" 記憶體節點 "
pglist_data
結構體 與 " 實體頁 "
page
結構體 的聯系 :
在 " 記憶體節點 "
pglist_data
結構體 中的
node_mem_map
成員 就是 該 " 記憶體節點 " 中所有的 " 實體頁 " 描述符
page
結構體 數組 ;
CONFIG_FLAT_NODE_MEM_MAP
宏定義指的是 " 除 稀疏記憶體模型 之外 " 的情況 , 該情況下 聲明
struct page *node_mem_map
頁描述數組 ;
typedef struct pglist_data {
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
// 頁描述數組
struct page *node_mem_map;
#endif
}