使用分段的32位x86的64 TB虚拟内存:如何?

问题描述 投票:2回答:3

Intel x86内存模型具有分段和分页功能。这意味着系统可以处理多达64 TB的虚拟内存。我的理解是只有4GB的虚拟内存是可寻址的。这里有什么差距?这都是在32位处理器的上下文中

这是数学:

2 ^ 13(段选择器)* 2(LDT或GDT)* 2 ^ 32 = 2 ^ 46 = 64太字节。这在文献中称为总虚拟存储器。他们错误地称它为虚拟内存吗?令我困惑的是,处理器本身只有32位地址线。

或者,他们是否试图说这是可以分配的总虚拟内存(在所有进程中?)

memory x86 virtual intel memory-segmentation
3个回答
1
投票

它实际上是可用的 - 您可以将内存交换到磁盘并在需要时实际处理那么多虚拟内存,因此数字应该是正确的,您可以将其称为虚拟内存。

但是,32位模式下的x86处理器只能在不交换的情况下同时处理4 GB,而且在32位模式下,我听说没有系统曾经使用过那么多内存,而且它通常不太实用由于表现。


1
投票

我想在这里说的是x86处理器能够处理那么多内存,而不是它在实践中所做的。只有当程序使用分段存储器模型并使用完整段和GP寄存器并且CPU以这种方式连线使用它时,才有可能实现这一点。但是,今天的程序通常使用平面内存模型(可以解决更少的内存),操作系统不支持寻址那么多内存AFAIK。

并且来自manual [1]的§3.3.1:

分段存储器模型 - [...]在IA-32处理器上运行的程序可以处理多达16,383 [214]个不同大小和类型的段,每个段可以大到232个字节。

显然,他们有能力处理246(64 TiB)字节的(虚拟和物理?)内存但我们仅限于程序中使用的内存模型以及操作系统是否支持它。


1
投票

1)通过段选择器从这些2 ^ 13 * 2 = 2 ^ 14中选择段描述符,该段选择器位于单独的寄存器中,因此它绕过32地址线限制。

2)段描述符包含段的32位地址,该地址是32位值。将32位偏移量添加到它是一个简单的算术加法,因此您最终得到一个32位地址。 2 ^ 32 =仅4GB。

问题是,细分可能会重叠。数学中的错误在于当前段描述符(14位)和偏移量(32位)的索引未连接。它们被处理以形成32位线性地址。

有关x86内存分段的更多信息,请查看this page

© www.soinside.com 2019 - 2024. All rights reserved.