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

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

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

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

答案1

任何模拟包含 MMU 的系统的系统模拟器都会有效地模拟软件中的 MMU,所以是的,模拟 MMU 是可能的。然而,虚拟内存需要某种方式强制执行内存访问控制,或者至少是地址转换,因此它需要运行受控软件的 CPU 的完整软件模拟,或者需要硬件辅助。

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

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

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

答案2

这取决于您所谓的虚拟内存。一个有趣的模型是旧的 Win16 模型(最出名的是旧的 Windows 3.x,而不是 Windows NT)。在该模型中,有GlobalLockGlobalUnlockLocalLockLocalUnlock函数。这是虚拟内存的一种协作式手动管理形式。由于这是在(应用程序)软件中完成的,因此不需要 MMU。内存是虚拟的,因为未锁定的内存可以交换到磁盘。

然而,在Win16模型中,不同进程之间没有保护。如果另一个进程在内存中留下了数据,您可以覆盖它。这不是一个根本性的限制。如今,借助快速 SSD,您可以从内存中完全删除非运行进程,并且可以在合理的时间内完成此操作。

答案3

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

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

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

答案4

最初做VM的商用机器没有MMU——它们将VM内置到处理器中。我目前的想法是,MMU 只是将 VM 置于非 VM 处理器之上的事后想法。 VM 是在曼彻斯特大学开发的,Burroughs 的设计师确信他们应该将其纳入其中——尽管当时非常具有创新性。

Burroughs B5000(现在的 Unisys MCP 机器)使用内存描述符来强制执行内存边界 - 超出边界,您的程序就会被丢弃(尊重边界是美好社会的基础,但有些人滥用特权,因此必须强制执行边界)。

描述符保存内存地址、块长度和数据类型,还有最重要的 P 位或存在位。 p 位表示该块位于内存中。 p 位为零意味着该块位于大容量存储上,并且地址是原始程序(代码或数据)或 VM(转出数据)中的存储地址。

这些机器实现了分层内存模型。 MMU似乎是为了弥补平面内存的不足,需要将用户对象映射到平面内存中。 JK Iliffe 还设计了具有此型号的 ICL 机器:

http://www.computerconservationsociety.org/resurrection/res74.htm#f

https://en.wikipedia.org/wiki/Burroughs_large_systems

这些机器与当今大多数机器的区别在于,它们处理的是完整的系统架构,而不仅仅是 CPU 架构。

因此,看来 MMU 不仅没有必要,而且没有它们系统也会变得更好。

相关内容