将64位操作系统上的32位进程分开共享相同的地址空间?

时间:2012-11-16 15:05:20

标签: memory memory-management 32bit-64bit

我有一个问题,我似乎无法找到答案。

我希望这对某些人来说是一个简单的答案,所以我想我会把它扔到这里:

在64位操作系统上运行的所有32位进程是否共享相同的4GB地址空间,或者每个32位进程是否都有一个单独的4GB可寻址区域?

我知道32位进程只能处理2个 32 字节,但那些是指向虚拟内存而不是物理内存的指针吗?或没有? (我不太确定事情是如何运作的)

我想知道我是否可以运行2个带有4GB内存的32位进程?

2 个答案:

答案 0 :(得分:1)

这取决于。只要硬件能够支持,每个操作系统都可以自由地实现其认为合适的内存空间。

现在,对于大多数操作系统的实际操作(假设x86进程在x86_64系统下运行):

  

运行在64位操作系统上的所有32位进程将共享相同的4GB地址空间,还是每个32位进程都具有单独的4GB可寻址区域?

否。这是非常不常见的设置。 x86_64要求分页,并且分页保护模式(32位)x86操作系统并为每个进程分配自己的地址空间是非常普遍的。这样做并没有真正的好处,这意味着在这样的系统下,所有32位进程都将争夺相同的〜4GB,这并不理想。而且,这将使得阻止32位进程从彼此的内存中进行读写操作变得更加困难。

Linux,macOS和Windows都为每个32位进程提供了不同的地址空间。

  

我知道一个32位进程只能寻址2 ^ 32个字节,但是这些是指向虚拟内存而不是物理内存的指针,对吗?或者没有? (我不太确定情况如何)。

32位进程确实可以寻址2 ^ 32字节。但是,使用映射,内核可以映射这些地址,或者更确切地说,将地址范围(称为页面)映射到物理内存。

默认情况下,32位x86处理器的分页系统也可以寻址2 ^ 32个物理地址。为了使系统能够映射更多的物理地址,提出了两个扩展:PSE-36和PAE。两者都将可寻址物理内存从32位扩展到了36位。实际上,只认真使用了PAE。

因为PAE将物理地址空间扩展到了36位,所以它允许内核整体上使用多达64GiB的内存。但是,单个进程仍然仅限于4GiB。

实际上,内核需要保留在内存中的映射。内核通常留在较高的512MiB / 1GiB中,通常在地址空间的顶部,从而导致每个进程的3GiB内存限制是常见的。

在x86_64下,始终启用PAE,并将其升级为支持48位虚拟地址和52位物理地址。 AMD提出了一项建议,将来将支持56位虚拟地址作为扩展。

  

我想知道我是否可以运行2个具有4GB内存的32位进程?

。在64位操作系统下,情况大不相同。内核可以留在很高的内存中,不需要完全映射到32位进程。 通常,内核只会将一堆页面映射到32位进程的地址空间顶部,以处理系统调用和中断。这些页面仅包含足够的代码即可返回长模式(64位)并获得完整的64位地址空间,内核可以从中完成其工作。由于内核只需要几页而不需要512MiB / 1GiB地址空间来执行此操作,因此在64位OS上运行的32位进程通常可以使用其4GiB地址空间的绝大部分。

Windows允许这样做,如果没有Linux和/或macOS,这会让我感到非常惊讶。

答案 1 :(得分:0)

这取决于许多因素,包括处理器和操作系统。

您可以同时拥有这两种情况,您可以拥有共享的虚拟地址,并且可以从64位地址空间获取切片。我相信这在Linux中依赖于处理器,但我可能错了。对于32位应用程序,它们似乎都共享相同的虚拟地址。

您的第二个问题,每个进程可以访问4GB吗?可能不是。内核通常有一个保留的内存空间(如果我没记错的话,在Linux上为1GB)。但假设您的问题是“每个进程可以访问3GB”,那么答案是肯定的,假设您有足够的物理RAM。