处理器是否需要 MMU(内存管理单元)芯片才能支持虚拟内存?

yoy*_*fun 15 memory hardware hardware-compatibility emulation virtual-memory

处理器是否需要 MMU(内存管理单元)芯片才能支持虚拟内存?

是否可以在软件中模拟 MMU 功能?(我知道它可能会对性能产生很大影响)。

Ste*_*itt 23

任何模拟包含 MMU 的系统的系统模拟器都可以在软件中有效地模拟 MMU,因此对您所提出的问题的答案是“是”。但是,虚拟内存需要某种方式来强制执行内存访问控制,或者至少是地址转换,因此它需要对运行被控制软件的 CPU 进行完整的软件仿真,或者需要硬件辅助。

所以你可以想象构建一个没有 MMU 的系统,将QEMU移植到它,添加缺失的部分以使虚拟内存真正有用(例如,在主机系统上添加对交换的支持),并在 QEMU 中运行需要 MMU 的操作系统,具有您在来宾操作系统中期望的所有保护(QEMU 错误除外)。

用于提供虚拟内存的无 MMU“仿真”的一个真实而古老的例子是Z-machine,它能够在 70 年代末和 80 年代初的 8 位系统上分页和交换其代码和数据. 这是通过在底层真实处理器上模拟虚拟处理器来实现的;这样,解释器就可以完全控制正在运行的程序“看到”的内存布局。

在实践中,通常认为至少在操作系统级别需要 MMU 来支持虚拟内存。如上所述,无MMU 内核?,可以构建 Linux 内核,使其可以在没有 MMU 的系统上运行,但生成的配置非常不寻常,仅适用于非常特定的用例(特别是没有恶意软件)。它可能不支持许多需要虚拟内存(交换,mmap...)的场景。

  • @JenniferAnderson:一些现代 CPU 具有让仿真器(部分)将 MMU 仿真卸载到 MMU 本身的功能。例如,在模拟器内运行的程序本身将使用多个模拟内存页面,这些内存页面当然“嵌套”在模拟器使用的内存页面中。较新的高端 Intel 和 AMD CPU 都支持嵌套页表,这允许模拟器在 MMU 本身内表达这种嵌套,而不必(昂贵地)模拟它。 (7认同)
  • @JenniferAnderson:是的,这个功能是专门为半虚拟化引入的。(请注意,这并不是什么新鲜事,自 1960 年代初以来,大型机世界中就存在硬件辅助的半虚拟化。)然而,事实证明,它也可以用于其他有趣的应用程序,例如加速垃圾收集(请参阅以 Azul 的 Zing JVM 中的 C4 收集器为例)。但是,请注意,所有这些都是双向的:就像*扩展*具有虚拟化支持的 MMU 只不过是性能优化,而虚拟化…… (3认同)

MSa*_*ers 7

这完全取决于您所说的虚拟内存。一个有趣的模型是旧的 Win16 模型(最著名的是旧的 Windows 3.x,而不是 Windows NT)。在这种模型中,你有GlobalLockGlobalUnlockLocalLockLocalUnlock功能。这些是一种协作的、手动的虚拟内存管理形式。由于这是在(应用程序)软件中完成的,因此不需要 MMU。从某种意义上说,内存是虚拟的,未锁定的内存可以交换到磁盘。

但是,在 Win16 模型中,不同进程之间没有保护。如果另一个进程将数据留在内存中,您可以覆盖它。这不是基本限制。如今,使用快速 SSD,您可以完全从内存中删除未运行的进程,并在合理的时间内完成。


Tob*_*ght 7

如果您有可以与物理内存交换进程的软件,则没有必要拥有硬件 MMU 。

这是早期多任务操作系统的操作模式。在任何给定时间,只有一个进程驻留在内存中,当它的时间片到期时,它会被整个换出(您可以看到这对于大型进程会产生问题)。当前运行的进程看到的内存内容与任何其他进程看到的不同,每个进程对地址空间都有自己的看法。

一些硬件支持是有帮助的 - 操作系统自己使用的“受保护”内存区域的概念(例如,设置了 MSB 的所有地址只能在管理模式下访问)和“中断”值指示正在使用的最高地址,但内存管理硬件不是虚拟内存的绝对要求;这只是实现它的一种特别有效的方法。

  • 但这并不是真正的虚拟内存,它只是进程交换......(我们真的需要定义“虚拟内存”才能正确回答这个问题!) (2认同)