Memory 64位操作系统上的独立32位进程是否共享相同的地址空间?

Memory 64位操作系统上的独立32位进程是否共享相同的地址空间?,memory,memory-management,32bit-64bit,Memory,Memory Management,32bit 64bit,我有个问题似乎找不到答案 我希望这对一些人来说是一个简单的答案,所以我想我会把它放在这里: 在64位操作系统上运行的所有32位进程是否共享相同的4GB地址空间,或者每个32位进程是否具有单独的4GB可寻址区域 我知道32位进程只能寻址232字节,但这些是指向虚拟内存而不是物理内存的指针,对吗?还是不?(我不太清楚事情是如何运作的) 我想知道是否可以运行2个32位进程,每个进程的内存为4GB?这取决于许多因素,包括处理器和操作系统 这两种情况都可以,可以共享虚拟地址,也可以从64位地址空间获取一个

我有个问题似乎找不到答案

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

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

我知道32位进程只能寻址232字节,但这些是指向虚拟内存而不是物理内存的指针,对吗?还是不?(我不太清楚事情是如何运作的)


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

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

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


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

视情况而定。只要硬件能够支持,每个操作系统都可以自由地实现它认为合适的内存空间

现在,了解大多数操作系统的实际操作(假设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个32位进程,每个进程有4GB内存

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


Windows允许这样做,如果Linux和/或macOS不允许的话,我会非常惊讶。

取决于操作系统,但很可能每个操作系统都会在64位空间中获得各自独立的32位空间块