虚拟内存概念
我对有关虚拟内存的一些主题感到困惑。 所以,我将逐点列出他们并提出问题。 虽然回答我会更喜欢,如果你还列出一些来源,我可以清除疑问。 我将参考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的内存,它就不会成为流行的文本编辑器!)
我不是专家,但我非常怀疑每个程序在运行时都有自己的内核代码副本。 单就安全性和性能问题而言,这是非常不可能的解决方案。
所以现在,一些定义可以帮助你。
00000000
到fffffff
范围是进程可用的逻辑范围,并且这是在进程内将用于引用内存的地址。 内核将根据进程内存的物理偏移量(和分段)将其转换为实际执行代码时由CPU使用的物理地址。 这个物理位置可以位于可用内存空间的任何地方,并且如果应用程序被翻出并放入,物理位置可能在应用程序的生命周期中改变。 但是,应用程序本身只需要引用它自己的逻辑地址空间。 术语“逻辑”与“物理”地址用于突出显示地址不是实际地址,而是与存储器的相关子集相关的地址 - 即进程自己的内存空间。 我不是这方面的专家,但我希望这有助于澄清你的一些问题。
链接地址: http://www.djcxy.com/p/80281.html