宿醉,在arm64/ppc64le/x86_64 Linux和x86_64 Mac上运行Win64/Win32应用程序

2020-11-02 08:58:46

这是一个由Stefan Dösinger和AndréHentschel发起的项目,旨在aarch64/ppc64le/x86_64Wine上运行x86_64/x86_32 Windows应用程序。

我们在主机上有一个64位纯模式的Wine,在客户端有两个64位和32位模式的Wine。中间是运行x86(_64)代码的QEMU的修改版本。为了将它们粘合在一起,有很多块是手写的,以了解指针在哪种情况下是有效的,在什么情况下它可能指向随机地址而应该被忽略,以及在出现错误的情况下如何处理对结果结构的写入,等等。

“宿醉”目前运行少量的32位和64位Windows应用程序。下面列出了作者测试过的应用程序列表。其他应用程序也可以使用,但不要期望太高。如果您的主机OpenGL实现支持常规桌面GL,则Direct3D可以正常工作。Wine的d3d实现目前还不能很好地支持OpenGL:ES,无法使用。一旦这一点改变,Hangover将在没有任何改变的情况下支持它。

调试器支持是不存在的,异常处理也有已知的缺陷。由于这些原因,复制保护和反作弊系统可能比普通的Wine更糟糕。

您通常可以期望64位应用程序比32位应用程序状态更好,因为不需要数据结构thunking。

宿醉在aarch64 Linux、ppc64le Linux、x86_64 Linux和x86_64 MacOS上进行了测试。主机系统上不需要英特尔x86库。不需要32位的multilib。

理论上,一切都应该通过运行make来构建。在实践中,您可能会在我们的构建系统中遇到一些错误。并行构建应该可以工作,但如果它们失败了,请先尝试非并行构建。

某些使用mingw构建的32位程序和DLL依赖于libgcc_s_sjlj-1.dll。

WINE的程序可以在build/win-Guest/Programs/*和build/win-guest32/Programs/*中找到。Build/win-[Guest|guest32]/还包含Wine的测试的PE版本。

不要指望这会很快。目前的主要瓶颈是qemu从输入的x86代码生成代码的速度。粗略比较一下,我的Nvidia Shield Android电视设备(运行的是普通桌面Linux,而不是Android)以可播放的速度运行20世纪90年代末到21世纪初的游戏。DirectX 9 SDK示例运行得相当好,因为它们本身包含很少的逻辑,只需从VM调用进入d3D,所以所有的繁重任务都是本地完成的。《战锤40k:战争的黎明》以大约30fps的速度开始一款新游戏,但一旦构建了几个单位,就会变得非常缓慢。

主机Wine始终构建为64位应用程序。Resgover通过转换应用程序和Wine之间传递的结构来处理32位应用程序。Windows的LLP64模型使大部分结构在32位和64位之间保持兼容,但是转换仍然是一项很大的工作。

地址空间被限制为4 GB,方法是保留低于4 GB的每个地址,然后调用mmap保留剩余空间,直到我们用完可用地址空间,然后再次释放底部的4 GB。大多数主机Wine库都在较早的时候加载到4 GB以上,以使之前低于4 GB的空间尽可能保持空闲。这样做的缺点是启动一个新进程需要大约2秒。

WINE将每个进程视为64位进程,因此其WOW64层处于非活动状态。这对于纯32位或纯64位应用程序可以正常工作,但对于混合应用程序(例如C:\WINDOWS\system32和C:\WINDOWS\syswow64)会产生问题。

目前还不存在对Win16的支持,但通过使用Wine';的常规Win16->Win32thunks并从那里获取它,应该可以实现。需要对Wine设置16位保护模式的方式进行一些更改。

要获得vm86(DOS)支持,请在主机上安装DOSBOX。葡萄酒会帮你叫醒的。

未实施对32位主机系统的支持。这应该不难做到,但是您可能需要付出一些努力来确保地址空间布局工作正常,并且在QEMU加载之前,主.exe文件的加载地址保持空闲。已经有了针对arm32的初步工作。

移植到低端主机体系结构应该相当简单。您将不得不替换一些主机特定的汇编器代码。编译器将通过ifdef卫士中的#error语句让您知道这些位置。

如果您想让它在大的字节顺序平台上工作,那就别管它了。这将需要转换每个Win32结构,而不仅仅是其中包含指针或指针大小的整数的结构。这是不会发生的。

这是作者测试的应用程序列表。希望它们也能为您工作。如果应用程序标记为Installer:no,这意味着该安装程序不适用于Smereason。您必须将其安装到别处,并复制目录和注册表项。

奇迹年代:安装程序可以工作,但不能安装1.36更新。游戏版本1.36工作正常。

定居者II 10周年纪念:安装程序工作,更新程序工作,游戏运行,但速度太慢,不能玩。需要本机d3dx9和d3d编译库。

蠕虫2:安装失败,因为它需要Win16,游戏可以玩。游戏需要音频CD支持,否则它会抱怨找不到CD。

蠕虫世界末日:使用正确的葡萄酒设置。尽管有与蠕虫2相同的图形,但它的速度明显较慢,但可以边缘播放。

要在Hangover内部运行Wine的测试,可以使用脚本/hangover-test.sh作为$WINETEST_Wrapper。您还必须创建一个空的文件服务器/wineserver(只需触摸它,它不需要任何特殊设置)才能使Wine的工具/runtest满意。有关更多详细信息,请参见script/hangover-test.sh中的注释