装配分段模型32位内存限制

时间:2010-10-28 02:38:48

标签: assembly x86 operating-system paging memory-segmentation

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

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

  

“在分段的记忆模型中   组织,逻辑地址   空间由多达16,383个组成   每个最多4千兆字节的段,或   总计大到2 ^ 46字节(64   兆兆字节)。处理器映射这个64   terabyte逻辑地址空间   物理地址空间   地址翻译机制   在第11章中描述   程序员可以忽略细节   这个映射。的优点   分段模型就是内在的偏移   每个地址空间都是分开的   检查并访问每个   细分可以单独进行   控制。

alt text

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


更新

alt text

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


alt text

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


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

  

在保护模式下,您使用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.-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的声明是英特尔奔腾处理器系列开发人员手册中的错误打印。

5 个答案:

答案 0 :(得分:2)

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


重复你的引用,重点是:

  

逻辑地址空间包含   多达16,383个段   每个4千兆字节

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

  

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

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

答案 1 :(得分:2)

你还记得过去的日子吗? DOS上x86实模式,64kb段? FAR指针? HMA? XMS?随着内存量的增长,他们已经找到了使用比处理器通常可以解决的更多内存的方法。但它很难看。

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

此外,32位操作系统可以使用超过4Gb,这个过程仅限于4Gb地址空间(在Windows上甚至是2或3)。

答案 2 :(得分:2)

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

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

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

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

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

答案 3 :(得分:0)

AFAIK,由于操作系统的其他限制,答案是“不一定”。他们可能希望将内存的最大大小保持在远低于理论极限的范围内,因为这可能会使一些内部内存结构更小,性能更高。但我真的不知道......我不是Mark Russinovich ......

看看PAE。我认为这就是你所说的,但是因为我已经毕业到64位指针,我决定用肯塔基直波本威士忌杀死处理窗口记忆模型的脑细胞

答案 4 :(得分:-1)

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