【问题标题】:virtual memory concepts虚拟内存概念
【发布时间】:2012-09-12 00:23:40
【问题描述】:

我对一些关于虚拟内存的话题感到困惑。所以,我将逐点列出它们并提出问题。在回答时,如果您还列出一些我可以消除疑问的来源,我会更喜欢。我将参考 linux elf 可执行文件进行讨论。

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

  2. 我读到,在已实现分段的内存中,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 的地址空间,并且一次可以在主内存中存在多个进程,那么 所有进程都应该有自己的段描述符表,该表返回段在线性地址空间

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

【问题讨论】:

  • 我很想给你一个体面的答案,但我现在没有时间......如果你想读它,我推荐这本书:@987654321 @
  • @AndreasHenning...没关系...只要你有时间...尽快尝试
  • @AndreasHenning...好像你忘了这个问题
  • 对不起,我正忙着结婚:D
  • @DanPuzey ...恕我直言...你以为我不知道吗?...你为什么认为,我开始了这个赏金?...以及 16 岁之后的简单 whassup天->不叫骚扰...

标签: process paging virtual-memory virtual-address-space memory-segmentation


【解决方案1】:

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

  1. “我听说在 32 位系统中每个进程都有 4gb 的地址空间。”不完全正确。在 32 位系统中,每个进程的最大可寻址空间为 3.2GB。这并不意味着该内存被分配过,而且它肯定不会在进程启动时立即分配。 “这就是我们说的虚拟内存吗?”不,虚拟内存与进程的可寻址空间没有直接关系。稍后会详细介绍。

  2. 这个问题真的没有意义,原因我将在下面解释。不过值得注意的是,多个进程确实确实可以同时放入内存中,因为这些进程不会自动分配其全部潜在可用内存。 (如果文本编辑器一打开就分配 4GB 内存,那它就不是流行的文本编辑器了!)

  3. 我不是专家,但我非常怀疑每个程序在运行时都有自己的内核代码副本。仅安全性和性能问题就使这成为一种不太可能的解决方案。

那么现在,一些定义可能会对您有所帮助。

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

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

【讨论】:

  • @danpuzey...如果逻辑地址空间是 4 GB,进程的大小可以大于这个吗?
  • 不,它不能。逻辑地址的大小限制了您可以表示的最大地址。一个简单的例子:如果您必须以便士收费,但只有两位数来指定价格,您只能指定从 0p 到 99p 的价格。同样,对于 32 位地址,您只能指定从 0b 到 4GB。 64 位地址可以表示更大的数字,因此没有相同的限制。
  • 我有点惊讶没有人提到一个 N 位地址只能代表 2^N 个可能的地址。 2^32 约为 40 亿。 2^64 大约是 160 亿。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2016-11-14
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多