[英]How does Linux support more than 512GB of virtual address range in x86-64?
Linux的x86-64用戶虛擬地址空間為47位。 這實際上意味着Linux可以映射具有大約~128 TB虛擬地址范圍的進程。
然而,讓我感到困惑的是x86-64架構支持每個進程的ISA定義的4級分層頁表(排列為基數樹)。 頁表的根目錄最多只能映射512 GB的連續虛擬地址空間。 那么Linux如何支持512GB以上的虛擬地址范圍呢? 它是否為每個進程使用多個頁表? 如果是,那么對於一個進程,CR3(x86-64的寄存器包含頁表基址的地址)應包含哪個給定進程? 我錯過了什么嗎?
頁表的根目錄最多只能映射512 GB的連續虛擬地址空間。 那么Linux如何支持512GB以上的虛擬地址范圍呢? 它是否為每個進程使用多個頁表? 如果是,那么對於一個進程,CR3(x86-64的寄存器包含頁表基址的地址)應包含哪個給定進程? 我錯過了什么嗎?
我不知道“頁面表的根目錄”是什么意思,但x86-64上的分頁看起來像這樣:
512 * 4 KiB = 2 MiB
的內存(它也可以作為2 MiB頁面使用,但現在讓我們離開它)。 512 * 2 MiB = 1 GiB
的內存(它也可以作為1 GiB頁面,類似於PT)。 512 * 1 Gib = 512 GiB
的內存。 512 * 512 GiB = 256 TiB
的內存。 我不知道Linux的確切內存映射,但可能更高的一半(從-128 TiB到0 - 從0xFFFF800000000000
到0xFFFFFFFFFFFFFFFF
)保留給內核,下半部分(從0到128 TiB - 從0x0000000000000000
到0x00007FFFFFFFFFFF
)是用戶空間應用程序 因此,Linux支持512倍於您要求的512 GiB虛擬地址范圍; 甚至托瓦茲也不會說“我們不會支持PML4”。 我不知道是什么讓你感到困惑 - 是你錯過了這個部分,說頁面表映射2 MiB並且你已經把它當作一個頁面映射 - 4 KiB - 但是如果有什么我可以澄清,請詢問它。
通常,不共享進程地址空間,這意味着所涉及的頁表也不在不同進程之間共享。 這意味着在所有4個表級別。
當然,公共(內核)部分總是存在於所有地址空間中,因此,事實上,存在一些共享,但內存只能由內核訪問。
實際上,除此之外,每個進程都有自己的頁表,並且在任何一個進程中使用所有2 48個地址都沒有任何問題。 至少,CPU的部分沒有特別的限制,盡管操作系統可以有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.