Daniel Santos Asked: 2020-02-15 11:32:55 +0800 CST2020-02-15 11:32:55 +0800 CST 2020-02-15 11:32:55 +0800 CST 为什么适用于 Linux 的 Windows 子系统能够运行 Windows *.exe 程序? 772 我在 Windows 10 Home 上使用新的 WLS2。我注意到,当我运行“npm”时,我的 Windows 程序文件中的“npm”被执行,而不是 Linux 版本。 当我尝试从 WSL2 执行 cmd.exe 或 notepad.exe 时,我注意到它们也可以工作! 这怎么可能?WSL2 如何能够运行 Windows 可执行文件? 此外,如果它们具有相同的名称,我如何强制 WSL2 将 Linux 可执行文件优先于 Windows 可执行文件? windows-10 windows 4 个回答 Voted Best Answer Biswapriyo 2020-02-18T21:26:09+08:002020-02-18T21:26:09+08:00 WSL2 如何能够运行 Windows 可执行文件? Windows 可执行文件(PE 二进制文件)作为binfmt_misc条目添加到 WSL2 中。简单来说,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是MZWindows PE 可执行文件的前两个字节。假设这是init(解释器)识别 PE 二进制文件的指纹。 用户可以使用以下命令禁用注册表: echo 0 | sudo tee /proc/sys/fs/binfmt_misc/WSLInterop 进一步阅读: Linux 与 Windows 互操作性的 Windows 子系统 维基百科:binfmt_misc 内核支持杂项(您最喜欢的)二进制格式 v1.1 Chris Dodd 2020-02-15T11:39:41+08:002020-02-15T11:39:41+08:00 它将运行$PATH环境变量中的任何可执行文件(Windows 或 linux)。它按顺序搜索目录,因此如果您想按偏好运行 linux 版本,请确保这些目录在路径中的 windows 目录之前 Arush Agarampur 2020-02-15T11:49:09+08:002020-02-15T11:49:09+08:00 bash 作为 pico 进程运行。当您尝试运行程序时,linux 子系统驱动程序会识别运行进程的请求并ZwCreateUserProcess在 windows 内核中调用,从而创建 windows 进程。 它可以调用该函数,因为 pico 进程进行的所有系统调用都被转换为内核模式下的 NT 调用,无论是 viaLXCORE.SYS还是内核,ntoskrnl.exe. K7AAY 2020-02-15T16:12:07+08:002020-02-15T16:12:07+08:00 为您希望优先于其 Windows 同名的 Linux 应用程序创建一个别名。例如: 别名 foo='/path/to/bar'
Windows 可执行文件(PE 二进制文件)作为binfmt_misc条目添加到 WSL2 中。简单来说,binfmt_misc是一个 Linux 内核功能,它允许识别任意可执行文件格式并将其传递给某些程序。
在 WSL2 中,
init
二进制文件(每个进程都从中派生出)将 Windows PE 二进制文件注册为可执行文件并使其自身可执行(即init
. 这是 PE binfmt 条目的输出:WSLInterop
只是条目的名称。幻数4d5a
是MZ
Windows PE 可执行文件的前两个字节。假设这是init
(解释器)识别 PE 二进制文件的指纹。用户可以使用以下命令禁用注册表:
进一步阅读:
它将运行
$PATH
环境变量中的任何可执行文件(Windows 或 linux)。它按顺序搜索目录,因此如果您想按偏好运行 linux 版本,请确保这些目录在路径中的 windows 目录之前bash 作为 pico 进程运行。当您尝试运行程序时,linux 子系统驱动程序会识别运行进程的请求并
ZwCreateUserProcess
在 windows 内核中调用,从而创建 windows 进程。它可以调用该函数,因为 pico 进程进行的所有系统调用都被转换为内核模式下的 NT 调用,无论是 via
LXCORE.SYS
还是内核,ntoskrnl.exe
.为您希望优先于其 Windows 同名的 Linux 应用程序创建一个别名。例如:
别名 foo='/path/to/bar'