72600


WSL(bash)でnotepadを実行したところ、メモ帳が立ち上がりました。

[code]

    $ /mnt/c/Windows/notepad.exe
    
[/code]

straceで確認しましたが、execveでnotepad.exeに成り代わっています。

[code]

    execve("/mnt/c/Windows/notepad.exe", ["/mnt/c/Windows/notepad.exe"], 0x7fffd87e3ac8 /* 14 vars */) = 0
    
[/code]

notepadはLinuxのシステムコールではなくWindowsのシステムコールを使用しているため、動かないと思ったのですが、動いてしまいました。

### 質問

WSLでnotepad.exeが動くのはどうしてでしょうか？


CC BY-SA 4.0
2020-12-12T00:19:19.327
72599
2020-12-31T05:13:58.100
2020-12-31T05:13:58.100
3060
35558
question
windows-10 wsl
WSL 環境から Windows のメモ帳が起動できるのはなぜ？


[Linux からの Windows ツールの実行](https://docs.microsoft.com/ja-
jp/windows/wsl/interop#run-windows-tools-from-linux)
で説明されているようにWSL側からWindowsツールを実行できるように改善されたからでは？


CC BY-SA 4.0
2020-12-12T00:29:15.290
72600
2020-12-12T00:29:15.290
4236
72599
answer


@sayuri さんが書かれているように、Microsoftのこのページに解説されている相互運用性の一環でしょう。  
[Linux との Windows の相互運用性](https://docs.microsoft.com/ja-
jp/windows/wsl/interop#run-windows-tools-from-linux)

> Windows Subsystem for Linux (WSL) は、Windows と Linux 間の統合を継続的に向上させています。
> 次の操作を行います。
>
>   * Windows ツール (つまり、notepad.exe) を Linux コマンド ライン (つまり、Ubuntu) から実行する。
>

まさにnotepad.exeを起動できることが書かれています。  
[Linux からの Windows ツールの実行](https://docs.microsoft.com/ja-
jp/windows/wsl/interop#run-windows-tools-from-linux)

> WSL では、[tool-name].exe を使用して、WSL コマンド ラインから Windows ツールを直接実行することができます。
> たとえば、notepad.exe のように指定します。

ただしその記事の中で、ユーザーから見てどのように振る舞うかは書かれていますが、動作させるための仕組みの詳細は書かれていないので、そのページに紹介されている別の資料を見る必要があるようです。

2016 年からの相互運用性に関する WSL のブログの投稿  
[Windows and Ubuntu Interoperability](https://docs.microsoft.com/ja-
jp/archive/blogs/wsl/windows-and-ubuntu-interoperability)  
[Launching Win32 applications from within WSL](https://docs.microsoft.com/ja-
jp/archive/blogs/wsl/windows-and-ubuntu-interoperability#launching-
win32-applications-from-within-wsl)  
[IO Redirection to Win32](https://docs.microsoft.com/ja-
jp/archive/blogs/wsl/windows-and-ubuntu-interoperability#io-redirection-to-
win32)

英語記事ですが、Google翻訳等で見てみると、[binfmt_misc -
Wikipedia](https://en.wikipedia.org/wiki/Binfmt_misc)という、Windowsで言えば拡張子を基に`assoc.exe`と`ftype.exe`で実行プログラムを関連付けるような仕組みを利用してWindowsアプリケーションを起動させているようです。

そしてファイルアクセスはLinuxのVFSとWindowsのAPIを相互に変換(マーシャリング)する仕組みにて行っているようです。

ちなみにその後WSL2も含めて仕組みを解説しているらしき日本語の記事を見つけました。  
上記記事と個々の説明内容の詳細化レベルに違いがありますが、参考になるでしょう。  
[WSLのアーキテクチャ](https://roy-n-
roy.github.io/Windows/WSL%EF%BC%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A/Architecture/)


CC BY-SA 4.0
2020-12-12T00:38:25.453
72602
2020-12-12T10:33:52.657
2020-12-12T10:33:52.657
26370
26370
72599
answer