为什么Wine可以将Windows系统调用转换为Linux系统调用?

use*_*126 9 windows system-calls wine

只要体系结构相同,Windows .exe 文件可以在 Linux 系统上运行也就不足为奇了(如果它正确加载到 RAM 上)。但Linux和Windows的系统调用完全不同。因此,当 .exe 文件在 Linux 上调用系统调用时,结果将不是我们所期望的。

我认为 Wine 将 Windows 系统调用转换为 Linux 系统调用,但我无法想象如何转换。也许系统调用是通过int、syscall、systenter等实现的。Wine是否通过某种方式直接hook这样的操作?

Mar*_*ler 25

目前正确答案

\n

它不翻译系统调用。

\n

系统调用通常不是由windows下的软件本身进行的,而是通过对共享系统库\xc2\xb9的正常调用。软件使用的 Windows API 大部分是普通的库 API,并不专注于系统调用(其中大部分被认为是私有的,根本不被不属于 Windows 的软件使用),这使得 Windows 可以实现相当令人印象深刻的长期兼容性。

\n

因此,wine 实现了 API,但没有实现 Windows 系统调用 - 它甚至无法做到这一点,它是用户态软件,因此无法捕获软件中断。

\n

顺便一提,

\n
\n

只要架构相同,难怪Windows .exe文件可以在Linux系统上运行

\n
\n

低估了调用约定、文件抽象、目标文件格式和许多其他方面的差异。让一个为不同操作系统上使用的接口编写的软件成功运行、与本机系统进行调用并交换内存并不是那么容易的事情。

\n
\n

\xc2\xb9 这很像您使用 C 函数(如 )read,通常实现 POSIX/libc 和 Linux API,并且很少自己进行系统调用。你很少会发现有人在syscall(SYS_READ, \xe2\x80\xa6)尝试编写 libc。

\n

更好的答案,推测

\n

葡萄酒仍然不能,而​​且也不清楚它是否会永远如此。如果您启用了正确的补丁,Wine staging 就可以(实验性地)实现。

\n

虽然上述内容对于 WINE 模拟的大多数事物都是正确的,正如 @mbrig 在评论中指出的那样,从ca开始。2019年wine-staging 确实有能力捕获Windows系统调用。它通过使用 Linux 的seccomp功能来实现这一点。

\n

Seccomp 的发明是为了让进程告诉内核,例如:

\n
\n

嘿,亲爱的内核,我是服务器,我刚刚设置了所有监听套接字。我没有理由进行超出服务网站所需的系统调用,因此,如果我执行除exitreadwrite和 以外的任何系统调用sigreturn的任何系统调用,请踢我的二进制底部。

\n
\n

它通过执行prctl系统调用来实现这一点PR_SET_SECCOMP来实现这一点。

\n

由于这有点不灵活,后来添加了进程实际定义一段程序的能力,该程序应该检查系统调用及其参数是否正常。然而,这样的过滤器需要在您制作时定义为 BPF 程序prctl(PR_SET_SECCOMP,\xe2\x80\xa6)。您还可以指定生成的信号处理程序应运行哪个函数。

\n

现在,WINE 可以做到这一点,并且基本上除了检查 WINE 进程内进行的系统调用是否超出用于 Linux 系统调用的范围之外什么也不做。如果不是,则允许系统调用正常进行;如果是,则引发 SIGSYS,并执行单个 Windows 系统调用的调度程序。

\n

小问题:据我在官方主线存储库中找到的信息wine,这个补丁还没有进入“最终用户”wine。对于一个补丁来说,3年的时间有点长了,我想这是因为这种方法存在问题(性能影响,以及与安全机制结合使用时的问题),并且可能是也可能不是包含在主线 wine 中的机制,即您称为wine.

\n

  • @wizzwizz4 是的,但现在和可预见的未来,WINE 仍然*不能*!我完全赞成添加信息,但在这一点上,人们似乎没有达成一致的 Linux 机制,也没有任何承诺它最终也会出现在你知道的 WINE 中——或者 WINE 将如何实际实现系统调用修改。只是猜测和(好的)技术研究,但对我来说,作为局外人,这个答案确实不会很快过时,足以保证我们在评论中的讨论之外的更多内容! (5认同)
  • 这可能就是 Wine 代表“Wine Is Not a Emulator”的原因。事情远不止于此。 (4认同)
  • 不过,这种情况即将改变:<https://lwn.net/Articles/824380/>。 (3认同)
  • 抱歉,这个答案并不完全正确。早在 2019 年,wine(-staging) 就[使用 seccomp](https://github.com/wine-staging/wine-staging/commit/595f2f9860adafed612737529745ad24c50acdb9) 来捕获和转换 Windows 系统调用。对更好机制的渴望导致了 [syscall 用户调度](https://docs.kernel.org/admin-guide/syscall-user-dispatch.htm),但我无法判断 wine 是否真的使用了它seccomp 方法尚未完成。 (3认同)