对于X86-64使用Linux的用户虚拟地址空间是47位长。 这本质上意味着Linux可以映射周围〜128 TB的虚拟地址范围内的过程。
然而,是什么让我困惑的是x86-64架构支持ISA定义了4个级别的分层页表(排列为基树)为每个进程。 页表的根只能映射高达512 GB的连续虚拟地址空间。 因此,如何Linux可以支持比的虚拟地址范围512GB以上? 它使用多个页表的每一个过程? 如果是,那么一个过程又该CR3(X86-64的寄存器包含页表的基地址)包含任何给定的过程? 我缺少的东西吗?
对于X86-64使用Linux的用户虚拟地址空间是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页吉布,与之相似到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吉布的你所问的虚拟地址范围; 甚至托沃兹不会说“我们不会支持PML4”。 我不知道是什么造成困惑 - 是你错过了部分说,页表映射2 MIB的事实和它映射一个页面,你已经把它做为 - 4昆明植物研究所 - 但如果有什么我可以澄清一下,问它。
典型地,过程的地址空间不被共享,这意味着,所涉及的页表不截然不同的过程之间共享任一。 这意味着在所有4级水平。
当然,常见的(核心)部分总是存在于所有的地址空间,因此,事实上,有一些共享,但内存只有内核本身的访问。
除此之外,事实上,每个进程都有自己的页表几乎并没有使用所有2个48地址在它们中的任何一个出现任何问题。 至少,有一个在CPU的一部分没有特别的限制,虽然可以在操作系统的一部分。