【发布时间】:2011-05-01 15:49:25
【问题描述】:
如果使用分段内存模型运行的 32 位操作系统,它们仍然是 4GB 限制吗?
我正在阅读 英特尔奔腾处理器系列开发人员手册,其中指出,使用分段内存模型可以映射到 64TB 内存。
"在内存的分段模型中 组织,逻辑地址 空间由多达 16,383 每个最多 4 GB 的段,或 总大小为 2^46 字节(64 兆兆字节)。处理器映射这个 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 包含一个描述符列表。这些描述符中的每一个都包含描述段特征的信息。
段选择器提供了分页无法实现的额外安全性。
[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 的声明是错误的。
【问题讨论】:
-
internals.com/articles/protmode/protmode.htm 这个链接对我有点帮助。
-
是的,这个“印刷错误”让我用了 4 个小时来搜索由此产生的所有无意义的问题。
标签: assembly x86 operating-system paging memory-segmentation