繁体   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