gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:37:46 34 4
gpt4 key购买 nike

我在阅读有关内存体系结构的信息,但对分页和分段感到有些困惑。我读到现代OS系统仅使用分页来管理内存访问,但是通过查看反汇编的代码,我可以看到“ds”和“fs”之类的段。这是否意味着操作系统(在Windows和Linux上看到)同时使用了分段和Pagging,还是仅将所有分段映射到同一页面(使分段无关)?

最佳答案

好的,根据Andrew S. Tanenbaum撰写的《现代操作系统第三版》一书和Open Security Training(opensecuritytraining.info)的资料,我设法理解了分段和分页,而我的问题的答案是:

  • 概念:

    1.1。 细分:

    分段是将内存划分为称为段的段(段)。这些段彼此独立,大小可变,并且可以根据需要增长。

    1.2。 虚拟内存:

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

    1.3。 分页:

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

    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。 为什么将两者结合?

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

    3.2。 它是如何工作的?

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

    3.2.1。 段选择器:

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

    3.2.2。 段寄存器:

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

    3.2.3。 段描述符:

    该结构包含有关段的数据,例如其基地址,大小(以页或字节为单位),访问特权,该段是否存在于内存中的信息等(对于所有字段,请进行搜索)用于Google上的细分描述符)

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

    该表包含多个段描述符。因此,此结构包含系统的所有段描述符。如果该表是Global(全局)表,则它可以容纳其他内容,例如Local Descriptor Tables描述符,Task State Segment Descriptor和Call Gate描述符(我在这里不做解释,请用google搜索)。如果该表是本地表,据我所知,它将仅保存与用户相关的段描述符。

    3.3。 如何运作?

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

    3.4。 现代操作系统

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

  • 希望这会有所帮助,如果有任何错误或更多详细信息(我在某些部分上是我的一般话),请随时发表评论并回复。
    感谢大伙们

    Danilo PC

    关于memory - 现代操作系统是否使用分页和分段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358105/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com