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

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

我刚刚读过这里

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

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

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

答案1

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

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

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

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

虚拟内存大于物理内存很有用,原因如下:

  • 它让内核映射整个物理内存,并为额外的虚拟映射留出空间。
  • 除了物理内存的映射之外,还有交换、文件和设备驱动程序的映射。
  • 在某些地方拥有未映射的内存很有用:要捕获的保护页面缓冲区溢出,由于ASLR, ETC。

答案2

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

  1. 第一个是这样您可以运行需要额外内存的应用程序 - 即使这意味着交换到磁盘。
  2. 更干净的内存布局来分区内存使用。例如,操作系统可能会采用编号较高的地址,并为应用程序留下编号较低的地址,以使分离更清晰。
  3. 地址空间布局随机化是比较有效一点。
  4. 将页面标记为可执行可能意味着剩余内存。
  5. 内存映射 I/O。
  6. 内存分配更容易:一次可以分配更大的块。
  7. 减少内存碎片

答案3

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

所以你得到:

2⁴⁸ 字节 ÷ 2 = 2⁴⁷ 字节 = 128 TiB

物理地址大小通常较小,因为它实际上是物理的。它占用 CPU 上/内的引脚/焊盘、晶体管、连接等以及板上的走线。芯片组中可能也是如此。支持超出处理器核心或插槽设计寿命的大量内存是没有意义的——所有这些都需要花钱。 (即使每个插槽有 32 个 DIMM 插槽和 64GiB DIMM,您的容量仍然只有 2TiB。即使 DIMM 容量每年翻一番,距离 64TiB 还需要 5 年时间。

作为彼得·科德斯指出,人们现在正在附加非易失性存储,例如3D X点到内存总线,这可能会耗尽地址空间。较新的处理器已将物理地址空间扩展至 48 位; Debian wiki 可能还没有更新。

相关内容