天天看點

【Linux 核心 記憶體管理】實體記憶體組織結構 ⑥ ( 實體頁 page 簡介 | 實體頁 page 與 MMU 記憶體管理單元 | 記憶體節點 pglist_data 與 實體頁 page 聯系 )

文章目錄

  • ​​一、實體頁 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 位置 ;

【Linux 核心 記憶體管理】實體記憶體組織結構 ⑥ ( 實體頁 page 簡介 | 實體頁 page 與 MMU 記憶體管理單元 | 記憶體節點 pglist_data 與 實體頁 page 聯系 )

二、記憶體節點 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
}      

繼續閱讀