Assembly 组件分段模型32位内存限制

Assembly 组件分段模型32位内存限制,assembly,x86,operating-system,paging,memory-segmentation,Assembly,X86,Operating System,Paging,Memory Segmentation,如果32位操作系统使用分段内存模式运行,它们的内存限制是否仍然是4GB 我正在阅读《英特尔奔腾处理器系列开发人员手册》,其中指出,使用分段内存模型,可以映射到高达64TB的内存 “在一个分段的记忆模型中 组织,逻辑地址 空间由多达16383个元素组成 每个段最多4 GB,或 总计多达2^46字节(64 处理器映射这个64兆字节 上的TB逻辑地址空间 由 地址转换机制 如第11章“应用”所述 程序员可以忽略程序的细节 这个映射。的优点是 分段模型是指在 每个地址空间都是独立的 检查并访问每个 段可

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

我正在阅读《英特尔奔腾处理器系列开发人员手册》,其中指出,使用分段内存模型,可以映射到高达64TB的内存

“在一个分段的记忆模型中 组织,逻辑地址 空间由多达16383个元素组成 每个段最多4 GB,或 总计多达2^46字节(64 处理器映射这个64兆字节 上的TB逻辑地址空间 由 地址转换机制 如第11章“应用”所述 程序员可以忽略程序的细节 这个映射。的优点是 分段模型是指在 每个地址空间都是独立的 检查并访问每个 段可以是单独的 控制

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


更新:

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



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

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

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

这两种方法[分段和分页]都有各自的优点,但分页要好得多。分段虽然仍然可用,但作为内存保护和虚拟内存的方法很快就会过时。事实上,x86-64体系结构需要一个平面内存模型(一个分段的基数为0,限制为0xFFFFFF)对于一些正确操作的说明

但是,分段完全内置于x86体系结构中。不可能绕过它。因此,这里我们将向您展示如何设置您自己的全局描述符表—一个分段描述符列表

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

-

例如,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)

分页部分是映射到物理内存的部分。(PAE)是提供高达64GB的附加内存的部分


>总之,答案是不,你不能有超过4GB的逻辑内存。我认为在英特尔奔腾处理器开发人员手册中有一个64字节的错误。

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


重复您的报价,并强调:

逻辑地址空间由 多达16383段,最多 每个4千兆字节

现在,引用“英特尔64和IA-32体系结构软件开发人员手册第1卷:基本体系结构”(PDF格式):

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


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

您还记得以前的日子吗?x86上的DOS是64kb段的实模式吗?
指针?HMA?XMS?随着内存量的增加,他们找到了使用比处理器正常寻址更多内存的方法。但这很难看

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


此外,32位操作系统可以使用超过4Gb的地址空间,这是一个仅限于4Gb地址空间的进程(在windows上甚至是2或3个地址空间)由于操作系统的其他限制,答案是“不一定”。他们可能希望将内存的最大大小保持在理论限制以下,因为这可能会使一些内部内存结构更小、性能更高。但我真的不知道……我不是


看一看。我想这就是你所说的,但由于我已经毕业于64位指针,我决定用肯塔基纯波旁威士忌杀死处理窗口内存模型的脑细胞。

英特尔的分段模型仅限于16384段。这个数字太小,无法真正使事情变得更为简单如果系统能够在20亿到40亿个细分市场之间快速切换,那会更好。这是我希望看到的,而不是一个6