为什么我们需要在操作系统中进行地址虚拟化?

时间:2015-10-26 02:35:36

标签: c operating-system virtual-address-space

我目前正在攻读操作系统课程,我遇到了地址虚拟化。我将简要介绍一下我所知道的内容并按照我的问题进行操作。

基本上,CPU(现代微处理器)生成虚拟地址,然后MMU(存储器管理单元)负责将这些虚拟地址转换为RAM中对应的物理地址。教授给出的例子是需要虚拟化,例如:你编译一个C程序。你运行它。然后你编译另一个C程序。您尝试运行它,但内存中的常驻运行程序阻止加载较新的程序,即使空间可用。

根据我的理解,我认为没有虚拟化,如果编译器生成两个相同的物理地址,第二个不会运行,因为它认为没有足够的空间。当我们虚拟化它时,就像在CPU中只生成虚拟地址一样,MMU将处理这个"碰撞"并找到RAM中其他程序的位置。(我们的教授给出了MMU作为映射表的示例,它采用虚拟地址并将其映射到物理地址)。我认为这个想法非常类似于解决哈希表中的冲突。

我能否就我的理解得到一些意见,我们对此表示赞赏。

2 个答案:

答案 0 :(得分:2)

  

我能否就我的理解得到一些意见,我们对此表示赞赏。

您的理解大致正确。

澄清:

  • 数据结构与哈希表完全不同。

  • 如果有的话,数据结构更接近BTree,但即便有重要的差异。它实际上最接近稀疏分配的(Java)N维数组。

  • 映射页面而不是完整的虚拟/物理地址。 (完整的地址是页面地址+页面内的偏移量。)。

  • 碰撞没有问题。在任何时间点,虚拟 - >所有用户/进程的物理映射都提供从(进程ID +虚拟页面)到物理RAM页面或磁盘页面(或两者)的一对一映射。

我们使用虚拟内存的原因是:

  • 过程隔离;即一个进程无法查看或干扰另一个进程内存

  • 简化应用程序编写;即每个进程认为它具有连续的内存地址,并且每次都有相同的设置。 (初步估算......)

  • 简化编译,链接,加载;即编译器等,无需在编译时或运行时“重新定位”代码以考虑其他代码。

  • 允许系统容纳比物理RAM更多的进程......但这会带来潜在的风险和性能损失。

答案 1 :(得分:0)

我认为你对操作系统中存在的内容有一个基本的误解。

(1)您正在描述逻辑内存,而不是虚拟内存。虚拟内存是指使用磁盘存储来模拟内存。未映射的逻辑内存页面将映射到磁盘空间。

可悲的是,逻辑内存和虚拟内存这两个术语变得混杂在一起,但它们是截然不同的概念,区别变得越来越重要。

(2)程序在PROCESS中运行。一个进程一次只运行一个程序(在unix中,每个进程一般只运行一个程序(如果你计算克隆的调用者,则运行两个)。

在现代系统中,每个流程流程都会获得一个逻辑地址空间(顺序地址),可以映射到物理位置或根本不会映射到任何位置。通常,该逻辑地址空间的一部分映射到所有进程共享的内核区域。逻辑地址空间是使用进程创建的。没有地址空间 - 没有进程。

在32位系统中,地址0-7FFFFFFF可能是(通常)映射到唯一物理位置的用户地址,而80000000-FFFFFFFF可能会映射到对所有进程都相同的系统地址空间。

(3)逻辑内存管理主要用作安全手段;不是作为程序加载的手段(尽管它在这方面确实有帮助)。

(4)这个例子对我没有意义:

  

您编译C程序。你运行它。然后你编译另一个C程序。您尝试运行它,但内存中的常驻运行程序会阻止加载较新的程序,即使空间可用。

您忽略了PROCESS的概念。一个进程一次只能运行一个程序。在允许以相同过程(例如,VMS)串行运行程序的系统中,执行程序防止加载另一程序(或加载另一程序导致运行程序的终止)。这不是记忆问题。

(5)这根本不正确:

  

根据我的理解,我认为没有虚拟化,如果编译器生成两个相同的物理地址,第二个将无法运行,因为它认为没有足够的空间。当我们虚拟化这个时,就像在CPU中只生成虚拟地址一样,MMU将处理这个“冲突”,并为RAM中的其他程序找到一个位置。

MMU不处理碰撞。操作系统设置表,用于在进程启动时定义逻辑地址空间。逻辑内存与哈希表无关。

当程序访问逻辑存储器时,粗略序列为:

  1. 将地址分解为页面和页面内的偏移量。
  2. 页面是否在页面表中有相应的条目?如果不是FAULT。
  3. 页面表中的条目是否有效?如果不是FAULT。
  4. 页表条目是否允许在当前操作模式(内核/用户/ ...)中请求的访问类型(读/写/执行)?如果不是FAULT。
  5. 条目是否映射到物理页面?如果不是PAGE FAULT(从磁盘加载页面 - 虚拟内存 - 再试一次)。
  6. 访问页表引用的物理内存。