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
...)的场景。
这完全取决于您所说的虚拟内存。一个有趣的模型是旧的 Win16 模型(最著名的是旧的 Windows 3.x,而不是 Windows NT)。在这种模型中,你有GlobalLock
和GlobalUnlock
,LocalLock
和LocalUnlock
功能。这些是一种协作的、手动的虚拟内存管理形式。由于这是在(应用程序)软件中完成的,因此不需要 MMU。从某种意义上说,内存是虚拟的,未锁定的内存可以交换到磁盘。
但是,在 Win16 模型中,不同进程之间没有保护。如果另一个进程将数据留在内存中,您可以覆盖它。这不是基本限制。如今,使用快速 SSD,您可以完全从内存中删除未运行的进程,并在合理的时间内完成。
如果您有可以与物理内存交换进程的软件,则没有必要拥有硬件 MMU 。
这是早期多任务操作系统的操作模式。在任何给定时间,只有一个进程驻留在内存中,当它的时间片到期时,它会被整个换出(您可以看到这对于大型进程会产生问题)。当前运行的进程看到的内存内容与任何其他进程看到的不同,每个进程对地址空间都有自己的看法。
一些硬件支持是有帮助的 - 操作系统自己使用的“受保护”内存区域的概念(例如,设置了 MSB 的所有地址只能在管理模式下访问)和“中断”值指示正在使用的最高地址,但内存管理硬件不是虚拟内存的绝对要求;这只是实现它的一种特别有效的方法。