虚拟内存概念

我对有关虚拟内存的一些主题感到困惑。 所以,我将逐点列出他们并提出问题。 虽然回答我会更喜欢,如果你还列出一些来源,我可以清除疑问。 我将参考linux elf可执行文件进行讨论。

  • 我听说每个进程在32位系统中的地址空间都是4GB。 当我检查一个我的可执行文件重定位文件的objdump时,我发现它的限制从00000000到ffffffff。 它还包含内核空间。 这是文件的地址空间。 这是我们谈论的虚拟记忆吗? 如果是的话,我已经读过虚拟内存机制允许运行非常大的进程,并且进程大小不受主内存大小的限制(我们可以在需求分页时将所需页面带到主内存中)。 那么,如果虚拟内存仅为4GB,是不是会将程序的最大大小限制为4GB? 另外,我检查了另一个文件的objdump,它有相同的地址(即00000000到ffffffff)。 那么这是什么意思? 这是否意味着我们的文件是某种可重新定位的文件,它将再次添加起始地址 (尽管这看起来很荒谬,因为它已经是一个可执行的可重定位目标文件)。

  • 我已经在已经实现了分段的存储器中读过,CPU产生虚拟(逻辑)地址。 该地址有三部分 - 分段,分段内的偏移量。 此外,这里讨论的细分是代码,数据,堆栈等。

    在进程地址空间中,这些段位于特定位置。 那么,cpu的虚拟地址的内容是什么? 生成的虚拟地址范围是从00000000到ffffffff? 如果是,那么访问虚拟地址处的内容的过程如下:

    The segment part is looked up in the segment descriptor table to find the segment's
    starting address in linear address space. Then the offset is indexed within the segment and
    the resulting address is the linear address. Then, we look up the page table and map the
    address to physical address. If the page is not currently in the main memory, it is 
    brought. 
    

    这再次出现这样一个事实,即任何时候都不能在主存中完全处理任何进程,因为那么整个内存将仅被一个进程占用 (因为进程的地址空间本身就是4GB)。

    另外,如果所有进程的地址空间都是从00000000到ffffffff,并且一次可以在主内存中存在多个进程,则所有进程都应该有自己的段描述符表,该表描述符返回线性地址空间中的段地址

  • 我读到操作系统在启动时加载到主内存中。 那么该操作系统和特定进程的内核空间中的内核代码之间有什么区别? 另外,是否所有进程都在内核空间中拥有自己的内核代码副本?

  • 这是一个非常开放的问题,有许多混淆用法的不同术语。 我会尽可能解决您的问题,并提供一些可能有用的其他有用信息。

  • “我听说每个进程在32位系统中的地址空间都是4GB。” 不完全正确。 每个进程在32位系统中的最大可寻址空间为3.2GB。 这并不意味着这个内存是永久分配的,并且一旦进程启动,它肯定不会被分配。 “这是我们谈论的虚拟记忆吗?” 不。虚拟内存与进程的可寻址空间没有直接关系。 稍后再说。

  • 这个问题没有意义,因为我将在下面解释。 但值得注意的是,多个进程明确地适合内存,因为进程不会自动分配其全部可用内存。 (如果一个文本编辑器在打开时分配了4GB的内存,它就不会成为流行的文本编辑器!)

  • 我不是专家,但我非常怀疑每个程序在运行时都有自己的内核代码副本。 单就安全性和性能问题而言,这是非常不可能的解决方案。

  • 所以现在,一些定义可以帮助你。

  • 物理内存 (通常是!)PC中的RAM。 在运行任何程序时,CPU是直接处理的快速物理内存。 当你指定一个物理内存地址时,你根据内存硬件本身在内存中指定了一个确切的位置。
  • 虚拟内存 (通常是!)存储在较慢的介质上,如硬盘驱动器(通常称为分页文件)。 当您的计算机运行进程内存不足时,它会将一些当前的物理内存内容复制到页面文件中,通常来自空闲或后台应用程序。 这在物理内存中留出空间,以便活动进程可以运行。 如果一个不再在物理内存中的程序需要处理数据,则其数据必须从页面文件重新加载到物理内存中 - 这又可能需要将另一个程序从物理内存中分页出来以腾出空间。 术语“虚拟”与“物理”存储器用于强调此存储器并不存在,但它仍然可用于计算机。 虚拟内存的使用在性能方面非常昂贵,但它可以支持更大的尺寸:实际上,可以拥有大量可用的虚拟内存,但性能降低可能会阻止超过某些限制的实际解决方案。
  • 逻辑内存地址是单个进程使用的地址 ,允许进程访问自己的内存,而不必关心进程已加载的物理内存的位置。 您的00000000fffffff范围是进程可用的逻辑范围,并且这是在进程内将用于引用内存的地址。 内核将根据进程内存的物理偏移量(和分段)将其转换为实际执行代码时由CPU使用的物理地址。 这个物理位置可以位于可用内存空间的任何地方,并且如果应用程序被翻出并放入,物理位置可能在应用程序的生命周期中改变。 但是,应用程序本身只需要引用它自己的逻辑地址空间。 术语“逻辑”与“物理”地址用于突出显示地址不是实际地址,而是与存储器的相关子集相关的地址 - 即进程自己的内存空间。
  • 我不是这方面的专家,但我希望这有助于澄清你的一些问题。

    链接地址: http://www.djcxy.com/p/80281.html

    上一篇: virtual memory concepts

    下一篇: Will the stack of a C program ever shrink?