我只是在这里读:
- 每个进程多达128TiB虚拟地址空间(而不是2GiB)
- 支持64TiB物理内存,而不是4GiB(或带有PAE扩展名的64GiB)
这是为什么?我的意思是,物理内存支持受内核还是受当前硬件限制?
为什么您需要的虚拟内存空间是实际可寻址物理内存的两倍?
我只是在这里读:
- 每个进程多达128TiB虚拟地址空间(而不是2GiB)
- 支持64TiB物理内存,而不是4GiB(或带有PAE扩展名的64GiB)
这是为什么?我的意思是,物理内存支持受内核还是受当前硬件限制?
为什么您需要的虚拟内存空间是实际可寻址物理内存的两倍?
Answers:
这些限制不是来自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。)
由于以下几个原因,使虚拟内存大于物理内存非常有用:
我不知道为什么,但是我可以想到七个原因,为什么支持两倍于物理内存的地址空间会很有用。
这些是硬件限制。当前的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可能尚未更新。
clflush
和clflushopt
说明支持它。