0

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

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

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

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

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

4

2 回答 2

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 个 32 位进程,每个进程都有 4GB 内存?

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

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

于 2019-08-22T14:22:59.547 回答
0

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

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

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

于 2012-11-29T07:25:15.190 回答