本文介紹了 Linux 作業系統中大頁的實現。 分別從 memory 層、檔案系統層、libhugetlbfs,以及使用者如何使用大頁等這幾個方面進行了分析和介紹。 讓您更好的瞭解 大頁在內核的實現機制以及HTTP://www.aliyun.com/zixun/aggregation/6579.html">使用者使用方法。
大頁主要是為了使用者使用大量的記憶體時提供優化的方法。 它通過硬體平臺提供的支援,作業系統對記憶體操作進行優化,提高了系統的效率。 本篇文章首先介紹了硬體平臺對大頁的支援,然後分析它在 Linux 內核中的實現,最後通過一個例子來瞭解使用者如何使用這些大頁的。 隨著硬體的價格越來越低,使用者需要訪問更多的記憶體,系統有兩種方法來適應記憶體的增加。 一種方法就是保持頁的大小不變而增加頁表的級數,另一種方法就是頁表的級別不變而增加頁的大小。 第一種方法,會容易出現性能的問題。 頁表級數的增加和小頁就會增加訪問記憶體的次數。 而第二種方法可以減少訪問記憶體的次數。 相對於小頁來說,系統的性能是比較高的。 這就是為何有越來越多的方法支援大頁。
大頁的硬體支援
這裡以 x86 架構為例,介紹硬體平臺對大頁的支援。 下面表格顯示了頁的大小與物理位址長度的關係。 控制寄存器 CR0、CR4 中的某些位決定了頁的大小。 此表格來自 Intel 64 IA and IA32 Architectures Software Developer ’s Manual。
Paging Mode PG Flag CR0 PAE Flag CR4 LME IA32_EFFER Page Size Linear Address Physical Address Width None 0 X X - 32 bit 32 bit 32 bit 1 0 0 4KB
4MB 32 bit Up to 40 bit PAE 1 1 0 4KB
2MB 32 bit Up to 52 bit IA-32e 1 1 2 4KB
2MB
1GB 48 bit Up to 52 bit
大頁總體結構
大頁的結構主要有內核代碼中的 hugetlb.c, memory.c,hugtlbpage.c 和 fs/hugetlbfs/inode.c,還有使用者空間提供的 libhugetlbfs。 其中 hugetlb.c, memory.c 屬於記憶體管理的部分,hugetlbpage.c 是跟具體的架構相關的頁表的管理,fs/hugetlbfs/inode.c 是檔案系統層,hugetlbfs 是一個偽檔案系統, 沒有一個提供的設備檔,它提供了使用和管理大頁的一種方式。 最後,libhugetlbfs 為使用者提供了管理大頁的工具。 這幾部分的關係如下圖所示:
圖 1. 大頁結構圖
圖 2. 大頁使用的時序圖
上面時序圖展示了使用者使用大頁時,從使用者空間調用到內核空間,最終分配頁給使用者的過程。