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

Posted

技术标签:

【中文标题】现代操作系统是不是使用分页和分段?【英文标题】:Do modern OS's use paging and segmentation?现代操作系统是否使用分页和分段? 【发布时间】:2014-08-13 00:45:43 【问题描述】:

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

【问题讨论】:

AFAICT,分段不是可选的。但在简单的情况下,它们只是设置为全部映射到相同的线性空间,使它们无关紧要。 如果您指的是架构,您可能应该标记x86 【参考方案1】:

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

【讨论】:

【参考方案2】:

好的,根据 Andrew S. Tanenbaum 的 Modern Operating Systems 3rd Edition 一书和 Open Security Training (opensecuritytraining.info) 中的材料,我设法理解了分段和分页,我的问题的答案是:

    概念:

    1.1.细分:

    分段是将内存划分为称为段的片段(部分)。这些段相互独立,大小可变,可以根据需要增长。

    1.2。 虚拟内存:

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

    1.3。 分页:

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

    优点和缺点

    2.1。 细分:

    使用分段的主要优点是将内存划分为不同的线性地址空间。有了这个程序,他的代码可以有一个地址空间,另一个用于堆栈,另一个用于动态变量(堆)等。分段的缺点是内存碎片。 考虑这个例子 - 一部分内存被分成 4 个按顺序分配的段 -> seg1(in use) --- seg2(in use)--- seg3(in use)---seg4(in use)。现在,如果我们从 seg2 中释放内存,我们将拥有 -> 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.1。 为什么要将两者结合起来?

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

    3.2。 它是如何工作的?

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

    3.2.1。 段选择器:

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

    3.2.2。 段寄存器:

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

    3.2.3。 段描述符:

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

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

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

    3.3。 它是如何工作的?

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

    3.4。 现代运营系统

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

希望这会有所帮助,如果有任何错误或更多细节(我对某些部分有点笼统),请随时发表评论和回复。 谢谢各位

达尼洛电脑

【讨论】:

您忘记将此标记为解决方案

以上是关于现代操作系统是不是使用分页和分段?的主要内容,如果未能解决你的问题,请参考以下文章

操作系统| 存储器管理(基本分页和基本分段的逻辑地址结构变换连续分配方式分区分配算法首次适应循环首次适应最佳适应分页和分段的比较程序装入方式和链接方式)

操作系统——存储管理:分区分页分段请求式分页和虚拟内存

操作系统面试专题:分页和分段存储管理有何区别?

操作系统| 虚拟存储器(请求分页和请求分段地址变换详解,页面置换算法先进先出LRUClock虚拟存储器的定义和特征)

操作系统| 虚拟存储器(请求分页和请求分段地址变换详解,页面置换算法先进先出LRUClock虚拟存储器的定义和特征)

虚拟记忆效应以及分页和分段之间的关系