虛擬位址空間中的頁面大小是如何決定的?

虛擬位址空間中的頁面大小是如何決定的?

Linux 使用虛擬記憶體系統,其中所有位址都是虛擬位址而不是實體位址。這些虛擬位址由處理器轉換為實體位址。

為了使這種轉換更容易,虛擬記憶體和實體記憶體被分為頁。每一頁都有一個獨特的編號;頁框號。

有些頁面大小可以是 2 KB、4 KB 等。是否受到架構規模的影響?例如,32 位元匯流排將具有 4 GB 位址空間。

答案1

您可以透過以下命令查詢系統的配置來找出系統的預設頁面大小getconf

$ getconf PAGE_SIZE
4096

或者

$ getconf PAGESIZE
4096

筆記:上述單位通常以位元組為單位,因此 4096 等於 4096 位元組或 4kB。

這是硬連線在 Linux 核心的源碼中的:

例子

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

換檔怎麼給你4096?

當您移位時,您正在執行乘以 2 的二進位乘法1 << PAGE_SHIFT

$ echo "2^12" | bc
4096

答案2

硬體(具體來說,記憶體管理單元,它是 CPU 的一部分)決定了可能的頁面大小。與處理器暫存器大小無關,僅與位址空間大小有間接關係(因為 MMU 決定兩者)。

幾乎所有架構都支援 4kB 頁面大小。有些架構支援較大的頁面(少數也支援較小的頁面),但 4kB 是非常普遍的預設值。

Linux 支援兩種頁面大小:

  • 正常大小的頁面,我相信在所有架構上預設都是 4kB,儘管某些架構允許其他值,例如 16kBARM64或 8kB、16kB 或 64kBIA64。這些對應於 MMU 上最深層的描述符(Linux 稱之為英語口說考試)。
  • 大頁面,如果編譯為 (CONFIG_HUGETLB_PAGE是必要的,並且CONFIG_HUGETLBFS對於大多數用途也是如此)。這對應於 MMU 描述符的第二深層(Linux 稱之為 PMD)(或至少通常是這樣,我不知道這是否適用於所有體系結構)。

頁面大小是記憶體使用量、記憶體使用量和速度之間的折衷。

  • 較大的頁面大小意味著當部分使用頁面時會產生更多浪費,因此系統會更快耗盡記憶體。
  • 更深的 MMU 描述符等級意味著更多的核心記憶體用於頁表。
  • 更深的MMU描述符等級意味著更多的時間花在頁表遍歷上。

對於大多數應用程式來說,較大頁面大小的收益很小,但成本很高。這就是為什麼大多數系統僅使用正常大小的頁面的原因。

您可以使用以下命令查詢系統上的(正常)頁面大小getconf實用程式或 C 函數sysconf

$ getconf PAGE_SIZE
4096

使用大頁面需要在其中安裝hugetlbfs檔案系統和mmapping 檔案。

答案3

處理器決定可用的頁面大小。對於大多數用途,x86 和 x86_64 處理器上硬體實作的頁面大小為 4kb。然而,如果作業系統願意,可以一次分配多個頁面,從而在軟體中有效地實現 8kb、16kb 或 32kb 頁面。

x86 和 x86_64 處理器也可以分別將 4mb 和 2mb 頁面與標準 4kb 頁面混合。如果使用該功能,它將主要用於分配內核空間。

答案4

頁大小主要取決於處理器架構。在x86上,從引入保護模式的386處理器時代開始,頁面大小一直是4 kB。

在 x64 模式下,也可以存在大小為 2 MB 的大頁面。然而,使用它們有點複雜。

您可以在以下位置找到有關頁面大小的更多信息維基百科文章

相關內容