5

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

我正在阅读Intel Pentium Processor Family Developer's Manual,它指出使用分段内存模型可以映射高达64TB的内存。

“在内存组织的分段模型中,逻辑地址空间由多达 16,383 个段组成,每个段最多 4 GB,或总计高达 2^46 字节(64 TB)。处理器映射这个 64 TB 的逻辑地址通过第 11 章中描述的地址转换机制将空间转移到物理地址空间。应用程序员可以忽略这种映射的细节。分段模型的优点是每个地址空间内的偏移量被单独检查,并且可以单独访问每个段受控。

替代文字

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


更新:

替代文字

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


替代文字

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 包含一个描述符列表。这些描述符中的每一个都包含描述段特征的信息。

Segment Selector 提供了分页无法实现的额外安全性。

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

然而,分段完全内置于 x86 架构中。绕过它是不可能的。所以在这里我们将向你展示如何设置你自己的全局描述符表——一个段描述符列表。

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

- http://www.jamesmolloy.co.uk/tutorial_html/4.-The%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 Processor Family Developer's Manual中的印刷错误。

4

5 回答 5

2

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


重复你的报价,强调:

逻辑地址空间由多达 16,383 个段组成,每个段高达 4 GB

现在,引用“英特尔® 64 和 IA-32 架构软件开发人员手册第 1 卷:基本架构”(此处提供 PDF ):

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

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

于 2010-10-28T03:03:54.660 回答
2

你还记得过去的日子吗?x86 上的 DOS 在实模式下使用 64kb 段?FAR指针?HMA?短信服务?随着内存量的增长,他们找到了使用比处理器通常可以处理的更多内存的方法。但这很丑陋。

当然他们可以使用 32 位分段,但为什么呢?没有必要。当 32 位处理器出现时,4Gb 的限制已经绰绰有余,因此决定使用平面模型。

此外,一个 32 位操作系统可以使用超过 4Gb,它是被限制为 4Gb 地址空间的进程(在 Windows 上甚至是 2 或 3 个)。

于 2010-10-28T03:06:25.860 回答
2

声称是 64TB 的逻辑地址空间。提出物理内存限制是无关紧要的,因为通过启用内存分页,可以绕过物理限制。

然而,这仍然是一个有点误导性的说法,因为段选择器的索引字段是 16 位,表指示符为 1 位,请求保护级别为 2 位,总共剩下 8,192 个(13 位)段选择器。对于 8,192 个 4GB 段,一个只能访问 GDT(全局描述符表)或 LDT(本地描述符表)中的 32TB 逻辑内存。为了能够访问 64TB 的逻辑内存,必须充分利用具有 16,384 个独特段的 GDT 和 LDT。

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

如果操作系统使用分段内存模型,第二个问题是否会被限制在 64TB,这个问题的答案就不那么直接了。提供内存管理器是操作系统的工作。显然会有 32GB RAM 的物理限制。32 位 Linux,因为它使用分页,可以为每个应用程序提供 4GB 的平面地址空间(忽略内核/用户拆分细节)。而且,每个进程都认为自己拥有 4GB 的物理地址空间。

简而言之,我认为您将分段的限制与分页的限制混淆了。分页使系统或应用程序能够使用比物理可用内存更多的 RAM。分段使进程能够映射到多个 32 位逻辑可寻址段。它的关键要注意,即使是平面模式也使用分段,但所有段寄存器都映射到相同的基地址。

于 2014-08-15T06:37:39.210 回答
0

AFAIK,由于操作系统的其他限制,答案是“不一定”。他们可能希望将内存的最大大小保持在远低于理论限制的水平,因为这可能会使某些内部内存结构更小且性能更高。但我真的不知道……我不是马克·鲁西诺维奇……

看看PAE。我这就是你所说的,但自从我毕业到 64 位指针后,我决定用肯塔基纯波旁威士忌杀死处理窗口记忆模型的脑细胞。

于 2010-10-28T03:14:11.743 回答
-1

英特尔的分段模型仅限于 16,384 个分段。这个数字太小了,无法真正使事情变得方便。如果系统可以在 2 到 40 亿段之间快速切换,那会更好。这就是我希望看到的,而不是 64 位线性空间。一种可以有效地将每个分配的对象放入不同段的设计将允许对每个分配的对象进行无额外开销的范围检查,对象重定位对运行代码的影响最小(假设 CPU 可以注意到当前选择的段何时无效)等,同时只要求对象引用在缓存中占用的空间是 64 位指针的一半。

于 2010-10-28T03:55:17.207 回答