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系统调用通常不是由windows下的软件本身进行的,而是通过对共享系统库\xc2\xb9的正常调用。软件使用的 Windows API 大部分是普通的库 API,并不专注于系统调用(其中大部分被认为是私有的,根本不被不属于 Windows 的软件使用),这使得 Windows 可以实现相当令人印象深刻的长期兼容性。
\n因此,wine 实现了 API,但没有实现 Windows 系统调用 - 它甚至无法做到这一点,它是用户态软件,因此无法捕获软件中断。
\n顺便一提,
\n\n\n只要架构相同,难怪Windows .exe文件可以在Linux系统上运行
\n
低估了调用约定、文件抽象、目标文件格式和许多其他方面的差异。让一个为不同操作系统上使用的接口编写的软件成功运行、与本机系统进行调用并交换内存并不是那么容易的事情。
\n\xc2\xb9 这很像您使用 C 函数(如 )read,通常实现 POSIX/libc 和 Linux API,并且很少自己进行系统调用。你很少会发现有人在syscall(SYS_READ, \xe2\x80\xa6)尝试编写 libc。
葡萄酒仍然不能,而且也不清楚它是否会永远如此。如果您启用了正确的补丁,Wine staging 就可以(实验性地)实现。
\n虽然上述内容对于 WINE 模拟的大多数事物都是正确的,正如 @mbrig 在评论中指出的那样,从ca开始。2019年,wine-staging 确实有能力捕获Windows系统调用。它通过使用 Linux 的seccomp功能来实现这一点。
Seccomp 的发明是为了让进程告诉内核,例如:
\n\n\n嘿,亲爱的内核,我是服务器,我刚刚设置了所有监听套接字。我没有理由进行超出服务网站所需的系统调用,因此,如果我执行除
\nexit、read、write和 以外的任何系统调用sigreturn的任何系统调用,请踢我的二进制底部。
它通过执行prctl系统调用来实现这一点PR_SET_SECCOMP来实现这一点。
由于这有点不灵活,后来添加了进程实际定义一段程序的能力,该程序应该检查系统调用及其参数是否正常。然而,这样的过滤器需要在您制作时定义为 BPF 程序prctl(PR_SET_SECCOMP,\xe2\x80\xa6)。您还可以指定生成的信号处理程序应运行哪个函数。
现在,WINE 可以做到这一点,并且基本上除了检查 WINE 进程内进行的系统调用是否超出用于 Linux 系统调用的范围之外什么也不做。如果不是,则允许系统调用正常进行;如果是,则引发 SIGSYS,并执行单个 Windows 系统调用的调度程序。
\n小问题:据我在官方主线存储库中找到的信息wine,这个补丁还没有进入“最终用户”wine。对于一个补丁来说,3年的时间有点长了,我想这是因为这种方法存在问题(性能影响,以及与安全机制结合使用时的问题),并且可能是也可能不是包含在主线 wine 中的机制,即您称为wine.
| 归档时间: |
|
| 查看次数: |
4039 次 |
| 最近记录: |