關於Windows子系統


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里了,而它是閉源的,所以具體是怎樣啟動的也不是很清楚(但是也可以通過逆向工程的手段得知)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM