WSL 的机制,总体上是在运行时将 Linux System Call 翻译为 NT API 调用,从而在 NT 内核基础之上模拟实现 Linux 内核。
WSL 的机制,总体上是在运行时将 Linux 系统调用翻译为 NT API 调用,从而在 NT 内核基础之上模拟实现 Linux 内核。
无论是在 ABI 还是 API 层模拟,Linux/UNIX 与 Windows NT 毕竟是两类内核,设计理念、设计标准等多方面差异甚大,无法实现完全对等模仿,WSL 无法兼容所有 Linux System Call,这就造成有的程序无法在 WSL 中运行。
也许是因为 WSL1 靠翻译 System Call 来模拟 Linux 内核的坑太大填不下去了,这种黑科技思路此次被微软完全抛弃,换成了虚拟机/容器的思路,仅仅是名字上延续了 WSL,再也不是当初那个 WSL 了。WSL2 引入了修改版的 Linux 内核,基于最新的 Linux 4.19,这也是 Linux 内核的长期支持版,新的内核经过了微软悉心改造,以便与 Windows 相配合,获得更好的用户体验。WSL2 将 Linux 内核塞到一个轻量级的虚拟机(Virtual Machine,VM)中运行,使用过程与 WSL1 保持一致,VM 的启动、管理都藏在背后
也许是因为 WSL1 靠翻译 System Call 来模拟 Linux 内核存在诸多问题,这种黑科技思路此次被微软完全抛弃。WSL 2采用了虚拟机的技术,仅仅是名字上延续了 WSL,再也不是当初那个 WSL 了。WSL2 引入了修改版的 Linux 内核,基于 Linux 4.19,这也是 Linux 内核的长期支持版,新的内核经过了微软悉心改造,以便与 Windows 相配合,获得更好的用户体验。WSL2 将 Linux 内核塞到一个轻量级的虚拟机(Virtual Machine,VM)中运行,使用体验基本与 WSL1 保持一致。
使用虚拟机的方式带来了运行效率和兼容性两方面的提升。根据微软自己的测试,与 WSL1 相较,在 WSL2 中解压 zip 文档速度提升了 20 倍,使用 git clone、npm install、cmake 提升大约 2~5 倍。由于使用了真正的 Linux 内核,意味着 WSL2 全面兼容 Linux System Call,理论上能在 GNU/Linux 上运行的程序也都能在 WSL2 中不经修改直接运行。