你能帮我吗?
虚拟机利用CPU自身的虚拟化(不论其程度如何),提供了一个虚拟化接口给真实硬件使用。而模拟器则是在没有依赖CPU能够直接运行代码的情况下模拟硬件,并将一些操作重定向到控制虚拟容器的超级监视程序。
以具体的x86示例来说明:Bochs 是一个模拟器,在软件中模拟整个处理器,即使它在兼容的物理处理器上运行;QEMU 也是一个模拟器,尽管通过使用内核端 kqemu
软件包使得它在被模拟机器与物理硬件匹配时获得了一些有限的虚拟化能力,但它并不能真正地利用完整的x86自我虚拟化,因此它是一个有限的超级监视程序;KVM 是一个虚拟机超级监视程序。
可以说,超级监视程序“模拟”受保护的访问,但它并没有模拟处理器,更准确地说,它是在“调解”受保护的访问。
受保护的访问指的是诸如设置页表或读/写I/O端口等操作。对于前者,超级监视程序验证(并通常修改,以匹配超级监视程序自己的内存)页表操作,并执行受保护的指令;I/O操作被映射到模拟设备硬件而不是模拟CPU上。
而为了使事情更加复杂,Wine 实际上更像是一个超级监视程序/虚拟机(尽管它在更高的ABI级别上),而不是一个模拟器(因此被称为“Wine不是模拟器”)。
虚拟机的目的是创建一个隔离的环境。
仿真器的目的是精确地复制某些硬件的行为。
两者都旨在实现对主机硬件的某种程度的独立,但虚拟机倾向于模拟足够的硬件以使客户端工作,并且着重于仿真/虚拟化的效率。最终,虚拟机可能不像任何真正存在的硬件,并且可能需要特定于VM的驱动程序,但一组客户端驱动程序将在大量虚拟环境中保持一致。
另一方面,仿真器试图精确地复制所有行为,包括被模拟的某些真实硬件的怪癖和漏洞。所需的客户端驱动程序将完全匹配被模拟的环境。
虚拟机的实现可以使用虚拟化、半虚拟化和仿真技术,或各种技术的结合。而仿真器通常不能使用虚拟化,因为那会让抽象变得有点泄漏。
戴尔解释了仿真器和虚拟机之间的区别。