Wine 不是模拟器?

amy*_*sin 27 emulation wine

正如我对模拟器的理解(以简单的方式),它们确实将使用系统 X 的函数的程序的函数调用转换或替换为正在运行程序的系统 Y 使用的函数。Wine项目声称 Wine 不是模拟器,因为:

Wine 不会像虚拟机或模拟器那样模拟内部 Windows 逻辑,而是将 Windows API 调用即时转换为 POSIX 调用,从而消除其他方法的性能和内存损失,并允许您将 Windows 应用程序干净地集成到桌面中。

那么,模拟器和虚拟机如何在主机非 Windows 系统上模拟内部 Windows 逻辑?那不是通过将Windows系统调用转换为主机自己的相应调用吗?模拟器和非模拟器(如 Wine)之间的区别是模拟器模拟整个操作系统,然后应用程序在不知道它正在与模拟器通信的情况下使用该系统 API,而非模拟器直接将应用程序的调用转换为主机的(应用程序也可能不知道)?额外的间接级别是模拟器和 Wine 之间的唯一区别吗?

gol*_*cks 30

那么,模拟器和虚拟机如何在主机非 Windows 系统上模拟内部 Windows 逻辑?那不是通过将Windows系统调用转换为主机自己的相应调用吗?

不,或者至少不是 WINE 所做的——通过在用户空间中一对一地翻译系统调用。仿真器通过更迂回的路径抽象地做到这一点;它不直接翻译系统调用。

真正的模拟器创建的是虚拟(例如 x86-64),而不是虚拟操作系统。理论上,您可以运行针对该类型机器的任何操作系统。通常,“模拟器”包括操作系统,但这并不是它真正模拟的;它包含的操作系统与在真机上运行的操作系统相同。

仿真器有时用于模拟与主机不同的硬件,但也用于模拟完全相同的硬件,以便在另一个操作系统中运行。

WINE 与此不同,它实际上不是窗口。你可以运行一个 x86-64 模拟器,里面有一个真实的 windows 副本,但这不是 WINE 的意思。他们声称它实际上比模拟器更有效是有道理的——仅仅翻译系统调用的开销可能低于运行虚拟机的开销。缺点是WINE只能是windows;您不能像普通 VM一样将它与其他操作系统一起使用。


jth*_*ill 14

考虑 Java 虚拟机。没有 JVM 模仿任何其他的,它们都是规范的实现。Wine 不是模拟 win32 api,而是它的一个实现。规范和现实不一定匹配,Microsoft 的实现和 Wine 的实现都有使错误代码工作的变通方法,并且对于任何给定的项目来说,哪个实现是更好的目标并不一定很明显。