x64机器上的x86 LARGEADDRESSAWARE程序的内核模式内存大小?

时间:2016-03-30 15:56:46

标签: c# windows virtual-memory

标题几乎总结了它。我有一个为x86平台编译的应用程序,它设置了false标志。在x64系统上运行它,我可以“免费”获得扩展的4gb用户模式虚拟内存,而无需指定/largeaddressaware启动选项。在x86系统上,这意味着内核模式内存只有1GB,但由于x64系统可以占用更多内存,内核模式是否会保留2gb甚至可以达到3gb?

编辑:要清楚,我想知道每个进程的限制。问题源于阅读this article

编辑2:此问题与How much memory can a 32 bit process access on a 64 bit operating system?不重复,因为该问题仅解决应用程序可访问的内存,而不是系统可访问的内存。如果我误解了并且系统没有为每个进程保留内存,我会很感激,如果有人可以把它写成答案。我确信我不是第一个对此感到困惑的人。

2 个答案:

答案 0 :(得分:2)

有一些令你困惑的误解。

首先,让我们看一下32位Windows。每个进程的虚拟地址空间都有一定的部分分配给进程本身,而某个部分则分配给内核需要的部分。但是,所有进程共享相同的内核内存 - 您甚至在自己的虚拟地址空间中拥有内核内存这一事实基本上是一种性能优化,以避免在处理应用程序中的内核对象和数据时切换地址空间。 p>

默认情况下,这是1:1分割,因此您获得2 GiB的用户地址空间和2 GiB的内核地址空间。这是早期32位Windows软件使用的(ab)(当你的计算机可能只有4 MiB的内存总量和486 CPU或类似),因为由于内存的布局方式,你的用户地址空间从来没有任何指针高于 2个GiB障碍 - 有效地为您自己的数据提供任何指针的最高位。通常这用于允许混合物#34;如果它适合,这是一个值,否则它是指向结构的指针"方法,节省内存和一点间接。由于这种情况如此广泛,因此默认情况与早期版本相同,以防止出现兼容性问题。但是,您还可以选择加入另一个分区 - 3 GiB的用户空间和1 GiB的内核空间。这就是/3GB选项的作用。但这还不够 - 您的应用必须使用/LARGEADDRESSAWARE 选择加入。这基本上说"我不会用我的指针来做奇怪的事情"。

应该注意的是,32位操作系统或进程并不一定意味着你只能处理4 GiB的内存 - 它只是限制了CPU在任何时候都可以直接访问的内容。对于内存密集型服务器软件,甚至是" 32-bit"版本可能支持寻址更多内存 - 例如,32位MS SQL Server通过AWE支持最多64 GiB。这基本上是另一层虚拟化,它允许重新映射虚拟地址'物理地址。从理论上讲,无论是否使用AWE,您都可以解决的内存量没有限制 - 毕竟,没有什么能阻止您使用自己的硬件充当内存映射文件,从而有效地为您提供无限的地址空间。当然,就像分段记忆的日子一样,它不太容易使用或不实用:)

在64位Windows上,/3GB不再有任何意义,会被忽​​略。默认地址空间拆分取决于Windows的确切版本,但是在" terabytes以及更多"范围,超出32位限制。对于现代Windows,这通常是128 TiB用户+ 128 TiB内核。 32位应用程序仍然必须像以前一样使用/LARGEADDRESSAWARE。但是,由于内核现在是64位,它无论如何都不能与用户进程位于同一地址空间,因此64位操作系统上的32位应用程序可以完全访问4 GiB的地址空间。

当然,这些限制仍远低于64位理论上能够解决的问题。但是,大多数64位CPU实际上不能对整个64位地址空间进行寻址 - 最后一次检查时最常见的只是48位。令人惊讶的是,它给你带来了256 TiB的地址空间,这是Windows的极限。毕竟不是微软的阴谋! :)实际上,这并不是什么新鲜事。英特尔x86的32位ALU与32位地址空间相关联的事实在CPU历史中是一个非常重要的事实 - CPU通常具有更高和更低的地址空间(用于虚拟寻址或物理寻址)宽度。他们的ALU宽度。 MS DOS典型限制为1 MiB的可寻址存储器(剩余640 kiB留给用户应用程序)也来自于此 - " 32位"当时的CPU只能使用20位地址。

答案 1 :(得分:0)

如您链接的文章所述,32位CPU上可用的4GB地址空间分为两部分:用户模式或应用程序地址空间以及内核模式地址空间。

用户模式地址空间是按进程的。每个进程在用户模式地址空间中的页面与物理或虚拟内存之间具有不同的映射。

无论当前正在运行哪个进程,内核模式地址空间都是相同的。否则,在每次转换到内核模式时都必须重新映射地址空间,这将是非常低效的。 (文章确实说过,但只是非常简短地说:“操作系统使其虚拟内存在每个进程的地址空间中都可见”。)

默认情况下,32位Windows将其均匀分配,用户空间为2GB,内核空间为2GB,但可配置为将其分为3GB / 1GB。

在x64 Windows上,内核以64位模式运行,因此可以访问CPU允许的完整地址空间,当前为48位或256TB。第一个x64 Windows版本仅使用16TB的地址空间,均匀分配:应用程序地址空间为8TB(对于64位应用程序),对于内核为8TB。在Windows 8.1中,这增加了使用CPU允许的整个256TB,再次平均分配:64位应用程序为128TB,内核为128TB。

32位应用程序在WOW64仿真环境中运行,CPU以传统模式运行。但是,内核永远不会在传统模式下运行。当需要进行内核转换时,CPU必须从传统模式切换到长模式,这也意味着它从32位地址空间切换到64位地址空间。 x64 CPU的设计使这种转换变得高效。

因此,不需要为内核保留任何的32位地址空间。

为确保向后兼容性,32位进程(其可执行文件未标记为可识别大地址)仍限制为2GB的地址空间。如果可执行文件 大地址识别,则进程获得全部4GB。

您应该注意,这确实是地址空间,而不是内存,甚至虚拟内存。 32位应用程序可以使用文件映射和其他方法来使用超过4GB的内存。

您还应该注意,进程可以访问2GB / 3GB / 4GB的地址空间这一事实并不意味着应用程序可以使用所有这些空间。 Windows为每个进程保留一些用户模式地址空间。

地址空间和其他限制在此处记录:Memory Limits for Windows and Windows Server Releases