首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟内存概念

虚拟内存概念
EN

Stack Overflow用户
提问于 2012-09-19 16:32:20
回答 1查看 1.4K关注 0票数 1

我对一些关于虚拟内存的话题感到困惑。所以,我要列出他们,并提出问题。在回答时,我希望你也列出一些来源,我可以澄清这个疑问。我将谈到一个linux精灵可执行文件。

  1. 我听说每个进程在32位系统中都有4gb的地址空间。当我检查其中一个可执行重定位文件的objdump时,我发现它有00000000到ffffffff的限制。它还包含内核空间。这是文件的地址空间。--这是我们谈论的虚拟内存吗?如果是,那么我已经读过,虚拟内存机制允许运行非常大的进程,并且进程大小不受主存大小的限制(我们可以根据需求分页将所需的页面带到主内存中)。那么,如果虚拟内存仅为4gb,那么它是否也将程序的最大大小限制在4gb?,我检查了另一个文件的objdump,它有相同的地址(即00000000到ffffffff)。,那么,这是什么意思?这是否意味着我们的文件是某种可重定位的文件,启动地址将再次添加(尽管这看起来很荒谬,因为它已经是一个可执行的可重定位对象文件)。
  2. 我曾经读过,在已实现分段的内存中,cpu生成虚拟(逻辑)地址。这个地址有三个部分--段,段内的偏移量。此外,这里讨论的部分是代码、数据、堆栈等。 在进程地址空间中,这些段从特定位置开始定位。那么,cpu虚拟地址的内容是什么?所产生的虚拟地址是否从00000000到ffffffff? (如果是),那么是在虚拟地址上访问内容的过程,其结果是:-。 段部分在段描述符表中查找,以在线性地址空间中查找段的起始地址。然后,偏移量在段内索引,得到的地址是线性地址。然后,我们查找页面表并将地址映射到物理地址。如果页面当前不在主内存中,则会带来该页。 --这再次产生了这样一个事实:没有进程可以在任何时候完全处于主内存中,因为整个内存将只被一个进程占用(因为进程的地址空间本身是4gb)。 此外,如果所有进程的地址空间从00000000到ffffffff,并且一次可以在主内存中存在多个进程,那么所有进程都应该有自己的段描述符表,该表在线性地址空间中返回段的地址。
  3. 我读到操作系统在启动时被加载到主内存中。那么,在特定进程的内核空间中,操作系统和内核代码之间有什么区别呢?此外,是否所有进程在其内核空间中都有自己的内核代码副本?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 12:58:02

这是一个非常开放的问题,有许多不同术语的混淆用法。我将尽可能多地回答你的问题,并提供一些可能有帮助的有用信息。

  1. “我听说每个进程在32位系统中都有4gb的地址空间。”不完全是真的。在32位系统中,每个进程的最大可寻址空间为3.2GB。这并不意味着这个内存被分配过,而且进程一启动就没有分配它。“这就是我们谈论的虚拟内存吗?”不是的。虚拟内存与进程的可寻址空间没有直接关系。稍后再谈这个。
  2. 这个问题没有真正的意义,因为我将在下面解释。但是,值得注意的是,多个进程一次确实适合内存,因为进程不会自动分配它们全部的潜在可用内存。(如果文本编辑器一打开就分配了4GB内存,它就不会是一个流行的文本编辑器!)
  3. 我不是专家,但我非常怀疑每个程序在运行时都有自己的内核代码副本。仅仅是安全和性能问题就使得这是一个非常不可能的解决方案。

所以现在,一些可能对你有帮助的定义。

  • 物理内存是(通常!)你电脑里的内存。在运行任何程序时,CPU直接使用的是快速的物理内存。当您指定物理内存地址时,您将根据内存硬件本身在内存中指定确切的位置。
  • 虚拟内存是(典型的!)存储在较慢的介质上,如硬盘驱动器(通常称为分页文件)。当计算机运行内存不足以运行进程时,它将将某些当前物理内存内容复制到页文件中,通常是从空闲或后台应用程序中复制。这将在物理内存中腾出空间,以便活动进程能够运行。如果已不在物理内存中的程序需要处理数据,则必须将其数据从页面文件重新加载到物理内存中--这可能反过来需要将另一个程序从物理内存中分页以腾出空间。“虚拟”和“物理”内存是用来突出显示这个内存实际上并不存在,但它仍然是计算机可用的。虚拟内存的使用在性能上是非常昂贵的,但它可以支持更大的大小:的确,可以有任意数量的虚拟内存可用,但是性能上的影响阻止了这是一个超出某些限制的实用解决方案。
  • 逻辑内存地址是单个进程使用的地址,允许进程处理自己的内存,而不必关心进程在物理内存中的位置。您的00000000fffffff范围是进程可用的逻辑范围,这是进程中将用来引用内存的地址。内核将根据进程内存的物理偏移量(和分段)将其转换为CPU在实际执行代码时使用的物理地址。此物理位置可以位于可用内存空间中的任何位置,如果将应用程序分页和分页,则物理位置可能在应用程序的生存期内发生变化。然而,应用程序本身只需要引用它自己的逻辑地址空间。术语“逻辑”与“物理”地址被用来突出显示地址不是真正的地址,而是相对于内存的相关子集的地址--也就是说,相对于进程本身的内存空间。

我不是这方面的专家,但我希望这有助于澄清你的一些问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12499022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档