簡體   English   中英

Linux如何在x86-64中支持超過512GB的虛擬地址范圍?

[英]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個8字節條目(PTE)描述一個4 KiB頁面,因此PT描述512 * 4 KiB = 2 MiB的內存(它也可以作為2 MiB頁面使用,但現在讓我們離開它)。
  • 頁面目錄 - 表,類似於PT,包含指向PT的512個8字節條目(PDE); 因此,PD描述512 * 2 MiB = 1 GiB的內存(它也可以作為1 GiB頁面,類似於PT)。
  • 頁目錄頁表 - 類似於PD,但包含指向PD的512個8字節條目(PDPTE); 所以,PDPTE描述了512 * 1 Gib = 512 GiB的內存。
  • PML4是最高級別的分頁結構,是包含512個8字節條目(PML4E)的表,指向PDPT; 所以,PML4描述了512 * 512 GiB = 256 TiB的內存。

我不知道Linux的確切內存映射,但可能更高的一半(從-128 TiB到0 - 從0xFFFF8000000000000xFFFFFFFFFFFFFFFF )保留給內核,下半部分(從0到128 TiB - 從0x00000000000000000x00007FFFFFFFFFFF )是用戶空間應用程序 因此,Linux支持512倍於您要求的512 GiB虛擬地址范圍; 甚至托瓦茲也不會說“我們不會支持PML4”。 我不知道是什么讓你感到困惑 - 是你錯過了這個部分,說頁面表映射2 MiB並且你已經把它當作一個頁面映射 - 4 KiB - 但是如果有什么我可以澄清,請詢問它。

通常,不共享進程地址空間,這意味着所涉及的頁表也不在不同進程之間共享。 這意味着在所有4個表級別。

當然,公共(內核)部分總是存在於所有地址空間中,因此,事實上,存在一些共享,但內存只能由內核訪問。

實際上,除此之外,每個進程都有自己的頁表,並且在任何一個進程中使用所有2 48個地址都沒有任何問題。 至少,CPU的部分沒有特別的限制,盡管操作系統可以有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM