我确实找到了很多关于适用于 Linux 的 Windows 子系统(WSL)适用于MSDN 博客。我知道它基于将 Linux 系统调用实时转换为 NT 系统调用,因此可以运行未修改的 ELF 二进制文件。
WSL 是 NT 子系统,Microsoft POSIX 子系统, 这UNIX 的 Windows 服务 (SFU),以及基于 Unix 的应用程序子系统 (SUA) / Interix。
另一方面,Cygwin 是一个位于 Win32 子系统之上的应用程序。
博客上说程序需要为 SUA 重新编译。由于 SUA(我的理解)是 SFU 的后继者,而 SFU 又是 POSIX 子系统的后继者。因此我认为所有这些也都需要重新编译二进制文件。
如果是这样,那么 WSL 的前身与 Cygwin 有何不同?
我正在寻找前面提到的系统/程序之间的比较以及它们在“幕后”的工作方式。(特别是 WSL 与其后继者的区别)
附言:由于我在 SU 上的声誉限制我只能使用 2 个链接,因此需要暂时删除一些链接
答案1
Interix/SFU/SUA 是一个轻量级子系统,仅替换用户空间Win32 层具有类似 Unix libc 的功能 - 尽管某些任务有一个“子系统驱动程序”(psxss),但它仍然使用 Windows PE(.exe)可执行文件,libc 仍然使用 NT 内核系统调用,Interix 进程几乎完全像 Win32 或本机进程,并且它们具有相同的文件系统访问权限。
Cygwin 类似但更简单;它完全作为用户空间运行时库构建在上面Win32(偶尔会有 NT 调用)。因此,Cygwin 应用程序实际上只是使用非常奇怪的 libc 的 Win32 应用程序。
相比之下,WSL 甚至比 SUA 更广泛——Lxss 驱动程序重新实现了 Linux 内核系统调用而不是用户空间库函数,并且可以运行未修改的 ELF 二进制文件(默认的 WSL 系统是原版 Ubuntu)。WSL 环境基本是自包含的,实际上是一个“用户模式 Linux”虚拟机,与主机操作系统的交互很少。虽然 WSL 进程显示在共享进程树中,但您不能直接运行 /bin/sh——您必须引导整个 WSL 系统,这是在bash.exe
幕后完成的。(有一篇关于此的博客文章。)
答案2
关于 SUA/SFU 和 Interix,它们之间存在差异。Wikipedia 对此进行了非常详尽的解释: Microsoft POSIX 子系统和英特里克
Interix 是基于 POSIX 子系统的一个 BSD 实现。你可以用另一个实现来替换它,比如 GNU Debian 或 NetBSD(已经完成了)。SUA(2005)开放了 POSIX 子系统,因此你可以用 NT 调用来扩展它,甚至可以运行混合的 Posix/Win32 应用程序。
不幸的是,微软从未发布过合适的开发工具,甚至将支持外包。有一个论坛,用户可以在那里互相帮助进行开发和其他事情。支持公司提供了一个包含各种二进制包的存储库。最终,微软停止了资助,当支持公司关闭论坛时,几乎所有关于 Interix 的信息都消失了。
简而言之:SUA Posix 应用程序非常快,可能是 Windows 上运行的最高效的应用程序。但它们的开发过程非常麻烦,需要侵入 NT 和 Posix 系统文件,也就是说,这很有趣。