为什么 Windows Subsystem for Linux 能够运行 Windows *.exe 程序?

为什么 Windows Subsystem for Linux 能够运行 Windows *.exe 程序?

我在 Windows 10 Home 上使用新的 WLS2。我注意到,当我运行“npm”时,执行的是 Windows 程序文件中的“npm”,而不是 Linux 版本。

当我尝试从 WSL2 执行 cmd.exe 或 notepad.exe 时,我注意到它们也有效!

这怎么可能?WSL2 如何能够运行 Windows 可执行文件?

此外,如果 Linux 可执行文件和 Windows 可执行文件同名,我该如何强制 WSL2 优先考虑 Linux 可执行文件而不是 Windows 可执行文件?

答案1

WSL2 如何运行 Windows 可执行文件?

Windows 可执行文件(PE 二进制文件)被添加为binfmt_miscWSL2 中的条目。简而言之,binfmt_misc是 Linux 内核的一项功能,它允许识别任意可执行文件格式并将其传递给某些程序。

在 WSL2 中,init二进制文件(每个进程都从中分叉)将 Windows PE 二进制文件注册为可执行文件,并使其自身可执行(即init)。这是 PE binfmt 条目的输出:

cat /proc/sys/fs/binfmt_misc/WSLInterop
enabled
interpreter /tools/init
flags: F
offset 0
magic 4d5a

WSLInterop只是条目的名称。魔数4d5a是Windows PE 可执行文件的前两个字节。假设这是(解释器)识别 PE 二进制文件MZ的指纹。init

用户可以使用此命令暂时(直到 WSL 重新启动)禁用注册表:

echo 0 | sudo tee /proc/sys/fs/binfmt_misc/WSLInterop

进一步阅读:

答案2

它将运行环境变量中的任何可执行文件(Windows 或 Linux)$PATH。它会按顺序搜索目录,因此,如果您想按偏好运行 Linux 版本,请确保这些目录是路径中的 Windows 目录

答案3

bash 作为 pico 进程运行。当您尝试运行程序时,linux 子系统驱动程序会识别运行进程的请求并调用ZwCreateUserProcesswindows 内核,从而创建 windows 进程。

它可以调用该函数,因为 pico 进程进行的所有系统调用都被转换为内核模式下的 NT 调用,无论是通过LXCORE.SYS还是内核ntoskrnl.exe

答案4

创建一个别名您希望优先于 Windows 同名应用程序的 Linux 应用程序。例如:

别名 foo='/path/to/bar'

相关内容