繁体   English   中英

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

[英]Kernel Mode memory size for an x86 LARGEADDRESSAWARE program on an x64 machine?

标题几乎总结了一下。 我有一个为x86平台编译的应用程序,该应用程序设置了/largeaddressaware标志。 在x64系统上运行它,我可以“免费”获得扩展的4gb用户模式虚拟内存,而不必指定/3GB引导选项。 在x86系统上,这意味着内核模式内存仅为1gb,但是由于x64系统可以寻址更多内存,因此内核模式是否保留2gb甚至提高到3gb?

编辑:明确地说,我想知道每个进程的限制。 问题来自阅读本文

编辑2:此问题不是在64位操作系统上32位进程可以访问多少内存的重复项 因为该问题仅解决了应用程序可访问的内存,而不是系统可访问的内存。 如果我被误解了,并且每个进程都没有为系统保留内存,那么如果有人可以将其写成答案,我将不胜感激。 我确定我不是第一个对此感到困惑的人。

有一些误解使您感到困惑。

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

默认情况下,这是1:1拆分,因此您获得2 GiB的用户地址空间和2 GiB的内核地址空间。 早期的32位Windows软件(当您的计算机可能只有486 CPU或类似的内存而总内存只有4 MiB时)会使用(滥用),因为由于内存的布局方式,您的用户地址空间永远不会有超过 2个GiB障碍的任何指针-有效地为您提供任何指针中最高的位,供您自己的数据使用。 通常,这是用来允许混合的“如果合适,这是一个值,否则它是指向结构的指针”方法,从而节省了内存并减少了间接性。 由于分布范围如此广泛,因此默认设置与早期的设置相同,以防止出现兼容性问题。 但是,您还可以选择加入其他分区-3 GiB用户空间和1 GiB内核空间。 这就是/3GB选项的作用。 但这还不够-您的应用程序必须使用/LARGEADDRESSAWARE选择加入。 这基本上是说“我不会用指针做一些奇怪的事情”。

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

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

当然,这些限制仍然远低于理论上能够解决的64位。 但是,大多数64位CPU实际上无法寻址整个64位地址空间-上一次我检查的最常见的只是48位。 令人惊讶的是,这给了您256 TiB的地址空间,这是Windows的极限。 毕竟不是微软的阴谋! :)实际上,这并不是什么新鲜事物。 Intel x86的32位ALU与32位地址空间相关联的事实在CPU历史上是一个异常的事实-CPU的地址空间(用于虚拟寻址或物理寻址)宽度通常比其ALU宽度高或低。 MS DOS对1 MiB可寻址内存的典型限制(还有640 kiB留给用户应用程序)也来自此-当时的“ 32位” CPU只能使用20位地址。

如您链接的文章所述,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在每个进程中为其保留一些用户模式地址空间。

地址空间和其他限制在此处记录: Windows和Windows Server Releases的内存限制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM