Windows下有兩大子系統:win32和console
win32
子系統為win32的程序一般都是窗口程序,進程啟動時默認不創建控制台窗口,而是需要GUI線程自己創建窗口,並從自己的消息隊列中不斷地獲取消息、翻譯消息、分發消息、處理消息來維持一個窗口的各種狀態
console
子系統為console的程序是控制台程序,進程啟動時系統會為其創建一個控制台窗口(就是cmd.exe那樣的黑框框),這個黑框框不簡單,它兼容了GUI操作系統出現之前的程序交互模型:stdin、stdout、stderr
win10的linux子系統
前兩個子系統所運行的可執行文件都是Windows自家的PE格式文件,子系統類型記錄在PE文件的一個字段里,系統創建進程時會根據子系統類型初始化相應的程序
linux子系統與前兩個不同,系統創建的進程是原生的linux的ELF格式的可執行文件,而且為其模擬了一個linux的文件系統
不過還是可以在任務管理器里看到所創建的linux進程的ID,這個進程應該是真實地存在於Windows內核里的,服從Windows內核的調度
總結
Windows內核提供系統調用,子系統本質上是一系列函數庫,這些函數封裝了系統調用,向上給應用程序提供相應子系統的二進制界面(API接口)
比如win32子系統最基本的三個函數庫:kernel32.dll、user32.dll、gdi32.dll;console子系統最基本的函數庫:kernel32.dll
linux這個子系統比較復雜,微軟提供的唯二的接口是兩個程序:bash.exe和lxrun.exe。通過前者進入linux子系統的bash shell,后者用來管理子系統(安裝、卸載、更新軟件包)。
通過dumpbin發現bash.exe的子系統還是console(Windows CUI),看來Windows將啟動子系統的所有細節都放在這個bash.exe里了,而它是閉源的,所以具體是怎樣啟動的也不是很清楚(但是也可以通過逆向工程的手段得知)。