现代操作系统是否使用分页和分段?

时间:2014-06-23 03:41:12

标签: memory operating-system paging

我正在阅读有关内存架构的内容,我对分页和分段感到有些困惑。我读到现代操作系统只使用分页来管理内存访问,但是看一下反汇编的代码,我可以看到像“ds”和“fs”这样的段。这是否意味着操作系统(在Windows和Linux上看到)正在使用分段和分段,或者只是将所有段映射到相同的页面(使段不相关)?

2 个答案:

答案 0 :(得分:34)

好的,基于Andrew S. Tanenbaum的现代操作系统第3版和开放式安全培训(opensecuritytraining.info)的材料,我设法了解分段和分页,我的问题的答案是:

  1. <强>概念

    1.1的分割:

    分段是将内存划分为称为段的片段(部分)。这些细分市场是彼此独立的,具有可变的大小,可以根据需要增长。

    1.2。 虚拟内存:

    虚拟内存是真实内存的抽象。这意味着它将虚拟地址(由程序使用)映射到物理地址(由硬件使用)。如果程序想要访问存储器2000(mov eax,2000),则虚拟地址(2000)将被转换为真实物理地址(例如1422),然后程序将访问存储器1422,认为他正在访问存储器2000。 因此,如果系统正在使用虚拟内存,则程序不再直接访问实际内存,而是使用相应的虚拟内存。

    1.3。 分页:

    分页是一种虚拟内存管理方案。如前所述,它将虚拟地址映射到物理地址。分页将虚拟内存划分为称为“页面”的片段,并将物理内存划分为称为“帧页面”的片段。页面可以绑定到一个或多个框架页面(请记住,页面可以映射不同的框架页面,但当时只有一个)

  2. 优点和缺点

    2.1。 细分:

    使用分段的主要优点是将内存划分为不同的线性地址空间。使用这个程序可以为他的代码提供一个地址空间,另一个用于堆栈,另一个用于动态变量(堆)等。分段的缺点是内存碎片。 考虑这个例子 - 存储器的一部分被分成顺序分配的4个段 - &gt; seg1(in use) --- seg2(in use)--- seg3(in use)---seg4(in use)。现在如果我们从seg2中释放内存,我们将有 - &gt; seg1(in use) --- seg2(FREE)--- seg3(in use)---seg4(in use)。如果我们想要分配一些数据,我们可以通过使用seg2来实现,但是如果数据的大小大于seg2的大小,我们将无法这样做,并且空间将被浪费并且内存碎片化。另一个问题是某些段可能具有更大的大小,并且由于该段不能被“分解”成更小的块,因此它必须在内存中完全分配。

    2.1。 分页:

    使用分页的主要优点是抽象物理内存,因此,程序(和程序员)不需要打扰内存地址。您可以拥有两个访问(虚拟)内存2000的程序,因为它将映射到两个不同的物理内存中。此外,可以使用硬盘来确保只将必要的页面分配到内存中。主要缺点是分页仅使用一个线性地址空间。分页将虚拟内存从0映射到所有程序的最大可寻址值。现在考虑这个例子 - 两个内存块,“chk1”和“chk2”在虚拟内存上彼此相邻(chk1从地址1000到2000分配,chk2从2001到3000使用),如果chk1需要增长,操作系统需要在内存中为chk1的新大小腾出空间。如果再次发生这种情况,操作系统将必须执行相同的操作,或者,如果找不到空间,则会弹出异常。管理这种操作的例程对性能非常不利,因为内存的这种增长和缩小会发生很多时间。

  3. 细分和分页

    3.1。 为什么要将两者结合使用?

    操作系统可以结合分段和分页。为什么?因为合并然后可以从两者中获得最好而没有它们的缺点。因此,存储器被分成许多段,并且每个段具有一个或多个页面。当一个程序试图访问一个内存地址时,首先操作系统进入相应的段,在那里他会找到相应的页面,所以他进入页面,在那里他会找到程序想要访问的框架页面。使用这种方法,OS将内存划分为各个段,包括内核和用户程序的段。这些段具有可变大小和访问保护功能。为了解决碎片和“大段”问题,使用了分页。通过分页,较大的段被分成几个页面,只有必要的页面保留在内存中(如果需要,可以在内存中分配更多的页面)。因此,基本上,现代操作系统有两个内存抽象,其中分段更多地用于“处理程序”和分页用于“管理物理内存”。

    3.2。 它是如何运作的?

    运行分段和分页的操作系统将具有以下结构:

    3.2.1。 细分受众群:

    这表示全局/本地描述符表上的索引。它包含3个表示描述符表上的索引的字段,用于标识该段是否存在于全局或本地描述符表以及特权级别的位。

    3.2.2。 细分注册:

    用于存储段选择器的CPU寄存器。通常(在x86机器上)至少有寄存器CS(代码段)和DS(数据段)。

    3.2.3。 细分描述符:

    此结构包含有关段的数据,例如其基址,大小(以页为单位或以字节为单位),访问权限,该段是否存在于内存中的信息等等(对于所有字段,在谷歌上搜索段描述符

    3.2.4。 全球/本地描述符表:

    包含多个段描述符的表。因此,此结构包含系统的所有段描述符。如果表是全局的,它可以包含其他内容,如本地描述符表描述符,任务状态段描述符和调用门描述符(我不会在这里解释这些,请谷歌他们)。如果表是Local,则只会(据我所知)保存与用户相关的段描述符。

    3.3。 如何运作?

    因此,要访问内存,首先程序需要访问一个段。为此,将段选择器加载到段寄存器中,然后加载到全局或局部描述符表(取决于段选择器上的字段)。这就是完全内存地址为SEGMENT REGISTER: ADDRESS , like CS:ADDRESS -> 001B:0044BF7A的原因。现在操作系统转到G / LDT并(使用段选择器的索引字段)找到试图访问的地址的段描述符。然后它检查段是否存在,保护,如果一切正常,它将转到“基本字段”(描述符)+地址偏移量上指定的地址。如果未启用分页,系统将直接进入实际内存,但对地址进行分页将被视为虚拟地址,并将其转至Page目录。基址+偏移量称为线性地址,将被解释为3个字段:目录+页面+偏移量。因此在目录页面上,它将搜索在线性地址的“目录”字段中指定的目录条目,此条目指向页面表,并且线性地址的字段“页面”用于查找页面,这入口指向框架页面,偏移量用于查找程序要访问的确切地址。

    3.4。 现代操作系统

    现代操作系统&#34;不使用&#34;分割。它的引号是因为它们使用了4个段:内核代码段,内核数据段,用户代码段和用户数据段。这意味着所有用户的进程都具有相同的代码和数据段(因此相同的段选择器)。段仅在从用户到内核时发生变化。 因此,3.3节中解释了所有路径。发生,但它们使用相同的段,并且由于页表是每个进程的个体,因此很难发生页面错误。

  4. 希望这有帮助,如果有任何错误或更多细节(我在某些部分我有点通用),请随时评论和回复。 谢谢你们

    Danilo PC

答案 1 :(得分:5)

他们只对内存保护使用分页,而他们将分段用于其他目的(如存储线程本地数据)。