如果使用分段内存模型运行的 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中的印刷错误。