如果 32 位操作系统使用分段内存模型运行,那么它们仍然是一个 4GB 限制?

我正在读 Intel Pentium 处理器系列开发人员手册 它指出,使用分段内存模型,可以映射到 64TB 的记忆。

“在内存组织的分段模型中,逻辑地址空间由多达16,383个段,每个片段最多4千兆字节,或总计高达2^46个字节(64个trabytes)。处理器通过第11章中描述的地址翻译机制将此64个Terabyte逻辑地址空间映射到物理地址空间。应用程序程序员可以忽略此映射的详细信息。分段模型的优点是,分别检查了每个地址空间内的偏移量,并且可以单独控制每个段的访问。

alt text

这不是一个复杂的问题。我只是想确保我正确理解了文本。如果 Windows 或任何其他操作系统在分段模型而不是平面模型中工作,内存限制是否为 64TB?


更新:

alt text

英特尔的 3-2 3a 系统文档。


alt text

http://pdos.csail.mit.edu/6.828/2005/readings/i386/c05.htm


段寄存器不应被视为传统实模式意义上的。段寄存器充当全局描述符表的选择器。

在保护模式下,您使用 A:B 形式的逻辑地址来寻址内存。与实模式一样,A 是段部分,B 是该段内的偏移量。> 保护模式下的寄存器限制为 32 位。32 位可以表示 0 到 4Gb 之间的任何整数。因为 B 可以是 0 到 4Gb 之间的任何值,所以我们的段现在的最大大小为 4Gb(与实模式中的推理相同)。现在来说说区别。在保护模式下,A 不是段的绝对值。在保护模式下,A 是一个选择器。选择器表示称为全局描述符表 (GDT) 的系统表中的偏移量。GDT 包含描述符列表。每个描述符都包含描述段特征的信息。

段选择器提供了分页无法实现的额外安全性。

这两种方法【分段和分页】各有优点,但分页要好得多。分段虽然仍然可用,但作为内存保护和虚拟内存的方法很快就会过时。事实上,x86-64 架构需要一种平面内存模型(一个以 0 为基数且限制为 0xFFFFFFFF 的段),以便其某些指令能够正常运行。

然而,分段完全内置于 x86 架构中。想要绕过它是不可能的。因此,在这里我们将向您展示如何设置您自己的全局描述符表 - 段描述符列表。

如前所述,我们将尝试建立一个平面内存模型。该段的窗口应从 0x00000000 开始并扩展到 0xFFFFFFFF(内存末尾)。然而,分段可以做寻呼不能做的一件事,那就是设置振铃级别。

-http://www.jamesmolloy.co.uk/tutorial_html/4.-%20GDT%20and%20IDT.html

例如,GDT 列出了各个用户的访问级别和内存访问区域:

GDT 表示例

GDT[0] = {.base=0, .limit=0, .type=0};             
// Selector 0x00 cannot be used
GDT[1] = {.base=0, .limit=0xffffffff, .type=0x9A}; 
// Selector 0x08 will be our code
GDT[2] = {.base=0, .limit=0xffffffff, .type=0x92}; 
// Selector 0x10 will be our data
GDT[3] = {.base=&myTss, .limit=sizeof(myTss), .type=0x89}; 
// You can use LTR(0x18)

http://wiki.osdev.org/GDT_Tutorial#What_should_i_put_in_my_GDT.3F

分页部分映射到物理内存。(PAE) 可提供高达 64GB 的额外内存。

简而言之。答案是否定的,您不能拥有超过 4GB 的逻辑内存。我认为 64TB 的说法是印刷错误 Intel Pentium 处理器系列开发人员手册.

有帮助吗?

解决方案

编辑: 我的回答假设“4GB 限制”指的是线性(虚拟)地址空间的最大大小,而不是物理地址空间的最大大小。正如下面评论中所解释的,后者实际上根本不限于 4GB - 即使使用平面内存模型也是如此。


重复你的引用,并强调:

逻辑的 地址空间由多达16,383个部分组成,最多4千兆字节

现在,引用《Intel® 64 和 IA-32 架构软件开发人员手册第 1 卷》:基本架构”(提供 PDF 这里):

在内部,为系统定义的所有段都映射到处理器的 线性 地址空间。

它是这个 线性 地址空间(在 32 位处理器上)限制为 4GB。因此,分段内存模型仍然会受到限制。

其他提示

你还记得过去的日子? DOS在x86与64KB段实模式? FAR指针? HMA? XMS?随着内存量的增长,他们已经找到了使用更多的内存比处理器能够正常解决。但它是难看。

当然,他们可以使用分割为32位,但为什么呢?没有必要。当32个处理器出现4GB的限制是绰绰有余,所以使用平面模型中的决定做出。

另外,32位操作系统可以使用多于4GB,它是被限制为(即使2或3上的窗口)的4Gb地址空间的过程。

在权利要求是逻辑地址空间64TB。造就物理存储器的限制,因为通过使内存分页,可以旁路的物理限制是无关紧要的。

然而,这仍是一个有些误导权利要求由于段选择的索引字段是16位,减1位表指示和请求保护级别2位,留下总共8192(13位)的段选择符。与8192个4GB段一个可能只能访问逻辑存储器的32TB无论是在GDT(全局描述符表)或LDT(局部描述符表)。为了能够逻辑存储器的访问64TB,人们必须充分利用两个在GDT和LDT与16384个独特片段。

无论如何,第一个问题是,“是有4GB的限制”,答案是“否”。在32位的系统,分段和分页同时启用,人们可以,例如,分配512MB代码段(CS),1GB到堆栈段(SS),和4GB的数据段(DS)。

的答案是否,如果它使用分段存储器模型中的OS将被限制为64TB的第二个问题是较少直线前进。这是OS提供的内存管理器的工作。显然,将有32GB内存的物理限制。 32位Linux,因为它使用了寻呼,可以提供具有4GB的平面地址空间中的每个应用程序(忽略内核/用户分裂详情)。并且,每一个过程认为它具有物理地址空间4GB。

在简短的总结,我认为你是分页的局限性混淆分割的局限性。寻呼使系统或应用程序使用更多的内存比实际可用。分割使得能够处理在多个32位逻辑寻址段映射。其音符关键,即使扁平模式使用分割,但所有的段寄存器被映射到相同的基地址。

AFAIK,答案是“不一定”,由于OS的其他限制。他们可能希望保留的内存下降远低于理论极限的最大尺寸,因为这样可以使一些更小,更高性能的内存结构。但我真的不知道......我没有的标记Russinovich ...

看一看 PAE 。我的认为的,这是你在说什么,但因为我已经毕业的64位指针,我已经决定要杀死脑细胞其中涉及开窗内存模型与肯塔基州直波本威士忌

在Intel的分段模型被限制在16384段。这是太小了一些,真正使事情方便。什么将是更加美好本来如果该系统能迅速二个或四个十亿段之间切换。这就是我本来希望看到的,而不是一个64位的线性空间。这可以有效地把每一个分配的对象到不同的段A设计能够为每个人分配的对象没有额外开销范围检查,目标再上运行的代码(假设CPU可以注意到,当当前选择分段是微乎其微的影响无效)等同时仅需要对象引用采取一半在高速缓存作为64位指针的空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top