Linux如何支持超过虚拟地址范围512GB更x86-64的?(How does Linux sup

2019-07-30 03:56发布

对于X86-64使用Linux的用户虚拟地址空间是47位长。 这本质上意味着Linux可以映射周围〜128 TB的虚拟地址范围内的过程。

然而,是什么让我困惑的是x86-64架构支持ISA定义了4个级别的分层页表(排列为基树)为每个进程。 页表的根只能映射高达512 GB的连续虚拟地址空间。 因此,如何Linux可以支持比的虚拟地址范围512GB以上? 它使用多个页表的每一个过程? 如果是,那么一个过程又该CR3(X86-64的寄存器包含页表的基地址)包含任何给定的过程? 我缺少的东西吗?

Answer 1:

页表的根只能映射高达512 GB的连续虚拟地址空间。 因此,如何Linux可以支持比的虚拟地址范围512GB以上? 它使用多个页表的每一个过程? 如果是,那么一个过程又该CR3(X86-64的寄存器包含页表的基地址)包含任何给定的过程? 我缺少的东西吗?

我不知道你是什么意思“的页表的根”的意思,但在X86-64分页看起来是这样的:

  • 页表 - 分页结构的最低水平。 每个人都有一个描述的4 KiB页面512 8个字节的条目(PTE),所以PT介绍512 * 4 KiB = 2 MiB的内存(它也可以作为2 MIB页,但让我们离开了它)。
  • 页目录 - 表,类似于PT,含有指向的PT 512个8字节条目(PDE); 这样,PD描述512 * 2 MiB = 1 GiB的存储器(它也可以作为1页吉布,与之相似到PT)。
  • 页目录页表 - 类似PD,但包含512个8字节条目(PDPTE)指向的PD; 所以,PDPTE描述512 * 1 Gib = 512 GiB的存储器。
  • PML4,分页结构的最高水平,是含有512个8字节条目(PML4E)指向PDPTs表; 所以,PML4描述512 * 512 GiB = 256 TiB的存储器。

我不知道Linux的精确存储器映射,但可能更高的一半(从-128到的TiB 0 -从0xFFFF8000000000000xFFFFFFFFFFFFFFFF )则保留为内核,下半部分(从0到128的TiB -从0x00000000000000000x00007FFFFFFFFFFF )是用户空间程序。 因此,Linux支持512倍,512吉布的你所问的虚拟地址范围; 甚至托沃兹不会说“我们不会支持PML4”。 我不知道是什么造成困惑 - 是你错过了部分说,页表映射2 MIB的事实和它映射一个页面,你已经把它做为 - 4昆明植物研究所 - 但如果有什么我可以澄清一下,问它。



Answer 2:

典型地,过程的地址空间不被共享,这意味着,所涉及的页表不截然不同的过程之间共享任一。 这意味着在所有4级水平。

当然,常见的(核心)部分总是存在于所有的地址空间,因此,事实上,有一些共享,但内存只有内核本身的访问。

除此之外,事实上,每个进程都有自己的页表几乎并没有使用所有2个48地址在它们中的任何一个出现任何问题。 至少,有一个在CPU的一部分没有特别的限制,虽然可以在操作系统的一部分。



文章来源: How does Linux support more than 512GB of virtual address range in x86-64?