为什么Debian Linux每个进程最多允许128TiB虚拟地址空间,而只允许64TiB物理内存?


23

我只是在这里读:

  • 每个进程多达128TiB虚拟地址空间(而不是2GiB)
  • 支持64TiB物理内存,而不是4GiB(或带有PAE扩展名的64GiB)

这是为什么?我的意思是,物理内存支持受内核还是受当前硬件限制?

为什么您需要的虚拟内存空间是实际可寻址物理内存的两倍?


您还可以添加交换。
托尔比约恩Ravn的安徒生

2
那有很多RAM ...
dalearn '17

4
@dalearn-您知道的,当我初次了解到可以为8位微控制器进行存储区转换的内存扩展,使它们具有高达4096KB的容量时,我说的完全一样……
Jules

Answers:


35

这些限制不是来自Debian或Linux,而是来自硬件。不同的体系结构(处理器和内存总线)具有不同的限制。

在当前的x86-64 PC处理器上,MMU允许48位虚拟地址空间。这意味着地址空间限制为256TB。用一位来区分内核地址和用户态地址,这为进程的地址空间留出了128TB的空间。

在当前的x86-64处理器上,物理地址最多可以使用48位,这意味着您最多可以拥有256TB。自从引入amd64架构以来,限制已逐渐提高(如果我没记错的话,该限制为40位)。地址空间的每一位都需要一些布线和解码逻辑(这会使处理器更昂贵,更慢且更热),因此硬件制造商有动力保持尺寸的减小。

Linux仅允许物理地址最多增加2 ^ 46(因此最多只能有64TB),因为它允许将物理内存完全映射到内核空间中。请记住,地址空间有48位;内核/用户为1位,内核地址空间为47位。其中的一半最多直接寻址物理内存,另一半则允许内核映射所需的内容。(Linux可以处理无法同时完整映射的物理内存,但这会带来额外的复杂性,因此只能在需要的平台上完成,例如带有PAE的x86-32和带有LPAE的armv7。)

由于以下几个原因,使虚拟内存大于物理内存非常有用:

  • 它允许内核映射整个物理内存,并为虚拟mappin留出空间。
  • 除了物理内存的映射外,还有交换,文件和设备驱动程序的映射。
  • 将未映射的内存放在适当的位置非常有用:保护页以捕获缓冲区溢出,由于ASLR导致的较大的未映射区域等。

9
物理内存的46位限制与Linux内存映射有关:它包括内核空间中物理内存的完整映射,这意味着物理内存只能对应于可用地址空间的四分之一。
斯蒂芬·基特

有人可以详细说明@StephenKitt评论吗?我对了解这一点非常感兴趣,但是即使在阅读了他引用的参考文献后,我也没明白;)
gsi-frank

@ gsi-frank内核将整个物理内存永久映射很方便。因此,在2 ^ 48地址空间中,有2 ^ 47用于用户空间地址,2 ^ 46用于内核地址,而2 ^ 46用于物理内存寻址。
吉尔(Gilles)'所以

@ gsi-frank如果您可以获得经典书籍“ 开发自己的32位操作系统 ” 的副本,那么它对于作者为自己的操作系统做出类似决定的原因就具有相当深入的意义(在这种情况下,将80386的4GiB虚拟地址空间划分为2GiB内核段,其中包含1GiB物理RAM映射和2GiB用户段。任何对操作系统内部感兴趣的人都应该阅读它-它提供了一个完整的设计,既简单又容易理解,但又足够先进,足以成为有用的OS内核。
Jules

从内核版本4.13开始,可以使用五级页表构建x86-64(和其他一些体系结构),这会将 x86-64上的地址空间增加到物理RAM的52位和虚拟地址的57位(4 PiB / 128 PiB)。请注意,内核空间中的内存映射会引入安全性问题,因此在不久的将来可能会发生变化。
斯蒂芬·基特

9

我不知道为什么,但是我可以想到七个原因,为什么支持两倍于物理内存的地址空间会很有用。

  1. 首先是使您可以运行需要额外内存的应用程序-即使这意味着要交换到磁盘。
  2. 清理内存布局以分区内存使用情况。例如,操作系统可能会使用编号较高的地址,而将编号较低的地址留给应用程序以使分隔符更整洁。
  3. 地址空间布局随机化会更有效。
  4. 将页面标记为可执行文件可能意味着剩余内存。
  5. 内存映射的I / O。
  6. 内存分配更容易:一次可以分配更大的块。
  7. 减少内存碎片

1
谢谢!1)如此明显和基本,我为这个问题感到尴尬;)
gsi-frank

2
(3)也很重要。您确实希望虚拟地址空间比要分配的内存量大几个数量级,以便随机猜测几乎肯定会导致陷阱。
R.,

6

这些是硬件限制。当前的x86_64 / amd64硬件允许使用48位虚拟地址和各种大小(取决于实现方式,例如,我的工作站仅支持36位)物理地址。Linux内核将虚拟地址空间分为两半(就像在x86上一样,一半用于内核,一半用于用户空间)。

这样就得到:

2个字节÷2 = 2个字节= 128 TiB

物理地址的大小通常较小,因为它实际上是物理地址。它占用CPU上/中的引脚/焊盘,晶体管,连接等,并占用板上的走线。芯片组中可能也相同。支持在处理器内核或插槽的设计寿命中难以想象的数量的ram是没有意义的-所有这些事情都需要花钱。(即使每个插槽中都有32个DIMM插槽和64GiB DIMM,您仍然只有2TiB。即使DIMM容量每年增加一倍,我们距64TiB也有5年的路程。

正如Peter Cordes指出的那样,人们现在正在将诸如3D XPoint之类的非易失性存储连接到内存总线,这使得地址空间不足的情况成为可能。较新的处理器将物理地址空间扩展到了48位。Debian Wiki可能尚未更新。


直接连接到内存总线(例如3D XPoint)的非易失性存储正在成为一件大事,这可能会在未来几年极大地增加对物理地址空间的需求(因为它比DRAM密度更高,并且有大量的存储空间非常有用)。在更多情况下,拥有大量的RAM比有用。参见zdnet.com/article/the-non-volatile-memory-revolution,了解不是非常技术性的文章(或通过google获得更好的信息)。英特尔Skylake的clflushclflushopt说明支持它。
彼得·科德斯

1
您已经可以在96个插槽中购买具有多达12TiB RAM 的系统(例如Tyan的四插槽HPC系统),因此64TiB可能还不到五年的时间。有些人确实购买了它们,并为它们配备了那么多的RAM ...
Stephen Kitt

@StephenKitt嗯,这是确定的,因为DIMM容量需要接近3年内翻番😁
derobert

事实证明,您现在可以立即购买具有64 TiB RAM的系统
斯蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.