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
檔案系統和mmap
ping 檔案。
答案3
處理器決定可用的頁面大小。對於大多數用途,x86 和 x86_64 處理器上硬體實作的頁面大小為 4kb。然而,如果作業系統願意,可以一次分配多個頁面,從而在軟體中有效地實現 8kb、16kb 或 32kb 頁面。
x86 和 x86_64 處理器也可以分別將 4mb 和 2mb 頁面與標準 4kb 頁面混合。如果使用該功能,它將主要用於分配內核空間。
答案4
頁大小主要取決於處理器架構。在x86上,從引入保護模式的386處理器時代開始,頁面大小一直是4 kB。
在 x64 模式下,也可以存在大小為 2 MB 的大頁面。然而,使用它們有點複雜。
您可以在以下位置找到有關頁面大小的更多信息維基百科文章