在爱好操作系统上使用Wine运行Windows游戏
将Wine移植到Astral 几个月前,我发布了一篇关于Astral的帖子,这是一款我多年来一直在开发的爱好操作系统,运行Minecraft。从那时起,其他人也成功在该系统上运行了现代版本的Minecraft以及Factorio(使用glibc兼容的libc)。然而,虽然这些游戏是以一种便于在新操作系统上运行的方式制作或打包的,但大多数游戏并不是。许多游戏都是闭源且为Windows编译的,这使得像Wine这样的工具成为玩这些游戏的必要条件。我最喜欢的游戏之一Cogmind就属于这一类。它是一个仅限32位Windows的roguelike游戏,我的目标就是在Astral系统上运行它。虽然已经存在一个Wine的移植版,但它极不完整,甚至notepad.exe都无法正常工作。要运行Cogmind,必须完成Wine的移植,这也意味着需要添加在本身是64位的操作系统上运行32位代码的能力。 基本的Wine功能 获取Wine并运行的第一步是下载MinGW并在Wine构建中启用它,因为这个工具是编译PE DLL所必需的。在启用它之后,notepad.exe可以正常工作,并且选择“另存为”时不再崩溃! 编译libEGL.so 仍然有一个大问题:Wine是在没有OpenGL支持的情况下编译的。虽然Astral支持OpenGL,但Wine显式需要EGL来工作,而Astral的Mesa移植没有提供EGL。EGL将OpenGL等图形API连接到窗口系统,这是Wine正确初始化图形所需的。起初,这似乎是一个简单的修复,只需在Mesa中启用它。然而,Mesa不支持xlib后端的EGL,迫使我改用DRI后端。 DRI(直接渲染基础设施)允许应用程序更直接地与GPU通信,而不是通过X服务器。最终,我不得不补丁Mesa,以允许X.org服务器在没有/dev/dri的情况下启动。最后,我成功了,并使一款真实的游戏Deltarune启动: WoW64和32位Windows程序 由于Cogmind是32位而Astral是64位,因此需要更多的基础设施。这是通过Wine的WoW64模式完成的,它不需要任何32位Unix库。它通过在64位进程中运行32位Windows二进制文件来工作,根据需要在32位和64位系统调用及数据结构之间进行转换,从而避免了需要完整的32位用户空间。 使其正常工作主要涉及在内核中实现LDT(局部描述符表)支持,因为x86-64允许您使用32位段描述符在长模式下运行32位代码。这些描述符定义了如何访问内存,并且在代码段的情况下,定义了处理器如何执行这些指令。LDT是用于定义这些段描述符的机制之一,并允许其在每个进程基础上进行配置。它还在Wine的信号和系统调用处理代码中需要一些细致的胶水。 Cogmind! 在Astral移植中实现了WoW64支持,并修复了内核中的一些其他漏洞后,Cogmind可以正常工作了!这款游戏可以玩,没有明显的问题,除了游戏新闻和比分上传不起作用。 评分表上传问题 该错误表现为与Cogmind服务器之间的TCP连接被打开后立即关闭,而没有传输任何数据。起初,我以为这是网络堆栈的问题,但事实并非如此。让我怀疑是其他问题的原因是,Wine调试日志功能__wine_dbg_write在WoW64中完全无法正常工作。经过深入研究Wine的代码,我最终注意到我在__wine_unix_call_dispatcher函数中忘记保存一个寄存器。这破坏了PE到Unix的转换并导致了未定义行为。修复后,评分表上传成功了! 更多游戏和其他程序 我还尝试在Wine下运行了一些其他应用程序: 程序 状态 注释 FTL 正常 完全可玩。 Steam 部分 安装和更新;因GetInterfaceAddresses()损坏而在Chromium启动时崩溃。 iexplore.exe 部分 简单网站渲染;复杂页面因与Steam相同的根本原因而崩溃。 Factorio 部分 窗口打开但未能加载。 Spooky's Jumpscare Mansion 部分 启动但运行过慢,无法玩。 Noita 部分 启动但运行过慢,无法玩。 Plants vs. Zombies 无法演示 被Steam DRM阻止,无法进入主菜单。 Half-Life 无法演示 Wine的C++运行时发生断言失败。很可能是移植中缺失的实现。 Firefox / Chromium 无法演示 安装程序失败;没有达到可运行状态。 SCP: Containment Breach 无法演示 不启动;原因尚未诊断。 Unity游戏普遍存在问题 无法演示 似乎Astral上的wine-mono存在问题,因为Unity游戏卡在MonoManager ReloadAssembly上。 最后总结 移植Wine是一项有趣的挑战,也是证明爱好操作系统可以用于玩更多游戏的方式,这在爱好操作系统成为可行的日常使用系统的方向上迈出了一步。尽管仍有一些粗糙的边缘,
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡